1 HDFS block块
-
HDFS3.x上的文件,以128M(不足128M的以实际大小存储)为单位,切分成一个个block,分散的存储在集群的不同数据节点datanode上
-
采用的是3副本技术
-
设置指定文件(例如:test)副本数
hdfs dfs -setrep -R 4 /test
- 查看文件的块信息
hdfs fsck /test -files -blocks -locations
2 HDFS体系架构
HDFS有metadata(元数据),其存储在nameNode的内存中。
- 管理节点(nameNode),负责管理文件系统和命名空间,存放HDFS的元数据。
- 元数据:文件系统树、所有的文件和目录、每个文件的块列表、块所在的dataNode等信息。
- 文件、block、目录占用大概150Byte的元数据,所以HDFS适合存储大文件,不适合存储小文件。
- 元数据信息以命名空间镜像文件fsimage和编辑日志(edits log)的方式保存;其中,fsimage是指元数据镜像文件,保存了文件系统的目录树信息以及文件和块的对应关系;edits log是日志文件,保存文件系统的更改记录。
3 HDFS副本存储策略
第一副本:存储在上传文件的DataNode上;如果是集群外上传,则随机挑选一台磁盘不太慢、CPU不太忙的DataNode节点上;
第二副本:存储在与第一个副本不同的机架的节点上;
第三副本:存储在与第二个副本相同机架的不同节点上;
如果还有更多的副本:随机放在节点中;
注意
- HDFS中存储的文件的副本数由上传文件时设置的副本数决定。无论以后怎么更改系统副本系数,这个文件的副本数都不会改变。
- 在上传文件时优先使用CLI中指定的副本数,如果CLI没有指定则使用hdfs-site.xml中dfs.replication设置的默认值。
4 HDFS机制
4.1 HDFS心跳机制
HDFS心跳机制的工作原理
- master启动的时候,会开启一个ipc server。
- slave启动后连接master,每隔3秒钟向master发送一个“心跳”并携带状态信息。
- master通过这个心跳的返回值,向slave节点传达指令。
HDFS心跳机制的作用
- NameNode负责数据块的复制,它周期性的接收集群中的每个DataNode发送过来的心跳信号和块状态报告(Blockreport)。NameNode可以接收到DataNode的心跳信号,则意味着该DataNode节点工作正常。块状态报告包含DataNode上所有数据块的列表。
- DataNode启动成功后注册到NameNode上,注册成功后,DataNode周期性(1小时)的向NameNode上报所有块列表。DataNode每3秒向NameNode发送一次心跳,同时返回NameNode给该DataNode的命令(如:复制块数据到另一台机器,或删除某个数据块)。如果NameNode超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用。
- hadoop集群刚启动时,会进入安全模式(99.9%=启动的block个数/全部的block个数),这时就用到了心跳机制。
元数据存储在NameNode的内存中,其带来的问题的解决办法
Secondary NameNode 从Primary NameNode取回fsimage和edits,然后将两者合并成fsimage.ckpt文件并传输到Primary NameNode中,然后把fsimage.ckpt文件持久化到Primary NameNode的硬盘上成为fsimage文件,新发生的edits也会持久化到硬盘上。如果Primary NameNode发生宕机重启后会把两者都加载到其内存,从而保证元数据的不丢失。
4.2 HDFS负载均衡
负载均衡简介
Hadoop的HDFS集群非常容易出现机器与机器之间磁盘利用率不平衡的情况,例如:当集群内新增、删除节点,或者某个节点机器内硬盘存储达到饱和值。当数据不平衡时,Map任务可能会分配到没有存储数据的机器,这将导致网络带宽的消耗,也无法很好的进行本地计算。当HDFS负载不均衡时,需要对HDFS进行数据的负载均衡调整,即对各节点机器上数据的存储分布进行调整。从而,让数据均匀的分布在各个DataNode上,均衡IO性能,防止热点的发生。进行数据的负载均衡调整,必须要满足如下原则:
- 数据平衡不能导致数据块减少,数据块备份丢失
- 管理员可以中止数据平衡进程
- 每次移动的数据量以及占用的网络资源,必须是可控的
- 数据均衡过程,不能影响namenode的正常工作
HDFS数据负载均衡原理
数据均衡过程的核心是一个数据均衡算法,该数据均衡算法将不断迭代数据均衡逻辑,直至集群内数据均衡为止。该数据均衡算法每次迭代的逻辑步骤如下:
- 数据均衡服务(Rebalancing Server)首先要求 NameNode 生成 DataNode 数据分布分析报告,获取每个DataNode磁盘使用情况。
- Rebalancing Server汇总需要移动的数据分布情况,计算具体数据块迁移路线图。数据块迁移路线图,确保网络内最短路径。
- 开始数据块迁移任务,Proxy Source Data Node复制一块需要移动的数据块。
- 将复制的数据块复制到目标DataNode上。
- 删除原始数据块。
- 目标DataNode向Proxy Source Data Node确认该数据块迁移完成。
- Proxy Source Data Node向Rebalancing Server确认本次数据块迁移完成。然后继续执行这个过程,直至集群达到数据均衡标准。
DataNode分组
在上述的第2步中,HDFS会把当前的DataNode节点,根据阈值的设定情况划分到Over、Above、Below、Under四个组中。在移动数据块的时候,Over组、Above组中的块向Below组、Under组移动。四个组定义如下:
- Over组 :此组中的DataNode的均满足DataNode_usedSpace_percent > Cluster_usedSpace_percent + threshold
- Above组 :此组中的DataNode的均满足Cluster_usedSpace_percent + threshold > DataNode_ usedSpace _percent >Cluster_usedSpace_percent
- Below组 :此组中的DataNode的均满足Cluster_usedSpace_percent > DataNode_ usedSpace_percent > Cluster_ usedSpace_percent – threshold
- Under组 :此组中的DataNode的均满足Cluster_usedSpace_percent – threshold > DataNode_usedSpace_percent
HDFS 数据自动平衡脚本使用方法
在Hadoop中,包含一个start-balancer.sh脚本,通过运行这个工具,启动HDFS数据均衡服务。该工具可以做到热插拔,即无须重启计算机和 Hadoop 服务。$HADOOP_HOME/sbin/
目录下的start−balancer.sh
脚本就是数据均衡服务的启动脚本。启动命令为:$HADOOP_HOME/sbin/start-balancer.sh
,该命令的使用实例如下:
#启动数据均衡,默认阈值为 10%
$Hadoop_home/sbin/start-balancer.sh
#启动数据均衡,阈值 5%
$Hadoop_home/sbin/start-balancer.sh –threshold 5
#停止数据均衡
$Hadoop_home/bin/stop-balancer.sh
-
影响Balancer的几个参数
-
-threshold
- 默认设置:10,参数取值范围:0-100
- 参数含义:判断集群是否平衡的阈值。理论上,该参数设置的越小,整个集群就越平衡
-
dfs.balance.bandwidthPerSec
- 默认设置:1048576(1M/S)
- 参数含义:Balancer运行时允许占用的带宽
-
-
在hdfs-site.xml文件中可以设置数据均衡占用的网络带宽限制
<property>
<name>dfs.balance.bandwidthPerSec</name>
<value>1048576</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>