如何为amazonemr上的hadoop流作业加载额外的jar

oxf4rvwz  于 2021-06-04  发布在  Hadoop
关注(0)|答案(1)|浏览(285)

热释光;博士
如何在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 但是我已经尝试了所有的可能性(以及它们的组合!)我想不出有什么用。

k4emjkb1

k4emjkb11#

最后,我明白了(当然,这是显而易见的):
我是这样做的:
添加一个引导操作,在每个节点上下载jar,例如,您可以将jar上载到bucket中,将其公开,然后执行以下操作:

wget https://yourbucket/path/somejar.jar -O $HOME/somejar.jar
wget https://yourbucket/path/avro-1.7.7.jar -O $HOME/avro-1.7.7.jar
wget https://yourbucket/path/avro-mapred-1.7.7.jar -O $HOME/avro-mapred-1.7.7.jar

当您指定 -libjars 在可选参数中使用abosolute路径,因此:

-libjars /home/hadoop/somejar.jar,$HOME/avro-1.7.7.jar,/home/hadoop/avro-mapred-1.7.7.jar

我已经失去了几个小时,我很惭愧地说,希望这有助于其他人。
编辑(2015年2月10日)
我已经仔细检查过了,我想指出的是,当传递给optional arguments字段时,环境变量似乎没有展开。因此,使用显式$home路径(即。 /home/hadoop )
编辑(2015年2月11日)
如果要使用aws cli在amazonemr上启动流式处理作业,可以使用以下命令。

aws emr create-cluster  --ami-version '3.3.2' \
                        --instance-groups InstanceGroupType=MASTER,InstanceCount=1,InstanceType='m1.medium' InstanceGroupType=CORE,InstanceCount=2,InstanceType='m3.xlarge' \
                        --name 'TestStreamingJob' \
                        --no-auto-terminate \
                        --log-uri 's3://path/to/your/bucket/logs/' \
                        --no-termination-protected \
                        --enable-debugging \
                        --bootstrap-actions Path='s3://path/to/your/bucket/script.sh',Name='ExampleBootstrapScript' Path='s3://path/to/your/bucket/another_script.sh',Name='AnotherExample' \
                        --steps file://./steps_test.json

您可以在json文件中指定步骤:

[
 {
  "Name": "Avro",
  "Args": ["-files","s3://path/to/your/mapper.py,s3://path/to/your/reducer.py","-libjars","/home/hadoop/avro-1.7.7.jar,/home/hadoop/avro-mapred-1.7.7.jar","-inputformat","org.apache.avro.mapred.AvroAsTextInputFormat","-mapper","mapper.py","-reducer","reducer.py","-input","s3://path/to/your/input_directory/","-output","s3://path/to/your/output_directory/"],
  "ActionOnFailure": "CONTINUE",
  "Type": "STREAMING"
 }
]

(请注意,amazon官方文档有些过时,事实上它使用的是旧的amazon emr cli工具,该工具已被弃用,取而代之的是更新的aws cli)

相关问题