7

我想知道在使用自定义 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 >

4

2 回答 2

6

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

引导操作允许您传递对存储在 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  

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

Hadoop(集群)

您可以通过引导操作Configure 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"     

爪哇 (JVM)

您可以通过引导操作Configure Daemons指定自定义 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   
于 2012-04-05T09:42:53.593 回答
4

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

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

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

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

 > elastic-mapreduce --jar s3://mybucket/mycode.jar \
    --args "-D,mapred.reduce.tasks=0"
    --arg s3://mybucket/input \
    --arg s3://mybucket/output

应该自动将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

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

于 2012-10-31T20:40:21.573 回答