Hadoop深入学习:HDFS主要流程——写文件

本文详细介绍了HDFS中写文件的过程,包括客户端如何通过数据流管道向HDFS写入数据,以及在写数据过程中遇到节点故障时的处理机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本节我们主要学习HDFS主流程中的写文件的整个流程。
向HDFS中写入数据,即使不考虑节点出戳后的故障处理,也是最复杂的流程。
相关的些命令有:

hadoop fs -put example.txt //写单个文件

hadoop fs -CopyFromLocal /data/test/foo /data/test //写多个文件


在向HDFS的写操作中,不得不提以下[b]“数据流管道”[/b]。数据流管道在Google实现他们的分布式文件系统(GFS)时就已引入,[b]其目的是:在写一份数据的多个副本时,可以充分利用集群中每一台机器的带宽,避免网络瓶颈和高延时的连接,最小化推送所有数据的延时。[/b]
Hadoop的HDFS也实现了自己的数据流管道,如下图所示:
[img]http://dl2.iteye.com/upload/attachment/0084/9695/3dc485ea-f51f-3104-8ad7-2035f9940cf3.jpg[/img]
假设HDFS中的文件副本被配置成3个,也就是说,在该HDFS集群上,一共会有三个数据节点来保存一个数据文件的副本。在写数据的时候,不是同时往三个DateNode节点上写数据,而是将数据发送到第一个数据节点[b]DateNode 1[/b],然后在第一个DateNode节点在本地保存数据的同时,将数据推送到第二个数据节点[b]DateNode 2[/b],同理在第二个节点本地保存数据的同时,也会由第二个数据节点将数据同送给第三个数据节点[b]DateNode 3[/b];确认包有最后一个数据节点产生,沿途的数据节点在确认本地写成功后,才往上游传递确认应答。这样处于管道上的每个节点都承担了写数据时的部分网络流量,降低了客户端发送多分数据时对网络的冲击。

本节我们就一向HDFSzhong写一个新文件为例,描述一个整个过程。首先先看一下流程示意图:
[img]http://dl2.iteye.com/upload/attachment/0084/9722/549bd6db-6f09-31be-9eeb-b50118465fad.jpg[/img]
具体步骤如下:
1)、客户端调用DistributedFileSystem的create()方法,创建新文件(上图中的第1步),这时DistributedFileSystem创建DFSOutputStream,并由用远程调用,让NameNode节点执行同名方法在文件系统的命名空间中创建这一新文件。在DataNode中创建新节点时,需要执行各种检查,如DataNode是否处于正常状态,被创建文件是否存在,客户端是否有权限创建文件,这些检查都通过后才会创建一个新文件,并将操作记录到编辑日志。远程方法调用完后,DistributedFileSystem会将DFSOutputStream对象包装在FSDataOutStream实例中,返回客户端;
2)、在客户端写入数据时,由于之前创建的时空文件,所以FSDataOutStream对象会向NameNode节点申请数据块并得到可以保存数据块的DataNode节点,然后FSDataOutStream就会和DataNode节点联系建立数据流管道;
3)、建立数据流管道后,客户端写入FSDataOutStream流中的数据,被分成一个一个的文件包,放入FSDataOutStream流中的内部队列。该队列中的文件包最后被打包成数据包,发往数据流管道,流经管道上的各个DateNode节点并持久化;
4)、确认包按数据流管道的逆方向向上一个DataNode节点发送确认包,当客户端收到确认包后,就将对应的包从内部队列中删除;
5)、FSDataOutStream在写玩一个数据块后,数据流管道上的节点会向NameNode节点提交数据块,如果数据队列中还有待输出数据,FSDataOutStream对象会再次向NameNode申请新的数据块节点,为文件添加在新的数据块;
6)、客户端写完数据后关闭输出流,然后再通知NameNode节点关闭文件,从而完成一次正常的写文件操作。
如果在写数据期间,数据节点发生故障怎么办呢?首先数据流管道会被关闭,已经发送到管道但还没有收到确认的文件包,会重新添加到FSDataOutStream的输出队列,这样就保证了无论数据流管道中的哪个节点有故障,都不会丢失数据;然后当前正常工作的数据节点上的数据块会被赋予一个新的版本号,并通知NameNode节点,这样在失败的DataNode节点恢复过来后将删除与NameNode节点中版本号不一致的数据块,然后在数据流管道中删除错误DataNode节点并重新建立新管道连接,继续像正常的DataNode节点写数据。
、在写数据的过程中,有可能出现多于一个数据节点出现故障的情况,这时只要管道中的数据节点数目满足配置项${dfs.replication.min}的值,改制默认为1,就认为写操作是成功的,后续这些数据快后被复制,直到满足配置的${dfs.replication}的值的数目。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值