首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

深度分析分布式文件系统(Hadoop HDFS)客户端写入机制

1. ?开篇

Hadoop分布式文件系统(HDFS)是Hadoop大数据生态底层的数据存储设施。因其具备了海量数据的分布式存储能力,并针对不同批处理业务的大吞吐数据计算承载力,使其综合复杂度要远远高于大多数存储系统。

本文重点从客户端文件向HDFS写数据的角度切入,通过架构体系的分析绘制,源代码的层层分析,逐渐深入Hadoop内部机制,使其流程逐渐明朗化。HDFS数据写入过程是Hadoop核心技术中最复杂的流程之一,对其原理的掌握需要花费一些时间和精力,但这部分内容也是分布式文件系统架构机制的精髓所在。

首先我先列出一些HDFS的专业名词,方便阅读理解:

namenode:命名空间管理节点,负责HDFS元数据的管理,以及数据块读取和写入过程中的资源管理与分配等

datanode:数据任务节点,负责存储数据文件,负责与客户端之间、数据块之间的文件读取和写入

block:数据块,HDFS数据存储按照数据块(block)为单位,Hadoop2.x之后默认大小为128M

packet:数据包,每次在管道中传输数据需要将数据封装成一个packet,默认为64KB,包含了packet包头、校验chunk和数据chunk

pipeline:管道或流水线,应客户端请求,namenode提供存储block副本的datanodes,顺序建立数据副本传输管道,形成链式数据流的传输、存储和写入确认(ACK)

2. ?HDFS客户端数据写入综述

图1. HDFS客户端写入流程概括图

HDFS客户端写入流程架构的综合情况 如图1 所示。我们先通过此图从整体上简化了解,能一窥其全貌。代码实现与细节机制层面的情况要复杂得多,源代码层面的研究我们稍后再说。

首先我们可以看到HDFS客户端写入数据的过程安排给了三个线程去做:主控线程、数据流线程、响应处理线程。主控线程就是启动main入口进行HDFS API调用的主线程,在上一篇文章中,我们主要讲客户端向HDFS读取数据过程:深度探索Hadoop分布式文件系统(HDFS)数据读取流程。这个过程就只是使用到了主控线程:主控线程根据namenode提供好的副本节点,按照文件位移顺序下载block对应的各个副本节点数据,直到HDFS数据文件下载完成。

但是客户端文件向HDFS写入过程又增加了数据流线程和响应处理线程,形成了异步写入协作过程,就具有一定复杂度了,这种架构设计的目的是为了更好的写入性能,同时也兼顾数据写入的可靠性。大家可以想想,若客户端向HDFS传输一段数据还要同步等待网络上所有副本节点的接收完成,虽然这么做可靠性很高,但是客户端写入过程会非常慢,很容易形成客户端的写入堵塞,因为低效率写入是不满足HDFS作为大吞吐数据读写的设计目标,所以通过管道思路,客户端与各个datanode在传输上的异步分工才是更合理的选择。

HDFS实现高性能写入的做法分成了以下几个步骤:

(一)主控线程是第一个环节,由客户端采集数据,并止步于packet的构造和排队。packet进入内存数据队列(LinkedList)中,回头继续下一个packet的封装和排队,很像一个码头装卸工人;packet的包头信息大部分来自从namenode申请到的文件元信息,例如:包头具有一个数据块的最大长度,就能通过packet的包头信息得知是不是到了该数据块(block)的最后一个packet了,就需要重新向namenode申请新的datanode数据块(block)。

(二)数据流线程负责下一个环节,循环取出数据队列里面的packet,通过网络输出流(socketOutputStream)连接管道(pipeline)进行packet传输与写入,然后继续取数据队列下一个packet,以此循环操作,就好像始发的运输船,朝着下一个数据港口起航

(三)datanodes节点会以管道(pipeline)方式形成packet的副本传输链:前一个副本节点继续向下一个副本节点传输packet与写入,直到所有副本都完成了对block的packet写入。就好像多个数据港口,上一个港口拿到运输船的packet入仓储后,copy一份packet再由此港口发往下一个港口。

(四)响应处理线程负责第三个环节,在上个环节中Packet会排队进ACK队列,响应处理线程循环与block reply输入流建立通信,等待管道(pipeline)中的datanodes依次回传Packet ACK,并取出ACK队列中的Packet序列号与block reply输入流回传的Packet ACK序列号进行比对,若一致,该Packet写入block工作确认完成,移除队列,更新客户端相关参数。就好像运输链的末端港口返航一定给上一个港口带一封完成收货的信件,接着每个港口依次收信,带信返航,直到始发地港口收到下一个港口的返航回信后,才能确认所有港口都收到了packet并存储。

上述从整体上进行了HDFS客户端写入流程综述,通过上面的三个环节的任务分工,保证客户端采集封装、客户端连接管道传输、数据管道链式传输、数据管道ACK链式确认,互相之间不形成制约影响,使传输写入全过程都是在高性能情况下完成。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20201223A07ZCU00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券
http://www.vxiaotou.com