Проблема с производительностью параллелизма Spark по сравнению с Presto

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

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

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

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

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

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

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

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

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

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

Для первого теста с Presto ваш кластер, вероятно, неправильно настроен. Presto очень хорошо справляется с выполнением отдельных запросов и должен быть доступен для использования всех доступных ресурсов. Обычно это вызвано нехваткой данных (разбиений) и полным параллелизмом. Когда вы запускаете несколько запросов, вы можете использовать все ресурсы.

Dain Sundstrom 02.05.2018 19:37

Какие версии Presto и Spark вы используете? Это может иметь большое значение. Кроме того, Spark имеет тенденцию обрабатывать данные в формате Parquet более эффективно, чем ORC. Только недавно Spark (2.3) получил поддержку считывателя ORC векторизованный. issues.apache.org/jira/browse/SPARK-16060, а также дополнительная информация о преимуществах производительности нового считывателя slideshare.net/Hadoop_Summit/….

Jon 02.05.2018 19:56

Отвечая на один из ваших вопросов - presto не кэширует данные в памяти (если вы не используете какой-то специальный коннектор, который бы это делал). В любом случае - вы сравниваете готовую производительность Presto с кластером Spark, на настройку которого вы потратили свое время и опыт. Даже если вы в конечном итоге заставите Spark работать наравне или быстрее, это будет не совсем справедливое сравнение. Вы также должны использовать время а также для оптимальной настройки Presto, иначе это яблоки против апельсинов.

Piotr Findeisen 03.05.2018 09:15

Версия @Jon Spark - 2.3.0 и presto 0.194

Rijo Joseph 04.05.2018 06:52

@PiotrFindeisen На самом деле мы потратили достаточно времени и на предварительную настройку. Первоначально presto использовала только 70% процессора, и мы настроили его так, чтобы он составлял почти 95% процессора.

Rijo Joseph 04.05.2018 06:54

Как по мне, это ожидаемый результат. Spark Sql (экономичный сервер) плохо справляется с многопользовательской работой. то, что они фактически заявляют в своем документе.

Grigoriev Nick 11.05.2018 15:03
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
6
855
0

Другие вопросы по теме