指定 mapreduce.map.java.opts 而不覆盖内存设置?

Specifying mapreduce.map.java.opts without overriding memory settings?

我正在使用 hadoop 集群 运行 mapr 5.2,它在 unicode 字符编码方面存在问题。我发现将以下行添加到 mapred-site.xml 解决了这个问题:

<property>
  <name>mapreduce.map.java.opts</name>
  <value>-Dfile.encoding=utf-8</value>
</property>
<property>
  <name>mapreduce.map.java.opts</name>
  <value>-Dfile.encoding=utf-8</value>
</property>

不幸的是,这会导致许多作业(没有这些属性也能正常工作)抛出如下错误:

Container [pid=63155,containerID=container_e40_1544666751235_12271_01_000004] is running beyond physical memory limits. Current usage: 8.0 GB of 8 GB physical memory used; 31.7 GB of 16.8 GB virtual memory used. Killing container.

我已尝试将 mapreduce.map.memory.mb 的值增加到根据此错误消息允许的最大值:

Job job_1544666751235_12267 failed with state KILLED due to: MAP capability required is more than the supported max container capability in the cluster. Killing the Job. mapResourceRequest: <memory:16000, vCores:1, disks:0.5> maxContainerCapability:<memory:8192, vCores:20, disks:4.0>

但是容器还是被杀死了。就像我说的,这些作业在设置 mapreduce.*.java.opts 属性之前运行良好,所以我假设它们覆盖了某些东西。有没有办法在不覆盖其他 Java 参数的情况下设置 -Dfile.encoding

mapreduce.*.java.opts 之前是否存在值?通常 Java 内存设置,如 -Xmx 等等。因此,仅保留 -Dfile.encoding=utf-8 可能会删除这些设置,这可能会影响其他作业。这里有两个选择

  1. 将您的编码设置附加到先前存在的值。但是这里的编码设置将适用于所有使用 mapred-site.xml
  2. 的作业
    <property>
      <name>mapreduce.map.java.opts</name>
      <value>your_earlier_existed_java_opts_value_goes_here -Dfile.encoding=utf-8</value>
    </property>
    <property>
      <name>mapreduce.reduce.java.opts</name>
      <value>your_earlier_existed_java_opts_value_goes_here -Dfile.encoding=utf-8</value>
    </property>
  1. 如果您在代码中使用 org.apache.hadoop.util.GenericOptionsParser,则 运行 仅将此值设置为您的作业。因此编码设置将仅适用于您的作业。
yarn jar <your_jar> <class> -Dmapreduce.map.java.opts="your_earlier_existed_java_opts_value_goes_here -Dfile.encoding=utf-8"