谁能帮助我理解以下与我对 Hadoop 数据局部性的理解相反的观察。
具有 3 个节点的 Hadoop 集群:
主人:10.28.75.146
从站1:10.157.6.202
从机2:10.31.130.224
成功运行任务。从作业控制台:
Task Attempts:attempt_201304030122_0003_m_000000_0
Machine: /default-rack/10.31.130.224<p>
Task log: INFO: consuming hdfs://10.28.75.146:9000/input/22.seq
我们知道 224 节点正在处理 /input/22.seq 数据。通过命令:
$hadoop fsck /input -files -blocks -locations |grep -A 1 "22.seq"
/input/22.seq 61731242 bytes, 1 block(s): OK
0. blk_-8703092405392537739_1175 len=61731242 repl=1 [10.157.6.202:9200]
22.seq 适合一个小于默认 HDFS 块大小 (64MB) 的块,并且不会复制到其他节点。
问题:既然22.seq不是224节点本地的,为什么Hadoop分配224节点在202上远程处理数据?
注意:这也不例外。我注意到许多数据文件是远程获取的,并且在两个节点的 eth0 上观察到巨大的网络流量。我期望两个节点之间的流量接近于零,因为我所有的数据文件都小于 64MB,并且数据应该在本地处理。
仅供参考:这是在亚马逊的 AWS EMR 上观察到的。