我尝试了以下引导操作的组合来增加作业的堆大小,但似乎都不起作用:
--mapred-key-value mapred.child.java.opts=-Xmx1024m
--mapred-key-value mapred.child.ulimit=unlimited
--mapred-key-value mapred.map.child.java.opts=-Xmx1024m
--mapred-key-value mapred.map.child.ulimit=unlimited
-m mapred.map.child.java.opts=-Xmx1024m
-m mapred.map.child.ulimit=unlimited
-m mapred.child.java.opts=-Xmx1024m
-m mapred.child.ulimit=unlimited
什么是正确的语法?
有两种选择可以实现这一点:
自定义JVM设置
为了应用自定义设置,您可能需要查看Amazon Elastic MapReduce(Amazon EMR)的Bootstrap Actions文档,特别是操作Configure Daemons:
此预定义的引导操作允许您指定堆大小或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
预定义的JVM设置
或者,根据常见问题解答如何为我的作业流配置Hadoop设置如果你的作业流任务是内存密集型的,你可以选择每个核心使用更少的任务,并减少你的作业跟踪器堆大小。对于这种情况,预定义的引导操作可用于在启动时配置作业流-这是指配置内存密集型工作负载的操作,允许您将集群范围的Hadoop设置设置为适合内存密集型负载的作业流的值,例如:
$ ./elastic-mapreduce --create
--bootstrap-action
s3://elasticmapreduce/bootstrap-actions/configurations/latest/memory-intensive
Hadoop内存密集型配置设置中列出了此预定义引导操作应用的特定配置设置。
祝你好运!
Steffen的回答很好,很有效。另一方面,如果你只是想要一些快速而肮脏的东西,并且只想替换一两个变量,那么你可能只想通过如下命令行来更改它:
elastic-mapreduce --create
--bootstrap-action s3://elasticmapreduce/bootstrap-actions/configure-hadoop
--args "-m,mapred.child.java.opts=-Xmx999m"
我看到了另一个文档,尽管是一个旧文档,它只是在一个引号中引用整个表达式,如下所示:
--bootstrap-action "s3://elasticmapreduce/bootstrap-actions/configure-hadoop -m
mapred.child.java.opts=-Xmx999m" ### I tried this style, it no longer works!
无论如何,这在AWS EMR文档中并不容易找到。我怀疑mapred.child.java.opts是被覆盖最多的变量之一——当我收到GC错误时,我也在寻找答案:"java.lang.OutOfMemoryError:GC开销限制超出",并偶然发现了这个页面。200米的默认值太小了(关于默认值的文档)。
祝你好运!