分布式文件系统HDFS架构和数据读写流程

Hadoop核心由HDFS和MapReduce组成,HDFS负责分布式存储,MapReduce负责分布式计算。

Hadoop框架整体架构

Hadoop整体架构如下图所示,NameNode(命名节点/管理节点)和DataNode(数据节点)构成了HDFS的主要框架,JobTracker和TaskTracker构成了MapReduce的主要框架。
分布式文件系统HDFS架构和数据读写流程_第1张图片

HDFS

HDFS(Hadoop Distributed File System)是GFS的开源实现,是一个高度容错性的分布式文件系统,其特点如下:

  • 能够运行在廉价机器上,硬件出错常态,需要具备高容错性
  • 流式数据访问,而不是随机读写
  • 面向大规模数据集,能够进行批处理、能够横向扩展
  • 简单一致性模型,假定文件是一次写入、多次读取

HDFS也有一定的缺点:

  • 不支持低延迟数据访问
  • 不适合大量小文件存储(因为每条元数据占用空间是一定的)
  • 不支持并发写入,一个文件只能有一个写入者
  • 不支持文件随机修改,仅支持追加写入

HDFS的架构采用主从架构(master/slave),一个典型的HDFS集群包含一个NameNode节点和多个DataNode节点。NameNode节点负责整个HDFS文件系统中的文件的元数据的保管和管理,集群中通常只有一台机器上运行NameNode实例,DataNode节点保存文件中的数据,集群中的机器分别运行一个DataNode实例。在HDFS中。DataNode节点通过心跳机制与NameNode节点进行定时的通信。
分布式文件系统HDFS架构和数据读写流程_第2张图片

  • NameNode
    分布式文件系统中的管理者,存储文件系统的meta-data,主要负责管理文件系统的命名空间,集群配置信息,存储块的复制。

  • DataNode
    文件存储的基本单元。它存储文件块在本地文件系统中,保存了文件块的meta-data,同时周期性的发送所有存在的文件块的报告给NameNode。

  • Client(客户端)
    需要获取分布式文件系统文件的应用程序。

在任何分布式文件系统中,读写流程是必须要了解的,但要掌握HDFS读写流程,必须要分清以下概念。

  • block (数据块)

文件上传前需要分块,这个块就是block,一般为128MB,不建议修改块大小,因为块太小会造成寻址时间占比过高,而块太大会造成MapReduce框架中Map任务数太少,作业执行速度变慢。block是HDFS物理存储中最大的单位。

  • packet (数据包)

packet是第二大的单位,它是client端向DataNode,或DataNode的PipLine之间传数据的基本单位,默认64KB。

  • chunk (校验数据块)

chunk是最小的单位,它是client向DataNode,或DataNode的PipLine之间进行数据校验的基本单位,默认512Byte,因为用作校验,故每个chunk需要带有4Byte的校验位。所以实际每个chunk写入packet的大小为516Byte。由此可见真实数据与校验值数据的比值约为128 : 1。(即64*1024 / 512)

HDFS写数据流程

分布式文件系统HDFS架构和数据读写流程_第3张图片
1.客户端向NameNode发出写文件请求。

2.检查是否已存在文件、检查权限。若通过检查,直接先将操作写入EditLog,并返回输出流对象。

(注:WAL,write ahead log,先写Log,再写内存,因为EditLog记录的是最新的HDFS客户端执行所有的写操作。如果后续真实写操作失败了,由于在真实写操作之前,操作就被写入EditLog中了,故EditLog中仍会有记录,我们不用担心后续client读不到相应的数据块,因为在第5步中DataNode收到块后会有一返回确认信息,若没写成功,发送端没收到确认信息,会一直重试,直到成功)

3.client端按128MB的块切分文件。

4.client将NameNode返回的分配的可写的DataNode列表和Data数据一同发送给最近的第一个DataNode节点,此后client端和NameNode分配的多个DataNode构成pipeline管道,client端向输出流对象中写数据。client每向第一个DataNode写入一个packet,这个packet便会直接在pipeline里传给第二个、第三个…DataNode。

(注:并不是写好一个块或一整个文件后才向后分发)

5.每个DataNode写完一个块后,会返回确认信息。

(注:并不是每写完一个packet后就返回确认信息,因为packet中的每个chunk都携带校验信息,没必要每写一个就汇报一下,这样效率太慢。正确的做法是写完一个block块后,对校验信息进行汇总分析,就能得出是否有块写错的情况发生)

6.写完数据,关闭输输出流。

7.发送完成信号给NameNode。

(注:发送完成信号的时机取决于集群是强一致性还是最终一致性,强一致性则需要所有DataNode写完后才向NameNode汇报。最终一致性则其中任意一个DataNode写完后就能单独向NameNode汇报,HDFS一般情况下都是强调强一致性)

HDFS读数据流程

分布式文件系统HDFS架构和数据读写流程_第4张图片
1.client访问NameNode,查询元数据信息,获得这个文件的数据块位置列表,返回输入流对象。

2.就近挑选一台datanode服务器,请求建立输入流 。

3.DataNode向输入流中中写数据,以packet为单位来校验。

4.关闭输入流

你可能感兴趣的:(Hadoop,MapReduce,MapReduce系列文章,HDFS,架构,读写流程)