Я пытаюсь понять взаимосвязь количества ядер и количества исполнителей при запуске задания Spark на YARN.
Тестовая среда выглядит следующим образом:
- Количество узлов данных: 3
- Спецификация машины узла данных:
- Процессор: Core i7-4790 (количество ядер: 4, количество потоков: 8)
- Оперативная память: 32 ГБ (8 ГБ х 4)
- HDD: 8 ТБ (2 ТБ х 4)
Сеть: 1 Гб
Версия Spark: 1.0.0
Версия Hadoop: 2.4.0 (Hortonworks HDP 2.1)
Spark поток работ: sc.textFile -> фильтр -> карта -> фильтр -> mapToPair -> ReduceByKey -> карта -> saveAsTextFile
Входные данные
- Тип: один текстовый файл
- Размер: 165 ГБ
- Количество строк: 454 568 833
Вывод
- Количество строк после второго фильтра: 310 640 717
- Количество строк в файле результатов: 99,848,268
- Размер файла результата: 41 ГБ
Задание было запущено со следующими конфигурациями:
--master yarn-client --executor-memory 19G --executor-cores 7 --num-executors 3
(исполнители на узел данных, используйте столько же, сколько ядер)--master yarn-client --executor-memory 19G --executor-cores 4 --num-executors 3
(количество ядер уменьшено)--master yarn-client --executor-memory 4G --executor-cores 2 --num-executors 12
(меньше ядра, больше исполнителя)
Истекшие времена:
50 мин 15 сек
55 мин 48 сек
31 мин 23 сек
К моему удивлению, (3) было намного быстрее.
Я думал, что (1) будет быстрее, так как при перетасовке будет меньше общения между исполнителями.
Хотя количество ядер в (1) меньше, чем (3), количество ядер не является ключевым фактором, так как 2) работает хорошо.
(Подписки добавлены после ответа pwilmot.)
Для информации, снимок экрана монитора производительности выглядит следующим образом:
- Сводка узла данных Ganglia для (1) - задание началось в 04:37.
- Сводка узла данных Ganglia для (3) - задание началось в 19:47. Пожалуйста, игнорируйте график до этого времени.
График примерно делится на 2 раздела:
- Во-первых: от начала до уменьшенияByKey: загрузка процессора, нет активности сети
- Второе: после lowerByKey: ЦП понижается, сетевой ввод / вывод завершен.
Как видно из графика, (1) может использовать столько мощности процессора, сколько было указано. Таким образом, это может быть не проблема количества потоков.
Как объяснить этот результат?