我有一个hadoop流程序,它在mapper中调用外部二进制文件。这个二进制文件生成并写出一些csv文件。然后将文件名传递给reducer。有一个reduce任务聚合映射器创建的文件。我使用
时能够成功运行作业-jobconf mapred.job.tracker=local \
-jobconf fs.defualt.name=local \
并在群集中的一个节点上运行作业。如果我在多个节点上运行作业,它会在reduce步骤中挂起(我认为这是由map任务在reduce任务的不同节点上编写一些文件引起的)以及我是否尝试在没有本地作业的情况下运行作业我得到的跟踪器是Streaming Job Failed
我的问题是如何确保reduce任务可以查看所有文件,或者确保map任务都写入reducer的位置?
我在处理HDFS时遇到问题,所以任何建议都会受到高度赞赏。感谢。
这是我的地图脚本: map.py:
#! /util/python/2.7.6/bin/python
import sys
sys.path.append('.')
import subprocess as sp
#mapper
partmc = './partmc'
for line in sys.stdin:
spec = line.strip().split('\t')[0] # eg, run_3.spec
args = [partmc, spec]
sp.Popen(args) #eg, ./partmc run_3.spec
我的Hadoop Streaming .sh:
module load python/2.7.6-statsmodels-0.5.0
$HADOOP_HOME/bin/hadoop --config $HADOOP_CONF_DIR jar $HADOOP_HOME/contrib/streaming/hadoop-0.20.1-streaming.jar \
-file /user/thomasef/pop/mapreduce/1_urban_plume/map.py \
-file /user/thomasef/pop/mapreduce/1_urban_plume/reduce.py \
-file /user/thomasef/pop/mapreduce/1_urban_plume/run_1.spec \
-file /user/thomasef/pop/mapreduce/1_urban_plume/run_2.spec \
-file /user/thomasef/pop/mapreduce/1_urban_plume/run_3.spec \
-file /user/thomasef/pop/mapreduce/1_urban_plume/partmc \
-file /user/thomasef/pop/mapreduce/1_urban_plume/spec_list.txt \
-input /user/thomasef/pop/mapreduce/1_urban_plume/spec_list.txt \
-output /user/thomasef/pop/mapreduce/1_urban_plume/houtput/ \
-mapper /user/thomasef/pop/mapreduce/1_urban_plume/map.py \
-reducer /user/thomasef/pop/mapreduce/1_urban_plume/reduce.py \
-jobconf mapred.job.tracker=local \
-jobconf fs.defualt.name=local \
-verbose \
-numReduceTasks 1