#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
могло привести к удалению этих настроек, и это могло повлиять на другие задания. Здесь у вас есть два варианта
- Добавьте свои настройки кодировки к ранее существовавшему значению. Но здесь настройка кодировки будет применима ко всем заданиям, использующим это
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>
- Установите это значение только для вашего задания во время выполнения, при условии, что вы используете
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. Ты спасатель. Это сработало. Спасибо за вашу помощь!