Я мигрировал с Hadoop 1 на Hadoop 2 YARN. Исходный код был перекомпилирован с использованием JAR-файлов MRV2 и не имел проблем с совместимостью. Когда я пытался запустить задание в YARN, карта работала нормально и достигла 100%, но сокращение застряло на ~ 6,7%. Нет проблем с производительностью. На самом деле, я проверил загрузку ЦП, оказалось, что когда редукция зависла, кажется, что вычислений не происходит, потому что ЦП в основном на 100% простаивает. Задание может успешно выполняться в Hadoop 1.2.1.
Я проверил сообщения журнала от resourcemanager и обнаружил, что после завершения карты больше не было выделено контейнеров, поэтому ни в одном контейнере не выполняется сокращение. Чем вызвана эта ситуация?
Мне интересно, связано ли это с настройкой свойства yarn.nodemanager.aux-services. Следуя официальному руководству(http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/SingleCluster.html), для этого свойства должно быть установлено значение mapreduce_shuffle, которое указывает, что MR по-прежнему будет использовать метод случайного воспроизведения по умолчанию вместо другого метода случайного воспроизведения. плагины(http://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/PluggableShuffleAndPluggableSort.html). Я пытался не устанавливать это свойство, но Hadoop не позволял.
Вот журнал userlogs/applicationforlder/containerfolder/syslog, когда он вот-вот достигнет 7% сокращения. После этого журнал больше не обновлялся, и сокращение также прекратилось.
2014-11-26 09:01:04,104 INFO [fetcher#1] org.apache.hadoop.mapreduce.task.reduce.Fetcher: fetcher#1 about to shuffle output of map attempt_1416988910568_0001_m_002988_0 decomp: 129587 len: 129591 to MEMORY
2014-11-26 09:01:04,104 INFO [fetcher#1] org.apache.hadoop.mapreduce.task.reduce.InMemoryMapOutput: Read 129587 bytes from map-output for attempt_1416988910568_0001_m_002988_0
2014-11-26 09:01:04,104 INFO [fetcher#1] org.apache.hadoop.mapreduce.task.reduce.MergeManagerImpl: closeInMemoryFile -> map-output of size: 129587, inMemoryMapOutputs.size() -> 2993, commitMemory -> 342319024, usedMemory ->342448611
2014-11-26 09:01:04,105 INFO [fetcher#1] org.apache.hadoop.mapreduce.task.reduce.Fetcher: fetcher#1 about to shuffle output of map attempt_1416988910568_0001_m_002989_0 decomp: 128525 len: 128529 to MEMORY
2014-11-26 09:01:04,105 INFO [fetcher#1] org.apache.hadoop.mapreduce.task.reduce.InMemoryMapOutput: Read 128525 bytes from map-output for attempt_1416988910568_0001_m_002989_0
2014-11-26 09:01:04,105 INFO [fetcher#1] org.apache.hadoop.mapreduce.task.reduce.MergeManagerImpl: closeInMemoryFile -> map-output of size: 128525, inMemoryMapOutputs.size() -> 2994, commitMemory -> 342448611, usedMemory ->342577136
2014-11-26 09:01:04,105 INFO [fetcher#1] org.apache.hadoop.mapreduce.task.reduce.ShuffleSchedulerImpl: datanode03:13562 freed by fetcher#1 in 13ms
Было ли это распространенной проблемой при переходе с Hadoop 1 на 2? Была ли изменена стратегия запуска map-shuffle-sort-reduce в Hadoop 2? Что вызвало эту проблему? Большое спасибо. Любые комментарии помогут!
Основные настройки среды:
- Версия Hadoop: 2.5.2
- Кластер из 6 узлов с 8-ядерным ЦП, 15 ГБ памяти на каждом узле
Настройки связанных свойств:
- пряжа.планировщик.максимальное-распределение-мб: 14336
- yarn.scheduler.minimum-allocation-mb: 2500
- пряжа.nodemanager.resource.memory-mb: 14336
- yarn.nodemanager.aux-услуги: mapreduce_shuffle
- mapreduce.task.io.sort.factor: 100
- mapreduce.task.io.sort.mb: 1024