心跳机制

   作用:告诉主节点自己的存活状态,10分钟30s后被判定为死亡状态。

hadoop dfsadmin -report 

   命令查看集群状态,需要一段时间才能看到datanode的正确状态,目前集群需要十分钟左右才判断出datanode的dead状态;
image.png

  datanode每隔3秒向namenode发送一次心跳报告,告诉其自己的存活状态默认情况下心跳间隔的参数由hdfs-default.xml中的下面参数决定:

<property>
  <name>dfs.heartbeat.interval</name>
  <value>3</value>
  <description>Determines datanode heartbeat interval in seconds.</description>
</property>

   datanode每隔3秒向namenode发送一次心跳报告,当namenode连续10次没有收到datanode的心跳报告,会觉得datanode可能死了,并没有断定死了,此时namenode向datanode主动发送一次检查,发送一次检查的时间时5分钟,由hdfs.default.xml中的下面属性决定。

<property>
  <name>dfs.namenode.heartbeat.recheck-interval</name>
  <value>300000</value>
  <description>
    This time decides the interval to check for expired datanodes.
    With this value and dfs.heartbeat.interval, the interval of
    deciding the datanode is stale or not is also calculated.
    The unit of this configuration is millisecond.
  </description>
</property>

    如果一次检查没有返回信息,这时候namenode会再进行一次检查,如果还是没有读取不到datanode的信息,此时判定死亡。也就是说namenode最终判断datanode死亡需要103s+25min=630s,也就是说namenode在连续630s中没有得到datanode的信息才认为当前的datanode宕机。
   

机架感知策略

机架感知:
    默认情况下,Hadoop机架感知是没有启用的,需要在NameNode机器的hadoop-site.xml里配置一个选项,例如:

<property>  
    <name>topology.script.file.name</name>
    <value>/xxx</value>
</property>

    这个配置选项的value指定为一个可执行程序,通常为一个脚本,该脚本接受一个参数,输出一个值。接受的参数通常为datanode机器的ip地址,而输出的值通常为该ip地址对应的datanode所在的rackID,例如”/rack1”。Namenode启动时,会判断该配置选项是否为空,如果非空,则表示已经启用机架感知的配置,此时namenode会根据配置寻找该脚本,并在接收到每一个datanode的heartbeat时,将该datanode的ip地址作为参数传给该脚本运行,并将得到的输出作为该datanode所属的机架,保存到内存的一个map中。

官网脚本地址:机架感知脚本
Sample 1: Script with datafile
Topology Script
A sample Bash shell script:


HADOOP_CONF=/etc/hadoop/conf 

while [ $# -gt 0 ] ; do
  nodeArg=$1
  exec< ${HADOOP_CONF}/topology.data 
  result="" 
  while read line ; do
    ar=( $line ) 
    if [ "${ar[0]}" = "$nodeArg" ] ; then
      result="${ar[1]}"
    fi
  done 
  shift 
  if [ -z "$result" ] ; then
    echo -n "/default/rack "
  else
    echo -n "$result "
  fi
done 

Topology data

hadoopdata1.ec.com     /dc1/rack1
hadoopdata1            /dc1/rack1
10.1.1.1               /dc1/rack2

    

写数据流程

正常写数据流程

客户端负责切片,一个block根据namenode返回的3台机器信息,向这三台机器建立pipeline(数据流管道),逐级返回给客户端,客户端开始以packet(64KB)为单位边上传边切分,先写缓存,缓存接收到一个package后,向下一个节点传递,同时将缓存中的数据写到磁盘中。

异常写数据流程

上传过程中如果有某个节点块上传失败,hdfs会立即进行一次重试,如果还失败,将失败节点从pipeline中删除,并将失败的节点报告给namennode。hdfs最多可以忍受至少只有一个节点上传成功,如果3个节点都失败,这时候会向namenode重新申请,重新构建pipeline。最终保证至少有一份上传成功,剩下的副本在集群上传成功后进行异步复制来的。

写操作相关配置

1)配置参数:dfs.blocksize
参数说明:客户端数据分块的大小
默认值:134217728(128M);单位:字节
(2)dfs.client-write-packet-size
参数说明:客户端写入数据时packet数据包的大小
默认值:65536(64K),单位字节
(3)dfs.bytes-per-checksum
参数说明:chunk(写入数据时最小的一个单位),数据校验的粒度
默认值:512字节
注:事实上一个chunk还包含4B的校验值,因而chunk写入packet时是516B;数据与检验值的比值为128:1,所以对于一个128M的block会有一个1M的校验文件与之对应;

    

4. 降副本后删除冗余数据时间

block的上报间隔默认是6小时。

hadoop fsck filepath -files -blocks -racks #查看副本和block块信息

Datanode会定期将当前该结点上所有的BLOCK信息报告给Namenode,
参数dfs.blockreport.intervalMsec就是控制这个报告间隔的参数。

hdfs-site.xml文件中有一个参数:

<property>
  <name>dfs.blockreport.intervalMsec</name>
  <value>21600000</value>
  <description>Determines block reporting interval in milliseconds.</description>
</property>

注:hadoop版本为hadoop-3.1.3
    

5. 元数据合并的过程(checkpoint)

    在分布式或者伪分布集群中,每隔一段时间,会由 secondary namenode 将 namenode 上积累的所有 edits 和一个最新的 fsimage 下载到本地,并加载到内存进行 merge(这个过程称为 checkpoint)。
①SecondaryNameNode首先会询问NameNode是否需要CheckPoint(触发CheckPoint需要满足两个条件中的任意一个,定时时间到和Edits中数据写满了)。直接带回NameNode是否检查结果。
②SecondaryNameNode执行CheckPoint操作,首先会让NameNode滚动Edits并生成一个空的edits.inprogress,滚动Edits的目的是给Edits打个标记,以后所有新的操作都写入edits.inprogress,其他未合并的Edits和Fsimage会拷贝到SecondaryNameNode的本地。
③然后将拷贝的Edits和Fsimage加载到内存中进行合并,生成fsimage.chkpoint,然后将fsimage.chkpoint拷贝给NameNode,重命名为Fsimage后替换掉原来的Fsimage。④NameNode在启动时就只需要加载之前未合并的Edits和Fsimage即可,因为合并过的Edits中的元数据信息已经被记录在Fsimage中。

  

重试次数

最大重试次数

dfs.namenode.checkpoint.max-retries=3  

两个触发条件

满足其中一个触发条件,就开始进行chekpoint。

<property>
  <name>dfs.namenode.checkpoint.period</name>
  <value>3600s</value>
  <description>两次 checkpoint 之间的时间间隔360 秒</description>
</property>

“`<property>
<name>dfs.namenode.checkpoint.txns</name>
<value>1000000</value>
<description>两次checkpoint之间最大的操作记录</description>
</property>

<property>
<name>dfs.namenode.checkpoint.check.period</name>
<value>60s</value>
<description> 1分钟检查一次操作次数</description>



参考链接:
http://blog.sina.com.cn/s/blog_13122c2790101ed52.html
https://blog.csdn.net/qq_34516081/article/details/81353469
https://www.cnblogs.com/ggjucheng/archive/2013/01/03/2843015.html
https://blog.csdn.net/weixin_30278311/article/details/95780782