Проблема производительности параллелизма искры против Presto - PullRequest
0 голосов
/ 02 мая 2018

Мы тестируем искры с Alluxio и Presto с Alluxio. Для оценки производительности мы взяли 5 разных запросов (с некоторыми объединениями, сгруппированными и отсортированными) и выполнили его для набора данных 650 ГБ в orc.

Среда исполнения Spark настроена таким образом, что у нас постоянно работает контекст spark, и мы отправляем запросы с использованием REST api (сервер Jetty). Мы не рассматриваем время первого пакета для этого нагрузочного теста, поскольку оно занимает немного больше времени из-за десериализации задач и всего остального.

Что мы наблюдали при оценке, так это то, что когда мы выполняли отдельные запросы или даже все эти 5 запросов выполнялись одновременно, spark работает очень хорошо по сравнению с presto и заканчивает все выполнение в два раза быстрее, чем Presto.

Но для теста фактической нагрузки мы выполнили 10 пакетов (один пакет - это 5 запросов, отправленных одновременно) с интервалом 60 секунд. На данный момент Presto работает намного лучше, чем искра. Presto закончил всю работу за ~ 11 минут, а искра занимает ~ 20 минут, чтобы выполнить всю задачу.

Мы пытались использовать различные конфигурации для улучшения параллелизма, например

  • Использование 20 пулов с равным распределением ресурсов и отправка заданий в циклическом режиме.
  • Попытка использования одного пула FAIR и отправка всех заданий в этот пул по умолчанию, и пусть spark принимает решение о распределении ресурсов
  • Настройка некоторых искровых свойств, таких как spark.locality.wait и некоторых других искровых свойств, связанных с памятью.
  • Все задачи - NODE_LOCAL (мы реплицировали данные в alluxio, чтобы это произошло)
  • Также попытался воспроизвести arround с выделением памяти для исполнителя, как и для 35 небольших исполнителей (5 ядер, 30G), а также для (60core, 200G) исполнителей.

Но все приводят к одному и тому же времени выполнения. Мы использовали dstat на всех рабочих, чтобы увидеть, что происходило, когда искра выполняла задачу, и мы не могли видеть минимального ввода-вывода или сетевой активности. И процессор всегда был на уровне 95% + (похоже, он ограничен на процессоре). (Видел почти аналогично dstat out с presto)

Может кто-нибудь предложить мне что-то, что мы можем попытаться достичь аналогичных или лучших результатов, чем Presto?

И есть ли какое-то объяснение, почему presto работает лучше с параллелизмом, чем spark? Мы заметили, что первая партия Presto занимает больше времени, чем последующие партии. Presto кеширует некоторые данные в памяти, искры которых нет? Или план управления / выполнения ресурсов presto лучше, чем spark?

Примечание. Оба кластера работают с одинаковой аппаратной конфигурацией

...