【发布时间】:2015-02-07 21:17:01
【问题描述】:
TL;DR
如何将其他 JAR 上传或指定到 Amazon Elastic MapReduce (Amazon EMR) 上的 Hadoop 流作业?
加长版
我想在 Amazon Elastic MapReduce (Amazon EMR) 上使用 Hadoop 分析一组 Avro 文件(> 2000 个文件)。这应该是一个简单的练习,通过它我应该对 MapReduce 和 Amazon EMR 有信心(我对这两者都是新手)。
由于 python 是我最喜欢的语言,我决定使用Hadoop Streaming。我在python中构建了一个简单的映射器和reducer,并在本地Hadoop(单节点安装)上对其进行了测试。我在本地 Hadoop 安装上发出的命令是这样的:
$HADOOP_PREFIX/bin/hadoop jar $HADOOP_PREFIX/share/hadoop/tools/lib/hadoop-streaming-2.4.0-amzn-1.jar \
-files avro-1.7.7.jar,avro-mapred-1.7.7.jar \
-libjars avro-1.7.7.jar,avro-mapred-1.7.7.jar \
-input "input" \
-mapper "python2.7 $PWD/mapper.py" \
-reducer "python2.7 $PWD/reducer.py" \
-output "output/outdir" \
-inputformat org.apache.avro.mapred.AvroAsTextInputFormat
作业成功完成。
我在 Amazon S3 上有一个存储桶,其中一个文件夹包含所有输入文件,另一个文件夹包含映射器和减速器脚本(分别为 mapper.py 和 reducer.py)。
使用我创建了一个小集群的界面,然后我添加了一个bootstrap action 以在每个节点上安装所有必需的python 模块,然后我添加了一个"Hadoop Streaming" step 指定映射器和reducer 脚本的位置S3.
问题在于,我对如何上传或在选项中指定两个 JAR - avro-1.7.7.jar 和 avro-mapred-1.7.7.jar - 运行此作业所需的方法一无所知?
我已经尝试了几件事:
- 在可选参数中将
-files标志与-libjars结合使用; - 添加另一个在每个节点上下载 JAR 的引导操作(我已尝试在节点上的不同位置下载它);
- 我已尝试将 JAR 上传到我的存储桶中,并在选项中指定完整的
s3://...路径作为-libjars的参数(注意:这些文件被 Hadoop 主动忽略,并发出警告);李>
如果我没有通过这两个 JAR,则作业将失败(它无法识别 -inputformat 类),但我已经尝试了所有我能想到的可能性(及其组合!)但无济于事。
【问题讨论】:
标签: python hadoop jar streaming amazon-emr