我有一些非常简单的hadoop流媒体作业,如下所示:
yarn jar /usr/lib/hadoop-mapreduce/hadoop-streaming-2.2.0.2.0.6.0-101.jar \
-files hdfs:///apps/local/count.pl \
-input /foo/data/bz2 \
-output /user/me/myoutput \
-mapper "cut -f4,8 -d," \
-reducer count.pl \
-combiner count.pl
这个 count.pl
脚本只是一个简单的脚本,它将计数累加成一个散列,并在最后打印出来-详细信息可能不相关,但我可以在必要时发布它。
输入是一个目录,包含5个用bz2压缩编码的文件,大小大致相同,总共约5gb(压缩)。
当我查看正在运行的作业时,它有45个Map器,但它们都在一个节点上运行。特定的节点在不同的运行中变化,但总是只有一个节点。因此,当数据通过网络传输到此节点时,我实现了较差的数据局部性,并且可能也实现了较差的cpu使用率。
整个集群有9个节点,基本配置都一样。所有5个文件的数据块都分布在9个节点中,正如hdfs name node web ui所报告的那样。
我很高兴从我的配置中分享任何请求的信息,但这是一个公司集群,我不想上传任何完整的配置文件。
看起来前面的这个线程[为什么Map任务总是在单个节点上运行]是相关的,但不是决定性的。
编辑:在@jtravaglini的建议下,我尝试了以下变体,发现了相同的问题—所有45个Map作业都在单个节点上运行:
yarn jar \
/usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples-2.2.0.2.0.6.0-101.jar \
wordcount /foo/data/bz2 /user/me/myoutput
在shell中该任务的输出结束时,我看到:
Launched map tasks=45
Launched reduce tasks=1
Data-local map tasks=18
Rack-local map tasks=27
这是您希望在一个节点上仅凭偶然机会就能看到的数据本地任务数。
暂无答案!
目前还没有任何答案,快来回答吧!