Map-Reduce输入拆分不按预期工作

时间:2018-05-05 10:53:45

标签: python amazon-s3 mapreduce hadoop2 hadoop-streaming

我正在尝试在hadoop2集群中运行hadoop流应用程序。我正在使用以下配置来启动应用程序

hadoop jar /usr/lib/hadoop2/share/hadoop/tools/lib/hadoop-streaming.jar \
-D mapred.job.name=step01_load_delta_customer_events \
-D mapreduce.input.fileinputformat.split.minsize=134217728 \
-D mapreduce.job.reduces=10 \
-D mapreduce.map.memory.mb=4704 \
-D mapreduce.map.java.opts=-Xmx4416m \
-D stream.map.input.ignoreKey=true  \
-D mapreduce.map.output.compress=true \
-D mapreduce.output.fileoutputformat.compress=true \
-D mapreduce.output.fileoutputformat.compress.type=BLOCK \
-D mapred.max.map.failures.percent=7 \
-D mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.GzipCodec \
-D mapreduce.map.output.compress.codec=com.hadoop.compression.lzo.LzoCodec \
-D mapred.output.committer.class=org.apache.hadoop.mapred.DirectFileOutputCommitter \
-D mapreduce.use.directfileoutputcommitter=true \
-files <file path>  \
-mapper <mapper code in python>  \
-reducer <reduce code in python>  \
-input "$INPUT"  \
-outputformat org.apache.hadoop.mapred.TextOutputFormat  \
-output "$OUTPUT"

我的输入文件保存在AWS S3中,我的输入路径中有5400个s3对象。输入对象大小从1MB到100MB不等,总输入大小约为25GB。根据我的输入拆分大小配置,我预计会运行200个映射器任务。但是在运行应用程序时,有5400个映射器任务正在运行,这与我输入中的s3对象的数量完全相同。我认为这会影响我的应用程序的性能。有人可以帮我理解这种行为。另外在这种情况下如何控制映射器的数量?我的应用程序在qubole hadoop2集群中运行。

2 个答案:

答案 0 :(得分:0)

问题在于输入格式。我使用combineTextInputFormat而不是textInputFormat,输入拆分工作正常。

答案 1 :(得分:0)

我的hadoop流媒体作业运行缓慢,只能运行2个映射器。我添加了选项&#34; -D mapreduce.input.fileinputformat.split.maxsize = 33554432 -inputformat org.apache.hadoop.mapred.lib.CombineTextInputFormat&#34;,它确实使用了许多映射器但是给出了空结果。输入未压缩。

当没有指定&#34; -inputformat org.apache.hadoop.mapred.lib.CombineTextInputFormat&#34;时,split.maxsize将没有任何效果,它仍然只使用2个映射器。

是什么导致这个?日志未显示有用的调试信息。