1.HDFS相关概念和特性

1.1HDFS设计思路

HDFS被设计成用来使用低廉的服务器来进行海量数据的存储,主要是涵盖了下面2个思想

  1. 大文件被切割成小文件,使用分而治之的思想让很多服务器对同一个文件进行联合管理

  2. 每个小文件做冗余备份,并且分散存到不同的服务器,做到高可靠不丢失[外链HDFS原理解析_分布式

1.2HDFS架构

主节点 Namenode:集群老大,掌管文件系统目录树,处理客户端读且请求 SecondaryNamenode:严格说并不是 namenode 备份节点,主要给 namenode 分担压力之用 从节点 Datanode:存储整个集群所有数据块,处理真正数据读写

HDFS原理解析_hadoop_02

1.3概念和特性

首先,它是一个文件系统,用于存储文件,通过统一的命名空间——目录树来定位文件 其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器都有各自清晰的角色定位

重要特性如下:

  1. HDFS 中的文件在物理上是分块存储(block),块的大小可以通过配置参数(dfs.blocksize) 来规定,默认大小在 hadoop2.x 版本中是 128M,老版本中是 64M
  2. HDFS 文件系统会给客户端提供一个统一的抽象目录树,客户端通过路径来访问文件,形 如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data hdfs://hadoop02:9000/soft/hadoop-2.6.5-centos-6.7.tar.gz
  3. 目录结构及文件分块位置信息(元数据)的管理由 namenode 节点承担 namenode 是 HDFS 集群主节点,负责维护整个 hdfs 文件系统的目录树,以及每一个路径(文 件)所对应的 block 块信息(block 的 id,及所在的 datanode 服务器)
  4. 文件的各个 block 的存储管理由 datanode 节点承担 datanode 是 HDFS 集群从节点,每一个 block 都可以在多个 datanode 上存储多个副本(副本 数量也可以通过参数设置dfs.replication,默认是 3)
  5. HDFS 是设计成适应一次写入,多次读出的场景,且不支持文件的修改

2.HDFS优缺点

2.1HDFS优点

  1. 可构建在廉价机器上:通过多副本提高可靠性,提供了容错和恢复机制

  2. 高容错性:数据自动保存多个副本,副本丢失后,自动恢复

  3. 适合批处理:移动计算而非数据,数据位置暴露给计算框架

  4. 适合大数据处理:GB、TB、甚至 PB 级数据,百万规模以上的文件数量,10K+节点规模

  5. 流式文件访问:一次性写入,多次读取,保证数据一致性

2.2HDFS 缺点

  1. 低延迟数据访问:比如毫秒级 低延迟与高吞吐率

  2. 小文件存取:占用 NameNode 大量内存 150b* 1000W = 15E,1.5G 寻道时间超过读取时间

  3. 并发写入、文件随机修改:一个文件只能有一个写者 仅支持 append

  4. 元信息存储在 NameNode 内存中:一个节点的内存是有限的

  5. HDFS 不适合存储小文件:存取大量小文件消耗大量的寻道时间:类比拷贝大量小文件与拷贝同等大小的一个大文件 NameNode 存储 block 数目是有限的:一个 block 元信息消耗大约 150 byte 内存 存储 1 亿个 block,大约需要 20GB 内存 如果一个文件大小为 10K,则 1 亿个文件大小仅为 1TB(但要消耗掉 NameNode 20GB 内存)

3.HDFS核心设计

3.1HADOOP心跳机制

  1. Hadoop 是 Master/Slave 结构,Master 中有 NameNode 和 ResourceManager,Slave 中有 Datanode 和 NodeManager
  2. Master 启动的时候会启动一个 IPC(Inter-Process Comunication,进程间通信)server 服 务,等待 slave 的链接
  3. Slave 启动时,会主动链接 master 的 ipc server 服务,并且每隔 3 秒链接一次 master,这 个间隔时间是可以调整的,参数为 dfs.heartbeat.interval,这个每隔一段时间去连接一次 的机制,我们形象的称为心跳。Slave 通过心跳汇报自己的信息给 master,master 也通 过心跳给 slave 下达命令
  4. NameNode 通过心跳得知 Datanode 的状态 ResourceManager 通过心跳得知 NodeManager 的状态
  5. 如果 master 长时间都没有收到 slave 的心跳,就认为该 slave 挂掉了。
Namenode 感知到 Datanode 掉线死亡的时长计算:
HDFS默认的超时时间为10分钟+30秒。
这里暂且定义超时时间为 timeout
计算公式为:
timeout = 2*heartbeat.recheck.interval+10*dfs.heartbeat.interval
而默认的heartbeat.recheck.interval大小为 5 分钟,dfs.heartbeat.interval 默认的大小为 3 秒。需要注意的是 hdfs-site.xml 配置文件中的 heartbeat.recheck.interval 的单位为毫秒,dfs.heartbeat.interval的单位为秒。所以,举个例子,如果 heartbeat.recheck.interval 设置为 5000(毫秒),dfs.heartbeat.interval设置为 3(秒,默认),则总的超时时间为 40 秒
<property>
 <name>heartbeat.recheck.interval</name>
 <value>5000</value>
</property>
<property>
 <name>dfs.heartbeat.interval</name>
 <value>3</value>
</property>

3.2HDFS安全模式

集群启动后,可以查看目录,但是上传文件时报错,打开web页面可看到namenode 正处于 safemode 状态,怎么处理?

safemode 是 namenode 的一种状态(active/standby/safemode 安全模式) namenode 进入安全模式的原理:

  1. namenode 发现集群中的 block 丢失率达到一定比例时(0.1%),namenode 就会进入 安全模式,在安全模式下,客户端不能对任何数据进行操作,只能查看元数据信息(比如 ls/mkdir) 这个丢失率是可以手动配置的,默认是 dfs.safemode.threshold.pct=0.999f

  2. 如何退出安全模式?

    a.找到问题所在,进行修复(比如修复宕机的 datanode)

    b.或者可以手动强行退出安全模式(但是并没有真正解决问题)

    在 hdfs 集群正常冷启动时,namenode 也会在 safemode 状态下维持相当长的一段时间,此时你不需要去理会,等待它自动退出安全模式即可

    正常启动的时候进入安全的原理:

    namenode 的内存元数据中,包含文件路径、副本数、blockid,及每一个 block 所在 datanode 的信息,而 fsimage 中,不包含 block 所在的 datanode 信息,那么,当 namenode 冷启动时,此时内存中的元数据只能从 fsimage 中加载而来,从而就没有 block 所在的 datanode 信息——>就会导致 namenode 认为所有的 block 都已经丢失——>进入安全模式— —>datanode 启动后,会定期向 namenode 汇报自身所持有的 blockid 信息,——>随着 datanode 陆续启动,从而陆续汇报 block 信息,namenode 就会将内存元数据中的 block 所 在 datanode 信息补全更新——>找到了所有 block 的位置,从而自动退出安全模式

3.3HDFS副本存放策略

  1. 作用: 数据分块存储和副本的存放,是保证可靠性和高性能的关键
  2. 方法: 将每个文件的数据进行分块存储,每一个数据块又保存有多个副本,这些数据块副本分 布在不同的机器节点上

HDFS原理解析_分布式_03

  1. 存放说明: 在多数情况下,HDFS 默认的副本系数是 3 Hadoop 默认对 3 个副本的存放策略如下图:其中 Block1,Block2,Block3 分别表示 Block 的三个副本
    HDFS原理解析_Hadoop_04

    第一个 block 副本放在和 client 所在的 node 里(如果 client 不在集群范围内,则这第一个 node 是随机选取的,系统会尝试不选择哪些太满或者太忙的 node)。

    第二个副本放置在与第一个节点不同的机架中的 node 中(近乎随机选择,系统会尝试不选 择哪些太满或者太忙的 node)。

    第三个副本和第二个在同一个机架,随机放在不同的 node 中。

3.4机架感知

机架感知告诉 Hadoop 集群中哪台机器属于哪个机架

Hadoop 对机架的感知并非是自适应的,亦即,hadoop 集群分辨某台 slave 机器是属于哪个 rack 并非是智能感知的,而是需要 hadoop的管理者人为的告知 hadoop 哪台机器属于哪个 rack,这样在 hadoop的 namenode 启动初始化时,会将这些机器与 rack 的对应信息保存在内存中,用来作为对接下来所有的 HDFS 的写块操作分配 datanode列表时(比如 3 个 block 对应三台 datanode)的选择 datanode 策略,尽量将三个副本分布到不同的 rack。

一般在Hadoop 集群规模很大的情况下才会涉及到机架感知。

机架感知需要考虑的情况:

a.不同节点之间的通信能够尽量发生在同一个机架之内,而不是跨机架

b.为了提高容错能力,名称节点会尽可能把数据块的副本放到多个机架上。

在默认情况下,HDFS集群是没有机架感知的,也就是说所有服务器节点在同一个默认机架中。那也就意味着客户端在上传数据的时候,HDFS集群是随机挑选服务器节点来存储数据块的三个副本的。
那么假如,datanode1和datanode3在同一个机架rack1,而datanode2在第二个机架rack2,那么客户端上传一个数据块block_001,HDFS将第一个副本存放在dfatanode1,第二个副本存放在datanode2,那么数据的传输已经跨机架一次(从rack1到rack2),然后HDFS把第三个副本存datanode3,此时数据的传输再跨机架一次(从rack2到rack1)。显然,当HDFS需要处理的数据量比较大的时候,那么没有配置机架感知就会造成整个集群的网络带宽的消耗非常严重。

3.5网络拓扑机器之间的距离

这里基于一个网络拓扑案例,介绍在复杂的网络拓扑中 hadoop 集群每台机器之间的距离
HDFS原理解析_hadoop_05
有了机架感知,NameNode 就可以画出上图所示的 datanode 网络拓扑图。D1,R1 都是交换机,最底层是 datanode。则 H1 的rackid=/D1/R1/H1,H1 的 parent 是 R1,R1 的是 D1。这些 rackid信息可以通过 topology.script.file.name 配置。有了这些 rackid 信息就可以计算出任意两台 datanode 之间的距离。distance1.(/D1/R1/H1,/D1/R1/H1)=0 相同的 datanode2.distance(/D1/R1/H1,/D1/R1/H2)=2 同一 rack 下的不同 datanode3.distance(/D1/R1/H1,/D1/R1/H4)=4 同一 IDC(互联网数据中心(机房))下的不同 datanode4.distance(/D1/R1/H1,/D2/R3/H7)=6 不同 IDC 下的 datanode

3.6负载均衡

机器与机器之间磁盘利用率不平衡是 HDFS 集群非常容易出现的情况 尤其是在 DataNode 节点出现故障或在现有的集群上增添新的 DataNode 的时候分析数据块 分布和重新均衡 DataNode 上的数据分布的工具

命令:

sbin/start-balancer.sh sbin/start-balancer.sh -threshold 5 

自动进行均衡非常慢,一天能移动的数据量在 10G-10T 的级别,很难满足超大集群的需求

原因:HDFS 集群默认不允许 balance 操作占用很大的网络带宽,这个带宽是可以调整的 hdfs dfsadmin -setBalanacerBandwidth newbandwidth hdfs dfsadmin -setBalanacerBandwidth 10485760 该数值的单位是字节,上面的配置是 10M/s,默认是 1M/s 另外,也可以在 hdfs-site.xml 配置文件中进行设置:

<property>
<name>dfs.balance.bandwidthPerSec</name>
<value>10485760</value>
<description> Specifies the maximum bandwidth that each datanode can utilize for the
balancing purpose in term of the number of bytes per second. </description>
</property>
sbin/start-balancer.sh -t 10%

注意:机器容量最高的那个值和最低的那个值得差距不能超过10%