Я намагаюся зрозуміти взаємозв'язок кількості ядер та кількості виконавців під час виконання завдання Spark на YARN.
Тестове середовище таке:
- Кількість вузлів даних: 3
- Технічні характеристики вузла даних:
- Процесор: Core i7-4790 (кількість ядер: 4, кількість потоків: 8)
- ОЗУ: 32 ГБ (8 ГБ х 4)
- Жорсткий диск: 8 ТБ (2 ТБ х 4)
Мережа: 1 Гбіт
Версія іскри: 1.0.0
Версія Hadoop: 2.4.0 (Hortonworks HDP 2.1)
Іскровий потік завдань: sc.textFile -> фільтр -> карта -> фільтр -> mapToPair -> зменшитиByKey -> карта -> saveAsTextFile
Вхідні дані
- Тип: єдиний текстовий файл
- Розмір: 165GB
- Кількість рядків: 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), #of ядер не є ключовим фактором, оскільки 2) спрацювали добре.
(Дописи додано після відповіді pwilmot.)
Для інформації захоплення екрана монітора продуктивності виглядає наступним чином:
- Підсумок вузла даних Ganglia для (1) - робота розпочата о 04:37.
- Підсумок вузла даних Ganglia для (3) - робота розпочата о 19:47. Будь ласка, ігноруйте графік до цього часу.
Графік приблизно розділений на 2 розділи:
- По-перше: від запуску до зниженняByKey: процесор інтенсивний, відсутність мережевої активності
- По-друге: після reduByKey: процесор знижується, мережевий ввод-вивід робиться.
Як показує графік, (1) може використовувати стільки потужностей процесора, скільки було дано. Отже, це може бути не проблема кількості потоків.
Як пояснити цей результат?