我注意到所有 map 和所有 reduce 任务都在单个节点(node1)上运行。我尝试创建一个由位于 node2 上的单个 hdfs 块组成的文件。当运行一个 mapreduce 任务时,它的输入只包含驻留在 node2 上的这个块,该任务仍然在 node1 上运行。我的印象是 hadoop 优先考虑在包含输入数据的节点上运行任务。我在日志文件中没有看到任何错误报告。知道这里可能会发生什么吗?
我在按照 cloudera cdh4 分布式安装指南创建的 kvm 上运行了一个 3 节点集群。
我的印象是 hadoop 优先考虑在包含输入数据的节点上运行任务。
好吧,可能有一个例外情况:
如果持有数据块的节点没有任何空闲的 CPU 插槽,它将无法在该特定节点上启动任何映射器。在这种情况下,数据块将被移动到附近的节点并在那里进行处理,而不是等待。但在该框架将尝试在本地处理该块的副本之前(如果 RF > 1)。
高温高压
当您说“我尝试创建一个由位于 node2 上的单个 hdfs 块组成的文件”时,我不明白。我不认为您可以“指导”hadoop 集群将某些块存储在某个特定节点中。
Hadoop 将根据输入的大小决定映射器的数量。如果输入大小小于 hdfs 块大小(我认为默认为 64m),它将只生成一个映射器。
您可以将作业参数“mapred.max.split.size”设置为您想要强制生成多个减速器的任何大小(默认值在大多数情况下就足够了)。