namenode如何找到空的datanode?

tzcvj98z  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(406)

namenode如何找到空的datanode?当客户端请求写入数据节点时。用哪种算法?

0aydgbwb

0aydgbwb1#

你问题的答案很复杂。在大多数情况下,作为hadoop的用户甚至hdfs的管理员,您可能不需要关心namenode如何确定要将其块写入哪个节点。但是,如果您真的很好奇,请查看以下资源:
来自hadoop权威指南的“文件写入剖析”:
客户机通过在distributedfilesystem上调用create()来创建文件(图3-3中的步骤1)。distributedfilesystem对namenode进行rpc调用,以便在文件系统的命名空间中创建一个新文件,并且没有与之关联的块(步骤2)。namenode执行各种检查,以确保该文件不存在,并且客户端具有创建该文件的正确权限。如果这些检查通过,namenode将记录新文件;否则,文件创建失败,客户端将抛出ioexception。distributedfilesystem返回一个fsdataoutputstream,供客户端开始向其写入数据。就像在read案例中一样,fsdataoutputstream Package 了dfsoutputstream,它处理与datanodes和namenode的通信。
当客户机写入数据(步骤3)时,dfsoutputstream将其拆分为数据包,然后将数据包写入称为数据队列的内部队列。数据队列由datastreamer使用,datastreamer的职责是请求namenode通过挑选合适的datanode列表来分配新的块来存储副本。datanodes列表形成了一个管道,我们假设复制级别为3,因此管道中有3个节点。datastreamer将数据包流到管道中的第一个datanode,后者存储数据包并将其转发到管道中的第二个datanode。类似地,第二个数据节点存储数据包并将其转发到管道中的第三个(也是最后一个)数据节点。
如果您想逐步了解最新稳定的asf hadoop,还可以从中查看源代码:https://github.com/apache/hadoop-common/blob/trunk/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/distributedfilesystem.java#l346

相关问题