如题所示,当客户端请求将文件写入hdfs时,HDFS或name node如何选择存储文件的datanode?如果文件太大,hdfs 是否会尝试将此文件的所有块存储在同一节点或同一机架中的某个节点中?hdfs 是否为应用程序提供任何 API 以根据需要将文件存储在某个数据节点中?
5 回答
HDFS 或名称节点如何选择存储文件的数据节点?
HDFS 有一个BlockPlacementPolicyDefault,请查看 API 文档了解更多详细信息。应该可以为自定义行为扩展BlockPlacementPolicy。
hdfs 是否为应用程序提供任何 API 以根据需要将文件存储在某个数据节点中?
放置行为不应特定于特定的数据节点。这就是使 HDFS 能够适应故障并具有可扩展性的原因。
选择datanode的代码在function中ReplicationTargetChooser.chooseTarget()
。
评论说:
副本放置策略是,如果写入器在数据节点上,则将第一个副本放置在本地机器上,否则放置随机数据节点。第二个副本放置在不同机架上的数据节点上。第三个副本放置在与第一个副本位于同一机架上的数据节点上。
它没有为应用程序提供任何 API 来将文件存储在他们想要的数据节点中。
如果有人更喜欢图表,这里有一张图片(来源):
现在有了Hadoop-385补丁,我们可以选择块放置策略,以便将文件的所有块放置在同一个节点中(对于复制节点也是如此)。阅读有关此主题的博客- 查看评论部分。
可以看到,namenode 指示datanode 存储数据的时候。第一个副本存储在本地机器中,其他两个副本存储在其他机架上,依此类推。
如果任何副本失败,则从其他副本存储数据。每个副本失败的机会就像你睡觉时头上掉下来的风扇一样:p ie 发生这种情况的机会非常少。