我是Hadoop的新手,我正在尝试使用Hadoop流来并行化物理模拟,该模拟被编译成二进制。这样做的想法是使用带有每个输入文件的映射并行运行二进制文件,然后使用python还原器脚本减少单个运行的结果(由二进制代码写入文件)。
我的问题是如何传递输入文件的列表(名称),以便hadoop流将每个文件名作为映射脚本的一个键传递。这个是可能的吗?
额外的问题:理想情况下,我希望每个文件名生成一个映射器,尽管我知道直接指定映射器的数量不会提供给用户。有可能诱使Hadoop流这样做吗?
下面是我当前的设置:
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.spechadoop流作业的相关部分:
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其中spec_list.txt是:
run_1.spec
run_2.spec
run_3.spec当我尝试这样做的时候,我现在得到了这个错误:
14/08/11 15:34:33 WARN mapred.LocalJobRunner: job_local_0001
java.io.IOException: No input paths specified in job
at org.apache.hadoop.mapred.FileInputFormat.listStatus(FileInputFormat.java:152)
at org.apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.java:201)
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:138)但是,如果我调用:
cat spec_list.txt | ./map.py | sort | ./reduce.py关于这方面的任何和所有的建议都将是非常感谢的,因为我已经在这方面工作了几个星期,但没有成功,进展也非常缓慢。
发布于 2014-08-25 16:26:37
我也做过类似的事。Spec_list.txt需要包含指向每个文件的完整路径(例如/user/./filename),您需要在运行作业之前将其复制到hdfs。
https://stackoverflow.com/questions/25251789
复制相似问题