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