[hadoop源码阅读][8]datanodeBlockSender,BlockReceiver

BlockSender 

在DataNode节点上,主要有四个地方会用到数据块发送器BlockSender:

1.当用户向HDFS读取某一个文件时,客户端会根据数据所在的位置转向到具体的DataNode节点请求对应数据块的数据,此时DataNode节点会用BlockSender向该客户端发送数据;

2.当NameNode节点发现某个Block的副本不足时,它会要求某一个存储了该Block的DataNode节点向其它DataNode节点复制该Block,当然此时仍然会采用流水线的复制方式,只不过数据来源变成了一个DataNode节点;

3.HDFS开了一个调节DataNode负载均衡的工具Balacer,当它发现某一个DataNode节点存储的Block过多时,就会让这个DataNode节点转移一部分Blocks到新添加到集群的DataNode节点或者存储负载轻的DataNode节点上;

4.DataNode节点在后台开启了一个用于对存储的所有Block进行扫描验证的后台线程,它会定期的利用BlockSender来检查一个Block的数据是否损坏了。

     在前面三个场景下,DataNode节点在发送数据时不会对数据进行校验和验证,而是交给了接收端来验证数据的可靠性,这是因为即使在发送端验证正确,但经过网络传输也会发送错误,就不如索性交由接收端来验证;第四个就不同了,因为此时根本就没有接收端,必须在发送数据之前对其进行校验和的验证。

       BlockSender用数据包的方式向接收端发送数据,一个数据包可能包含若干个校验数据块,但它并不需要接收端发送对数据包的确认帧,自己也不接受这些确认帧。一个数据包的格式如下:

0_1326196353Ed99

packetLen:数据包长度;

offset:数据包中的数据在Block中的开始位置;

seqno:数据包的编号;

endFlag:是否没有数据包标志(0/1);

len:数据包中数据的长度;

chunksum:一个校验和;

datachunk:一个校验数据块;

BlockReceiver

DataNode节点是按照数据包的方式来发送Block数据的,所以接收端的DataNode也就要按照数据包的方式接受Block的数据了,然后呢,它又是按照数据包的方式把接收到的一个个数据包发往下一个DataNode节点,同时它还要在接收到pipe之后所有的DataNode节点对该packet的确认帧之后连同自己对该packet确认帧一起发送给发送端,如下图所示:

0_1326354968AQgk

代码挺复杂,还是自己看代码吧.

 DataBlockScanner

HDFS提供了下面两种数据检验方式,以此来保证数据的完整性,而且这两种检验方式在DataNode节点上是同时工作的:

一.校验和

检测损坏数据的常用方法是在第一次进行系统时计算数据的校验和,在通道传输过程中,如果新生成的校验和不完全匹配原始的校验和,那么数据就会被认为是被损坏的。

二.数据块检测程序(DataBlockScanner)

     在DataNode节点上开启一个后台线程,来定期验证存储在它上所有块,这个是防止物理介质出现损减情况而造成的数据损坏。

DataBlockScanner是作为DataNode的一个后台线程工作的,跟着DataNode一块启动,它的工作流程如下:

0_1326105711bRPk

与扫描相关的参数有:

  • 最大扫描速度是8 MB/s,通过BlockTransferThrottler来限制流量
  • 最小扫描速度是1 MB/s
  • 默认扫描周期是3周,扫描周期可通过配置${dfs.datanode.scan.period.hours}来设置

与扫描日志相关的参数有:

  • 日志文件名前缀是dncp_block_verification.log
  • 共有两个日志:当前日志,文件后缀是.curr;前一个日志,文件后缀是.prev
  • minRollingPeriod:日志最小滚动周期是6小时
  • minWarnPeriod:日志最小警告周期是6小时,在一个警告周期内只有发出一个警告
  • minLineLimit:日志最小行数限制是1000

采用滚动日志方式,只有当前行数curNumLines超过最大行数maxNumLines,并且距离上次滚动日志的时间
超过minRollingPeriod时,才将dncp_block_verification.log.curr重命名为dncp_block_verification.log.prev,将新的日志写到dncp_block_verification.log.curr中。

参考url

http://blog.csdn.net/xhh198781/article/details/7196392

http://blog.csdn.net/xhh198781/article/details/7191426

http://caibinbupt.iteye.com/blog/286650

http://blog.jeoygin.org/2012/03/hdfs-source-analysis-datanode-datablockscanner.html

原文地址:https://www.cnblogs.com/xuxm2007/p/2586923.html