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



我使用的是运行mapr 5.2的hadoop集群,该集群在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是否存在早期值?通常,像-Xmx等Java内存设置都会在其中。因此,仅仅保留-Dfile.encoding=utf-8可能已经删除了这些设置,这可能会影响其他作业。这里有两个选项

  1. 将您的编码设置附加到先前存在的值。但这里的编码设置将适用于使用该mapred-site.xml的所有作业
<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"

最新更新