大数据启蒙-学习Hadoop-HDFS(五)

99 阅读5分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第21天,点击查看活动详情

前言

今天我们来讲HDFS的副本放置策略和写数据的流程,划重点了。

Block的副本放置策略

  • 第一个副本:放置在上传文件的DN;如果是集群外提交,则随机挑选一台磁盘不太满,CPU不太忙的节点。
  • 第二个副本:放置在于第一个副本不同的机架的节点上。
  • 第三个副本:与第二个副本相同机架的节点。
  • 更多副本:随机节点。

image.png

在老版本的时候,如果只设置两个副本,那么副本放置策略是副本一和副本二在同一个机架,这是如果这个机架挂了就都没了。所以在2.X的时候修复了这个bug,调整了副本放置策略,第二个副本一定要合第一个副本在不同的机架节点上。

那么第三个副本为什么不随机放,而是要放在与第二个副本相同的机架上呢?这是我们来看一下这个成本,如果客户端在机架一,客户端把第一个副本放在同一个服务器,那么这时候不需要额外的I/O,也不需要走交换机。在放置第二个副本的时候,就要走三个交换机才能将副本放置到不同的机架上,如果第三个副本放置到其他交换机的话,那还需要在走多个交换机,这时候就成本就相对较高,所以放置策略会将第三个副本放到和第二个副本的机架上。

HDFS写数据流程概述

在HDFS写流程的时候,如下图所示有客户端、NameNode和一些DataNode。下图描述的是某一时刻,客户端在传一个块的三个副本的流程。

image.png

客户端一开始找NameNode请求上传文件,NameNode这时候会执行副本放置策略。上传第一个Block的时候,NameNode返回了三个副本的位置节点,这时候根据距离会将三个节点位置做一个排序,三个节点中有和客户端在同一个服务器的副本节点排第一,这时候第一个副本就放在客户端所在的节点。

客户端会和排序的第一个副本节点建立TCP连接,第一个副本节点和第二个副本节点建立TCP连接,第二个副本节点和第三个副本节点建立TCP连接。

假设客户端要上传的第一个block是128M,客户端会将block切割成一个更小的单位,比如说64K的packet。客户端会把一个packet传给第一个DataNode,第一个DataNode收到packet后,内存存一份,硬盘存一份。然后第一个DataNode把这个packet传给第二个DataNode,传输的同时客户端可以把第二个packet传给第一个DataNode,第二个DataNode把第一个packet传给第三个DataNode同时第一个DataNode可以把第二个packet传给第二个DataNode,以此类推流式传输数据,流式传输也是一种并行传输。

如果在流式传输的过程中,有一台DataNode挂了怎么办?

如果是最后一台挂了,影响是比较小的,前面的DataNode都接收到了数据。如果是中间的DataNode挂了,第一个DataNode会跳过中间那个,直接和第三个DataNode连接。如果是第一个DataNode挂了,那么客户端会直接和第二个DataNode建立连接。

DataNode会在和NameNode汇报心跳的时候,告诉NameNode存了那些block。客户端告诉NameNode存了那些数据,NameNode是不相信的,只相信DataNode的汇报。

如果有一个DataNode挂了,那么NameNode在统计时会发现三个副本只汇报了两个,副本数不足会触发NameNode内部策略,让其中一个DataNode再复制一个副本。

其实客户端的实现逻辑并不复杂,只要注意传输就可以,HDFS中的策略配置可以解决很多异常问题。

HDFS写数据流程要点

  • Client和NN连接创建文件元数据
  • NN判定元数据是否有效
  • NN处发副本放置策略,返回一个有序的DN列表
  • Client和DN建立Pipeline连接
  • Client将块切分成packet (64KB),并使用chunk (512B)+chucksum (4B)填充
  • Client将packet放入发送队列dataqueue中,并向第一个DN发送
  • 第一个DN收到packet后本地保存并发送给第二个DN
  • 第二个DN收到packet后本地保存并发送给第三个DN
  • 一个过程中,上游节点同时发送下一个packet
  • 生活中类比工厂的流水线:结论:流式其实也是变种的并行计算
  • HDFS使用这种传输方式,副本数对于client是透明的
  • 当block传输完成,DN们各自向NN汇报,同时client继续传输下一个block所以,client的传输和block的汇报也是并行的

总结

面试的时候和面试官聊得时候,可以聊的知识点:

  1. NameNode会触发副本放置策略,返回排序后的节点位置。HDFS通过副本放置策略,既能达到接近像本地文件写数据的速度,同时还有多副本可靠性保证数据持久化,这是一个很巧妙的优势。
  2. 客户端写文件的时候是通过Pipeline的流式传输(并行传输)

TO BE CONTINUE.