我有一些相当简单的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个映射器,但它们都在一个节点上运行。特定节点从运行更改为运行,但始终只有一个节点。因此,当数据通过网络传输到此节点时,我实现了较差的数据局部性,并且可能也会降低CPU使用率。
整个群集有9个节点,所有基本配置都相同。所有5个文件的数据块都分布在9个节点中,如HDFS名称节点Web UI所报告的那样。
我很乐意与我的配置分享任何请求的信息,但这是一个企业集群,我不想上传任何完整的配置文件。
看起来这个前一个帖子[why map task always running on a single node]是相关的,但不是决定性的。
编辑: @ jtravaglini的建议我尝试了以下变体并看到了同样的问题 - 所有45个地图作业都在一个节点上运行:
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
这是您希望仅在一个节点上看到的数据本地任务的数量。