热释光;博士
如何在amazonelasticmapreduce(amazonemr)上上传或指定额外的jar到hadoop流作业?
长版本
我想在amazonelasticmapreduce(amazonemr)上使用hadoop分析一组avro文件(>2000个文件)。这应该是一个简单的练习,通过它我应该对mapreduce和amazonemr有一些信心(我对这两个都是新手)。
因为python是我最喜欢的语言,所以我决定使用hadoop流媒体。我用python构建了一个简单的mapper和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
作业成功完成。
我在amazons3上有一个bucket,其中一个文件夹包含所有的输入文件,另一个文件夹包含mapper和reducer脚本( mapper.py
以及 reducer.py
分别)。
使用这个接口,我创建了一个小集群,然后添加了一个引导操作,在每个节点上安装所有必需的python模块,然后添加了一个“hadoop流”步骤,指定Map器和reducer脚本在s3上的位置。
问题是我根本不知道如何上传或在选项中指定这两个jar- avro-1.7.7.jar
以及 avro-mapred-1.7.7.jar
-需要运行此作业吗?
我试过几种方法:
使用 -files
标志与 -libjars
在可选参数中;
添加另一个引导操作,在每个节点上下载jar(我尝试在节点上的不同位置下载);
我试图上传我的桶jar,并指定一个完整的 s3://...
作为参数的路径 -libjars
(注意:hadoop会主动忽略这些文件,并发出警告)在选项中;
如果我不通过这两个jar,那工作就失败了(它不认得那两个jar) -inputformat
但是我已经尝试了所有的可能性(以及它们的组合!)我想不出有什么用。
1条答案
按热度按时间k4emjkb11#
最后,我明白了(当然,这是显而易见的):
我是这样做的:
添加一个引导操作,在每个节点上下载jar,例如,您可以将jar上载到bucket中,将其公开,然后执行以下操作:
当您指定
-libjars
在可选参数中使用abosolute路径,因此:我已经失去了几个小时,我很惭愧地说,希望这有助于其他人。
编辑(2015年2月10日)
我已经仔细检查过了,我想指出的是,当传递给optional arguments字段时,环境变量似乎没有展开。因此,使用显式$home路径(即。
/home/hadoop
)编辑(2015年2月11日)
如果要使用aws cli在amazonemr上启动流式处理作业,可以使用以下命令。
您可以在json文件中指定步骤:
(请注意,amazon官方文档有些过时,事实上它使用的是旧的amazon emr cli工具,该工具已被弃用,取而代之的是更新的aws cli)