Hadoop之HDFS基础
Hadoop之HDFS基础
小宝0419 发表于1年前
Hadoop之HDFS基础
  • 发表于 1年前
  • 阅读 15
  • 收藏 0
  • 点赞 1
  • 评论 0

腾讯云 十分钟定制你的第一个小程序>>>   

摘要: 本篇初步阐述HDFS的一些概念,基础工作原理,适合HDFS入门学习。

HDFS,即hadoop分布式文件系统,主要为了解决如下问题:

  1. 超大文件存储,一般为TB,或者PB

  2. 流式数据读取,一般为一次写入,多次读取

  3. 廉价商用硬件,可运行在一般的廉价PC上面

  4. 数据的高可用性,单机故障后,不影响数据整体的可用性

但同时,HDFS也存在一定的缺陷,或者说其无法解决的问题:

  1. 低延迟的访问,由于HDFS的设计之初是用于解决大吞吐量的数据访问,这是以一定的访问延迟为代价的。HDFS中心节点的存在,导致所有数据写入/访问都需要与中心节点交互,访问量比较大时,会增加相应的时延

  2. 大量的小文件访问,由于HDFS的namenode将文件系统的元数据信息存储在内存中,每个文件都需要固定的一些元数据信息,当存在大量的小文件时,namenode单机的内存就成为瓶颈

  3. 不支持多用户写入,也不支持随机写入


数据块(block):

  1. block是HDFS文件存储的基本单位,默认block为64M(主要为了最小化磁盘寻址开销)

  2. 每个文件以block为单位进行存储

  3. 与普通文件系统不同的是,如果一个文件的大小不足一个block,该文件实际并不占用block全部存储空间

Namenode:

  1.  namenode负责维护整个文件系统的命名空间,文件he文件夹的元数据,这些数据被存储在两个地方:fsimage和editlog

  2. namenode还保存文件包含哪些数据块以及与数据节点的对应关系,但这些信息并不保存在硬盘上, 而是启动时从数据节点收集

  3. 除了namenode外,有个从namenode,主要用于定期从主namenode上拿到fsimage和editlog信息,并合并成最新的fsimage,并发送给主namenode;同时在主namenode宕机后,与可接替工作

Datanode:

  1. 数据节点主要存储实际的数据,接收namenode的数据写入和读取请求


fsimage和editlog同步具体过程:

  1. namenode收到写入请求后,先写入本地editlog中

  2. 写完editlog后,再更改内存的数据

  3. 只有editlog同步到文件系统后,写操作才会返回成功

  4. fsimage是内存中的元数据信息定期checkpoing到磁盘的镜像

fsimage具体checkpoint的过程如下:

  1. 从namenode通知主namenode重新打开一个editlog,后续的更新写入新的editlog

  2. 从namenode从主namenode上get到fsimage和editlog,并将fsimage加载到内存中,并逐一执行editlog中的操作,生成新的fsimage

  3. 从namenode将新的fsimage发给主namenode,通知主namenode替换fsimage,同时通知主namenode用新的editlog替换原来的editlog

数据流

读取数据流:

  • 客户端(client)用FileSystem的open()函数打开文件 

  • DistributedFileSystem用RPC调用元数据节点,得到文件的数据块信息。 

  • 对于每一个数据块,元数据节点返回保存数据块的数据节点的地址。 

  • DistributedFileSystem返回FSDataInputStream给客户端,用来读取数据。 

  • 客户端调用stream的read()函数开始读取数据。 

  • DFSInputStream连接保存此文件第一个数据块的最近的数据节点。 

  • Data从数据节点读到客户端(client) 

  • 当此数据块读取完毕时,DFSInputStream关闭和此数据节点的连接,然后连接此文件下一个数据块的最近的数据节点。 

  • 当客户端读取完毕数据的时候,调用FSDataInputStream的close函数。 

  • 在读取数据的过程中,如果客户端在与数据节点通信出现错误,则尝试连接包含此数据块的下一个数据节点。 

  • 失败的数据节点将被记录,以后不再连接。

写入数据流:

  • 客户端调用create()来创建文件 

  • DistributedFileSystem用RPC调用元数据节点,在文件系统的命名空间中创建一个新的文件。 

  • 元数据节点首先确定文件原来不存在,并且客户端有创建文件的权限,然后创建新文件。 

  • DistributedFileSystem返回DFSOutputStream,客户端用于写数据。 

  • 客户端开始写入数据,DFSOutputStream将数据分成块,写入data queue。 

  • Data queue由Data Streamer读取,并通知元数据节点分配数据节点,用来存储数据块(每块默认复制3块)。分配的数据节点放在一个pipeline里。 

  • Data Streamer将数据块写入pipeline中的第一个数据节点。第一个数据节点将数据块发送给第二个数据节点。第二个数据节点将数据发送给第三个数据节点。 

  • DFSOutputStream为发出去的数据块保存了ack queue,等待pipeline中的数据节点告知数据已经写入成功。 

  • 如果数据节点在写入的过程中失败: 

    • 关闭pipeline,将ack queue中的数据块放入data queue的开始。 

    • 当前的数据块在已经写入的数据节点中被元数据节点赋予新的标示,则错误节点重启后能够察觉其数据块是过时的,会被删除。 

    • 失败的数据节点从pipeline中移除,另外的数据块则写入pipeline中的另外两个数据节点。 

    • 元数据节点则被通知此数据块是复制块数不足,将来会再创建第三份备份。 

  • 当客户端结束写入数据,则调用stream的close函数。此操作将所有的数据块写入pipeline中的数据节点,并等待ack queue返回成功。最后通知元数据节点写入完毕。


共有 人打赏支持
粉丝 0
博文 4
码字总数 1578
×
小宝0419
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: