namenode如何查找空datanode? 当客户端发出写入数据节点的请求时。 通过哪种算法?
答案 0 :(得分:0)
你的问题的答案非常复杂。在大多数情况下,作为Hadoop的用户甚至是HDFS的管理员,您可能不需要确切地关注NameNode如何确定将其块写入哪个节点。但是,如果您真的很好奇,请查看以下资源:
来自Hadoop权威指南的'Anatomy of a File Write':
客户端通过调用create()来创建文件 DistributedFileSystem(图3-3中的步骤1)。 DistributedFileSystem 对namenode进行RPC调用以在其中创建新文件 filesystem的命名空间,没有与之关联的块(步骤2)。 namenode执行各种检查以确保文件不会 已经存在,并且客户端具有正确的权限来创建 文件。如果这些检查通过,则namenode会记录新的检查 文件;否则,文件创建失败并抛出客户端 IOException异常。 DistributedFileSystem返回FSDataOutputStream 让客户端开始写入数据。就像在阅读案例中一样 FSDataOutputStream包装一个处理的DFSOutputStream 与datanodes和namenode的通信。
当客户端写入数据时(步骤3),DFSOutputStream将其拆分为 它写入内部队列的数据包称为数据队列。 数据队列由DataStreamer使用,DataStreamer负责 它是通过选择列表来要求namenode分配新块 适合存储副本的数据节点。数据节点列表 一个管道 - 我们假设复制级别为三,所以有 管道中的三个节点。 DataStreamer将数据包流式传输到 管道中的第一个datanode,用于存储数据包和 将它转发到管道中的第二个datanode。同样, 第二个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