如标题所示,当客户端请求将文件写入hdfs时,HDFS或名称节点如何选择存储文件的datanode? hdfs是否尝试将此文件的所有块存储在同一节点或同一机架中的某个节点(如果它太大)? hdfs是否为应用程序提供任何API以将文件存储在他喜欢的某个datanode中?
答案 0 :(得分:12)
HDFS或名称节点如何选择存储文件的datanode? p>
HDFS有一个BlockPlacementPolicyDefault,请查看API文档以获取更多详细信息。应该可以为自定义行为扩展BlockPlacementPolicy。
hdfs是否为应用程序提供了任何API以将文件存储在他喜欢的某个datanode中?
放置行为不应特定于特定的datanode。这就是使HDFS能够适应故障并具有可扩展性的原因。
答案 1 :(得分:8)
选择datanode的代码在函数ReplicationTargetChooser.chooseTarget()
中。
评论说:
副本放置策略是如果作者在a datanode,第一个副本放在本地计算机上,否则 随机数据节点。第二个副本放在打开的datanode上 一个不同的机架。第三个副本放在打开的datanode上 与第一个副本相同的机架。
它没有为应用程序提供任何API来将文件存储在他们想要的datanode中。
答案 2 :(得分:5)
如果有人喜欢图表,这里有一张图片(source):
答案 3 :(得分:3)
现在使用Hadoop-385补丁,我们可以选择块放置策略,以便将文件的所有块放在同一节点中(对于复制节点也是如此)。请阅读此blog关于此主题的内容 - 请查看评论部分。
答案 4 :(得分:-2)
当namenode指示datanode存储数据时,您可以看到。第一个副本存储在本地计算机中,其他两个副本在其他机架上制作,依此类推。
如果任何副本失败,则会从其他副本存储数据。每一个复制品都失败的可能就像你在睡觉时摔倒在你头上的风扇:p即它的可能性很小。