失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > HDFS读写流程(重点 有些面试官总喜欢问到 记录一下)

HDFS读写流程(重点 有些面试官总喜欢问到 记录一下)

时间:2019-11-13 07:35:07

相关推荐

HDFS读写流程(重点 有些面试官总喜欢问到 记录一下)

写数据流程

①服务端启动HDFS中的NN和DN进程

②客户端创建一个分布式文件系统客户端,由客户端向NN发送请求,请求上传文件

③NN处理请求,检查客户端是否有权限上传,路径是否合法等

④检查通过,NN响应客户端可以上传

⑤客户端根据自己设置的块大小,开始上传第一个块,默认0-128M,

NN根据客户端上传文件的副本数(默认为3),根据机架感知策略选取指定数量的DN节点返回

⑥客户端根据返回的DN节点,请求建立传输通道

客户端向最近(网络距离最近)的DN节点发起通道建立请求,由这个DN节点依次向通道中的(距离当前DN距离最近)

下一个节点发送建立通道请求,各个节点发送响应 ,通道建立成功

⑦客户端每读取64K的数据,封装为一个packet(数据包,传输的基本单位),将packet发送到通道的下一个节点

通道中的节点收到packet之后,落盘(检验)存储,将packet发送到通道的下一个节点!

每个节点在收到packet后,向客户端发送ack确认消息!

⑧一个块的数据传输完成之后,通道关闭,DN向NN上报消息,已经收到某个块

⑨第一个块传输完成,第二块开始传输,依次重复⑤-⑧,直到最后一个块传输完成,NN向客户端响应传输完成!

⑩客户端关闭输出流

举例:

1)客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在。

2)NameNode返回是否可以上传。

3)客户端请求第一个 Block上传到哪几个DataNode服务器上。

4)NameNode返回3个DataNode节点,分别为dn1、dn2、dn3。

5)客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。

6)dn1、dn2、dn3逐级应答客户端。

7)客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。

8)当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。(重复执行3-7步)。

异常写流程

①-⑥见上

⑦客户端每读取64K的数据,封装为一个packet,封装成功的packet,放入到一个队列中,这个队列称为dataQuene(待发送数据包)

在发送时,先将dataQuene中的packet按顺序发送,发送后再放入到ackquene(正在发送的队列)。

每个节点在收到packet后,向客户端发送ack确认消息!

如果一个packet在发送后,已经收到了所有DN返回的ack确认消息,这个packet会在ackquene中删除!

假如一个packet在发送后,在收到DN返回的ack确认消息时超时,传输中止,ackquene中的packet会回滚到dataQuene。

重新建立通道,剔除坏的DN节点。建立完成之后,继续传输!

只要有一个DN节点收到了数据,DN上报NN已经收完此块,NN就认为当前块已经传输成功!

NN会自动维护副本数!

读数据流程

1)客户端通过Distributed FileSystemNameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址。

2)挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。

3)DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)。

4)客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。

第二篇转载:

HDFS读过程

HDFS API 读文件

Configuration conf = new Configuration();

FileSystem fs = FileSystem.get(conf);

Path file = new Path("demo.txt");

FSDataInputStream inStream = fs.open(file);

String data = inStream.readUTF();

System.out.println(data);

inStream.close();

HDFS读取文件过程:

1.初始化FileSystem,然后客户端(client)用FileSystem的open()函数打开文件

2.FileSystem用RPC调用元数据节点,得到文件的数据块信息,对于每一个数据块,元数据节点返回保存数据块的数据节点的地址。

3.FileSystem返回FSDataInputStream给客户端,用来读取数据,客户端调用stream的read()函数开始读取数据。

4.DFSInputStream连接保存此文件第一个数据块的最近的数据节点,data从数据节点读到客户端(client)

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

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

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

8. 失败的数据节点将被记录,以后不再连接。【注意:这里的序号不是一一对应的关系】

HDFS写过程

HDFS API 写文件

Configuration conf = new Configuration();

FileSystem fs = FileSystem.get(conf);

Path file = new Path("demo.txt");

FSDataOutputStream outStream = fs.create(file);

outStream.writeUTF("Welcome to HDFS Java API!!!");

outStream.close();

HDFS写文件过程:

1.初始化FileSystem,客户端调用create()来创建文件

2.FileSystem用RPC调用元数据节点,在文件系统的命名空间中创建一个新的文件,元数据节点首先确定文件原来不存在,并且客户端有创建文件的权限,然后创建新文件。

3.FileSystem返回DFSOutputStream,客户端用于写数据,客户端开始写入数据。

4.DFSOutputStream将数据分成块,写入data queue。data queue由Data Streamer读取,并通知元数据节点分配数据节点,用来存储数据块(每块默认复制3块)。分配的数据节点放在一个pipeline里。Data Streamer将数据块写入pipeline中的第一个数据节点。第一个数据节点将数据块发送给第二个数据节点。第二个数据节点将数据发送给第三个数据节点。

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

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

7.如果数据节点在写入的过程中失败,关闭pipeline,将ack queue中的数据块放入data queue的开始,当前的数据块在已经写入的数据节点中被元数据节点赋予新的标示,则错误节点重启后能够察觉其数据块是过时的,会被删除。失败的数据节点从pipeline中移除,另外的数据块则写入pipeline中的另外两个数据节点。元数据节点则被通知此数据块是复制块数不足,将来会再创建第三份备份。

————————————————

版权声明:本文为CSDN博主「彩笔程序猿zxxxx」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:/kaede1209/article/details/81953291

如果觉得《HDFS读写流程(重点 有些面试官总喜欢问到 记录一下)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。
相关阅读
HDFS读写流程

HDFS读写流程

2022-12-05

HDFS的读写流程

HDFS的读写流程

2019-10-19

Hadoop:HDFS读写流程

Hadoop:HDFS读写流程

2019-03-01

hdfs 中chunk_HDFS读写流程

hdfs 中chunk_HDFS读写流程

2022-06-14