Указание mapreduce.map.java.opts без переопределения настроек памяти?

#java #hadoop #memory #mapreduce #hadoop-yarn

#java #hadoop #память #mapreduce #hadoop-yarn

Вопрос:

Я использую кластер 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 свойств, поэтому я предполагаю, что они что-то переопределяют. Есть ли способ установить -Dfile.encoding без переопределения других параметров Java?

Ответ №1:

Существует ли ранее значение для mapreduce.*.java.opts ? Обычно туда входят настройки памяти Java, такие как -Xmx etc. Таким образом, простое сохранение -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"
  

Комментарии:

1. В mapred-site.xml . Есть ли какой-нибудь способ заставить hadoop отображать все параметры, которые ему передаются?

2. Конфигурацию задания можно найти в главном интерфейсе приложения (слева вы увидите ссылку на конфигурацию). Сначала удалите настройки кодировки из mapred-site.xml задания и отправьте его, и вы сможете найти значение по умолчанию mapreduce.*.java.opts . Скопируйте их, а затем добавьте свои настройки кодировки и сделайте их своими mapreduce.*.java.opts и посмотрите, как это происходит.

3. Ты спасатель. Это сработало. Спасибо за вашу помощь!