赞
踩
Client:客户端
通常大型 Hadoop 集群是以机架的形式来组织的,同一个机架上的不同节点间的网络状况比不同机架之间的更为理想,NameNode 设法将数据块副本保存在不同的机架上以提高容错性。
HDFS 不能够自动判断集群中各个 DataNode 的网络状况情况,Hadoop 允许集群的管理员通过配置 net.topology.script.file.name 参数来确定节点所处的机架,配置文件提供了 ip 到 rackid 的翻译。NameNode 通过这个配置知道集群中各个 DataNode 机器的 rackid。如果 net.topology.script.file.name 没有设定,则每个 ip 都会被翻译成 /default-rack。机器感知如下图所示:
图中的 D 和 R 是交换机,H 是 DataNode,则 H1 的 rackid = /D1/R1/H1,有了 rackid 信息(这些 rackid 信息可以通过 net.topology.script.file.name 配置)就可以计算出任意两台 DataNode 之间的距离。
distance(/D1/R1/H1 , /D1/R1/H1) = 0 相同的 DataNode
distance(/D1/R1/H1 , /D1/R1/H2) = 2 同 rack 下的不同 DataNode
distance(/D1/R1/H1 , /D1/R2/H4) = 4 同 IDC 下的不同 DataNode
distance(/D1/R1/H1 , /D2/R3/H7) = 6 不同 IDC 下的 DataNode
说明:
当没有配置机架信息时,所有的机器 Hadoop 都在同一个默认的机架下,名为 “/defult-rack”,这种情况的任何一台 DataNode 机器,bug物理上是否属于同一个机架,都会被认为是在同一个机架下。
一旦配置 net.topology.script.file.name,就按照网络拓扑结构来寻找 DataNode:net.topology.script.file.name 这个配置选项的 value 指定为一个可执行程序,通常为一个脚本。
默认情况下,hadoop 的机架感知是没有被启用的。所以,在通常情况下,hadoop 集群的 HDFS 在选机器的时候,是随机选择的。
也就是说,如果实际节点不完全在相同的机架,但是又没有配置机架感知很有可能在写数据时:
hadoop 将第一块数据 block1 写到了 rack1 上,然后随机的选择下将 block2 写入到了 rack2 下,此时两个 rack 之间产生了数据传输的流量,再接下来,在随机的情况下,又将 block3 重新又写回了 rack1,此时,两个 rack 之间又产生了一次数据流量。在 job 处理的数据量非常的大,或者往 hadoop 推送的数据量非常大的时候,这种情况会造成 rack 之间的网络流量成倍的上升,成为性能的瓶颈,进而影响作业的性能以至于整个集群的服务。
不同节点之间的通信能够尽量发生在同一个机架之内,而不是跨机架;
为了提高容错能力,DataNode 会尽可能把数据块的副本放到多个机架上。
在HDFS写数据的过程中,NameNode会选择距离待上传数据最近距离的DataNode接收数据
节点距离:两个节点到达最近的共同祖先的距离总和
如图,图中标红的n-1和n-2的共同祖先为集群d1
n-1到其机架r2的距离为1,机架r2到集群d1的距离为1
n-2到其机架r3的距离为1,机架3到集群d1的距离为1
所以,两节点之间的距离为1+1+1+1=4
副本节点选择
第一个副本在Client所处的节点上,如果客户端在集群外,随机选择一个
第二个副本在另一个机架的随机节点
第三个副本在第二个副本所处机架的随机节点
(1)客户端通过DistributedFileSystem向NameNode请求下载文件,NameNode首先会判断权限并检查是否有对应的数据,如果符合,NameNode通过查询元数据,找到文件块所在的DataNode地址返回个客户端
(2)创建FSDataInputStream,挑选一台DataNode(就近原则)服务器,如果该服务器访问量太大,会随机访问其他节点,请求读取数据
(3)DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)
(4)客户端以Packet为单位接收,先在本地缓存,然后写入目标文件,是串行读,即读取文件的某一块后,再读其他的部分进行追加组成完整的数据
(1)一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳
(2)DataNode启动后向NameNode注册,通过后,周期性(6小时)的向NameNode上报所有的块信息
(3)心跳DN向NN发送,每3秒一次,收到心跳返回带有NameNode给该DataNode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟+30秒没有收到某个DataNode的心跳,则认为该节点不可用
(4)集群运行中可以安全加入和退出一些机器
DataNode数据完整性
如果电脑磁盘里面存储的数据是控制高铁信号灯的红灯信号(1)和绿灯信号(0),但是存储该数据的磁盘坏了,一直显示是绿灯,是否很危险?同理DataNode节点上的数据损坏了,却没有发现,是否也很危险,那么如何解决呢?
DataNode节点保证数据完整性的方法如下
(1)当DataNode读取Block的时候,它会计算CheckSum,HDFS写入的时候计算出校验和,然后每次读的时候再计算校验和
(2)如果计算后的CheckSum,与Block创建时值不一样,说明Block已经损坏
(3)Client读取其他DataNode上的Block
(4)常见的校验算法crc(32),md5(128),sha1(160)
(5)DataNode在其文件创建后周期验证CheckSum
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。