如何使用亚马逊的EMR在CLI中使用自定义jar指定mapred配置和java选项?

Ama*_*mar 7 java hadoop mapreduce elastic-map-reduce emr

我想知道如何在使用自定义jar运行流作业时指定mapreduce配置,例如mapred.task.timeout,mapred.min.split.size等.

当我们使用外部脚本语言(如ruby或python)运行时,我们可以使用以下方式指定这些配置:

ruby elastic-mapreduce -j --stream --step-name"mystream"--jobconf mapred.task.timeout = 0 --jobconf mapred.min.split.size = 52880 --mapper s3:// somepath/mapper. rb --reducer s3:somepath/reducer.rb --input s3:// somepath/input --output s3:// somepath/output

我尝试了以下方法,但没有一个工作:

  1. ruby elastic-mapreduce --jobflow --jar s3://somepath/job.jar --arg s3:// somepath/input --arg s3:// somepath/output --args -m,mapred.min.split .size = 52880 -m,mapred.task.timeout = 0

  2. ruby elastic-mapreduce --jobflow --jar s3://somepath/job.jar --arg s3:// somepath/input --arg s3:// somepath/output --args -jobconf,mapred.min.split .size = 52880 -jobconf,mapred.task.timeout = 0

我还想知道如何使用EMR中的自定义jar将java选项传递给流作业.在hadoop上本地运行时,我们可以按如下方式传递它:

bin/hadoop jar job.jar input_path output_path -D <some_java_parameter> = <some_value>

Ste*_*pel 6

Amazon Elastic MapReduce(Amazon EMR)的上下文中,您正在寻找Bootstrap操作:

Bootstrap操作允许您传递对存储在Amazon S3中的脚本的引用.此脚本可以包含与Hadoop或Elastic MapReduce相关的配置设置和参数.引导操作在Hadoop启动之前和节点开始处理数据之前运行.[强调我的]

从CLI运行自定义启动操作提供了一个通用的用法示例:

& ./elastic-mapreduce --create --stream --alive \
--input s3n://elasticmapreduce/samples/wordcount/input \
--mapper s3://elasticmapreduce/samples/wordcount/wordSplitter.py \
--output s3n://myawsbucket 
--bootstrap-action s3://elasticmapreduce/bootstrap-actions/download.sh  
Run Code Online (Sandbox Code Playgroud)

特别是,有单独的引导操作来配置Hadoop和Java:

Hadoop(集群)

您可以通过引导操作指定Hadoop设置配置Hadoop,它允许您设置群集范围的Hadoop设置,例如:

$ ./elastic-mapreduce --create \
--bootstrap-action s3://elasticmapreduce/bootstrap-actions/configure-hadoop \
--args "--site-config-file,s3://myawsbucket/config.xml,-s,mapred.task.timeout=0"     
Run Code Online (Sandbox Code Playgroud)

Java(JVM)

您可以通过引导操作指定自定义JVM设置配置守护程序:

此预定义的引导操作允许您为Hadoop守护程序指定堆大小或其他Java虚拟机(JVM)选项.您可以使用此引导操作为需要比默认情况下Hadoop分配更多内存的大型作业配置Hadoop.您还可以使用此引导操作来修改高级JVM选项,例如垃圾回收行为.

提供的示例将堆大小设置为2048并配置Java namenode选项:

$ ./elastic-mapreduce –create –alive \
  --bootstrap-action s3://elasticmapreduce/bootstrap-actions/configure-daemons \
  --args --namenode-heap-size=2048,--namenode-opts=-XX:GCTimeRatio=19   
Run Code Online (Sandbox Code Playgroud)


Dol*_*cci 4

我相信如果你想在每个工作的基础上设置这些,那么你需要

A) 对于自定义 Jars,将它们作为参数传递到您的 jar 中,然后自己处理它们。我相信这可以自动化如下:

public static void main(String[] args) throws Exception {
  Configuration conf = new Configuration();
  args = new GenericOptionsParser(conf, args).getRemainingArgs();
  //....
}
Run Code Online (Sandbox Code Playgroud)

然后以这种方式创建作业(尚未验证是否有效):

 > elastic-mapreduce --jar s3://mybucket/mycode.jar \
    --args "-D,mapred.reduce.tasks=0"
    --arg s3://mybucket/input \
    --arg s3://mybucket/output
Run Code Online (Sandbox Code Playgroud)

GenericOptionsParser自动将 -D 和 -jobconf 参数传输到 Hadoop 的作业设置中。更多详细信息:http://hadoop.apache.org/docs/r0.20.0/api/org/apache/hadoop/util/GenericOptionsParser.html

B) 对于 hadoop 流 jar,您也只需将配置更改传递给命令

> elastic-mapreduce --jobflow j-ABABABABA \
   --stream --jobconf mapred.task.timeout=600000 \
   --mapper s3://mybucket/mymapper.sh \
   --reducer s3://mybucket/myreducer.sh \
   --input s3://mybucket/input \
   --output s3://mybucket/output \
   --jobconf mapred.reduce.tasks=0
Run Code Online (Sandbox Code Playgroud)

更多详细信息: https: //forums.aws.amazon.com/thread.jspa? threadID =43872 和elastic-mapreduce --help