hdfs 读写流程

概述

开始之前先看看其基本属性,HDFS(Hadoop Distributed File System)是GFS的开源实现。

特点如下:

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

缺点:

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

HDFS中的block、packet、chunk

介绍HDFS读写流程上来就直接从文件分块开始,其实,要把读写过程细节搞明白前,了解block、packet与chunk。下面分别讲述。

block
这个大家应该知道,文件上传前需要分块,这个块就是block,一般为128MB,当然你可以去改,不顾不推荐。因为块太小:寻址时间占比过高。块太大:Map任务数太少,作业执行速度变慢。它是最大的一个单位。

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

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

 

例如,在client端向DataNode传数据的时候,HDFSOutputStream会有一个chunk buff,写满一个chunk后,会计算校验和并写入当前的chunk。之后再把带有校验和的chunk写入packet,当一个packet写满后,packet会进入dataQueue队列,其他的DataNode就是从这个dataQueue获取client端上传的数据并存储的。同时一个DataNode成功存储一个packet后之后会返回一个ack packet,放入ack Queue中。

上传流程

 

说明:1.客户端会将文件经行切分,如果文件大于128M

           2.传递数据时,单位为package,每个package由trunk组成,trunk中包含4位校验码,最终一个block是否传递成功需要根据校验和判定

           3.传递数据的时候是先建立通道然后先将最近的一个节点上传递数据,第一个节点会向其他节点经行复制副本

           4.如果有一个节点数据传递出问题,会启动其他节点和第一个节点之间的通道,再次进行数据传递

           5.当所有节点传递完成,校验通过之后,才表示上传成功(强一致性)

读流程:

 

 

 

读相对于写,简单一些 
读详细步骤:

  1. client访问NameNode,查询元数据信息,获得这个文件的数据块位置列表,返回输入流对象。
  2. 就近挑选一台datanode服务器,请求建立输入流 。
  3. DataNode向输入流中中写数据,以packet为单位来校验。
  4. 关闭输入流

读写过程,数据完整性如何保持?
通过校验和。因为每个chunk中都有一个校验位,一个个chunk构成packet,一个个packet最终形成block,故可在block上求校验和。

HDFS 的client端即实现了对 HDFS 文件内容的校验和 (checksum) 检查。当客户端创建一个新的HDFS文件时候,分块后会计算这个文件每个数据块的校验和,此校验和会以一个隐藏文件形式保存在同一个 HDFS 命名空间下。当client端从HDFS中读取文件内容后,它会检查分块时候计算出的校验和(隐藏文件里)和读取到的文件块中校验和是否匹配,如果不匹配,客户端可以选择从其他 Datanode 获取该数据块的副本。

HDFS中文件块目录结构具体格式如下:

${dfs.datanode.data.dir}/
├── current
│ ├── BP-526805057-127.0.0.1-1411980876842
│ │ └── current
│ │ ├── VERSION
│ │ ├── finalized
│ │ │ ├── blk_1073741825
│ │ │ ├── blk_1073741825_1001.meta
│ │ │ ├── blk_1073741826
│ │ │ └── blk_1073741826_1002.meta
│ │ └── rbw
│ └── VERSION
└── in_use.lock

in_use.lock表示DataNode正在对文件夹进行操作
rbw是“replica being written”的意思,该目录用于存储用户当前正在写入的数据。
Block元数据文件(*.meta)由一个包含版本、类型信息的头文件和一系列校验值组成。校验和也正是存在其中。

posted @ 2021-07-01 16:59  小虎。。。。  阅读(267)  评论(0)    收藏  举报