zoukankan      html  css  js  c++  java
  • [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

  • 相关阅读:
    RADAR毫米波雷达传感器
    固态LiDAR,半固态混合LiDAR,机械LiDAR
    Lidar激光雷达市场
    echarts 环形图中自定义文字
    uni-app base64 无法显示问题
    实战二(上):针对非业务的通用框架开发,如何做需求分析和设计?
    实战一(下):如何实现一个遵从设计原则的积分兑换系统?
    实战一(上):针对业务系统的开发,如何做需求分析和设计?
    学而不记,不学无异 -- English learning
    springmvc 传入返回参数更改
  • 原文地址:https://www.cnblogs.com/xuxm2007/p/2586923.html
Copyright © 2011-2022 走看看