HDFS读写数据流程&&错误问题解决

1、HDFS写数据流程

一个namenode下有几个datanode(比如3个)

假设要往分布式hadoop集群中上传文件,a.txt,大小为300M文件。客户端中将文件a.txt进行分割。

第1步:接下来hadoop客户端会向namenode发送请求。请求上传a.txt,上传到/user目录。

第2步:对上传权限进行检查。

第3步:如果没有什么问题,告诉客户端可以上传。

第4步:一块一块上传,每块128M。比如请求上传blk1。

第5步:检测datanode信息池。(dn1、dn2、dn3)

第6步:检测后,会将datanode列表返回给客户端。(dn1、dn2、dn3)

第7步:和datanode之间建立管道。

第8步:Client开始发送数据,将block数据拆分为一个个的package。每块大小是64k。

第9步:将数据保存到某一个目录。(比如设置为/data)

第10步:通过ack应答机制,告诉datanode,再告诉namenode,应答到客户端。至此,该块上传完毕,进行下一个块的传输。

以上就是hdfs写数据的流程。

2、HDFS读数据流程

一个namenode下有几个datanode(比如4个)

abc.txt以3个副本的形式存储在datanode中。该文件分为3块,blk1、blk2、blk3。每块各有3个副本,blk1存储在datanode01、datanode03、datanode04中;blk2存储在datanode01、datanode02、datanode04中;blk3存储在datanode02、datanode03、datanode04中。

然后,在namenode中记录下元数据:

blk1,r=3(dn01、dn03、dn04)

blk2,r=3(dn01、dn02、dn04)

blk3,r=3(dn02、dn03、dn04)

现在需求是:要从HDFS文件系统中的/abc.txt下载文件。

第1步:在Client客户端发出请求。请求下载/abc.txt

第2步:namenode中进行下载权限的检查。如果没有问题,则获取文件的block存储列表。

第3步:将block存储列表返回给客户端。但并不是全部信息都返回,而是通过副本机制,根据就近原则(blk1:dn01;blk2:dn01;blk3:dn02)。所谓的就近原则,比如Client客户端距离datanode01比较近,距离datanode02稍微远一点。所以优先考虑在datanode01下载。假设客户端Client与datanode01属于同一台主机,与datanode02在一个机房不同主机,与datanode03在同一个城市不同地点,与datanode04在不同城市。这样就根据datanode01、datanode02、datanode03、datanode04的顺序去查找并下载。

第4步:和对应的datanode之间建立pipeline管道。一个一个package(一小块一小块)地进行数据的传输。

第5步:在Client客户端将多个block合并成最终文件。

​​​​​​​3、NameNode&Secondary NameNode工作机制

Namenode存储的是元数据。比如在namenode中存储了a.txt,1k左右块信息;b.txt 2k左右块信息。元数据是在内存中存储的。但是块数据是在磁盘中存储的。

现在元数据是在内存中存储的,但是忽然大数据平台关机了,内存中的元数据就会丢失。为了避免这种情况,将元数据写入磁盘中,进行持久化数据保存。元数据会专门有一个组件,称为fsimage,里面保存的是元数据的镜像。

当大数据平台进行重启的时候,元数据的镜像就会在内存中重新生成namenode中的元数据。但仅靠镜像,无法完成数据的完全恢复。假设要对数据进行再次的存储,比如c.txt,4k左右的块信息。有时新增加的元数据并不是在镜像中的,而是在edits日志文件中,保存日志操作。由元数据镜像和edits日志文件一起,才能完成namenode元数据的恢复。

这时候问题来了,随着不断往hdfs分布式文件系统添加操作(比如加上b.txt,5k块信息)这些信息都会保存到日志操作中。一年hdfs分布式文件系统不关机。这些数据就好在edits文件中堆积。这些日志文件就会非常庞大,可能内存不够。此时架构师就设计了secondarynamenode组件。它可以每隔一段时间获取到元数据的镜像和日志操作,跟原来的元数据镜像进行合并操作。合并后变成新的元数据镜像。在一定程度上减少了namenode日志记录的负担。什么时候进行合并,会触发secondary工作的条件?

触发条件是:

1 时间因素。每一小时,将元数据镜像和日志操作合并一次。

2 edits文件大小因素。64M。每达到这样大小都会进行合并操作。

​​​​​​​4、错误问题解决​​​​​

(1)Unable to load native-hadoop library for your platform

参考:Unable to load native-hadoop library for your platform解决方法_浮生、佐以酒-CSDN博客 

在执行hadoop命令的时候出现如下错误,不能加载Hadoop库。

检查发现本地并没有库

hadoop checknative -a

原因:

Apache提供的hadoop本地库是32位的,而在64位的服务器需要自己编译64位的版本。

进入 hadoop 下的 lib/native 目录,如果是空的,则需要通过 http://dl.bintray.com/sequenceiq/sequenceiq-bin/ 下载对应版本的native库

并解压到 lib/native 目录下,确保有如下内容(貌似默认已有)

然后,重启dfs

./sbin/start-dfs.sh

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Distantfbc

你的鼓励是我最大的动力,谢谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值