Мы сравниваем 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 минут, чтобы выполнить все задачи.
Мы пробовали разные конфигурации для улучшения искрового параллелизма, например
spark.locality.wait
, и некоторых других свойств искры, связанных с памятью.Но все они имеют одинаковое время выполнения.
Мы использовали dstat
на всех воркерах, чтобы увидеть, что происходило, когда Spark выполнял задачу, и мы не могли видеть никакой или минимальной активности ввода-вывода или сетевой активности. И ЦП всегда был на 95% + (похоже, что он ограничен ЦП). (Видел почти аналогичный dstat с presto)
Может ли кто-нибудь предложить мне что-то, что мы можем попытаться достичь аналогичных или лучших результатов, чем presto?
И какое объяснение, почему presto лучше работает с параллелизмом, чем Spark? Мы заметили, что первая партия presto занимает больше времени, чем последующие партии. Кэширует ли presto некоторые данные в памяти, искра которой отсутствует? Или план управления ресурсами / выполнения presto лучше, чем Spark?
Примечание. Оба кластера работают с одинаковой конфигурацией оборудования.
Какие версии Presto и Spark вы используете? Это может иметь большое значение. Кроме того, Spark имеет тенденцию обрабатывать данные в формате Parquet более эффективно, чем ORC. Только недавно Spark (2.3) получил поддержку считывателя ORC векторизованный. issues.apache.org/jira/browse/SPARK-16060, а также дополнительная информация о преимуществах производительности нового считывателя slideshare.net/Hadoop_Summit/….
Отвечая на один из ваших вопросов - presto не кэширует данные в памяти (если вы не используете какой-то специальный коннектор, который бы это делал). В любом случае - вы сравниваете готовую производительность Presto с кластером Spark, на настройку которого вы потратили свое время и опыт. Даже если вы в конечном итоге заставите Spark работать наравне или быстрее, это будет не совсем справедливое сравнение. Вы также должны использовать время а также для оптимальной настройки Presto, иначе это яблоки против апельсинов.
Версия @Jon Spark - 2.3.0 и presto 0.194
@PiotrFindeisen На самом деле мы потратили достаточно времени и на предварительную настройку. Первоначально presto использовала только 70% процессора, и мы настроили его так, чтобы он составлял почти 95% процессора.
Как по мне, это ожидаемый результат. Spark Sql (экономичный сервер) плохо справляется с многопользовательской работой. то, что они фактически заявляют в своем документе.
Для первого теста с Presto ваш кластер, вероятно, неправильно настроен. Presto очень хорошо справляется с выполнением отдельных запросов и должен быть доступен для использования всех доступных ресурсов. Обычно это вызвано нехваткой данных (разбиений) и полным параллелизмом. Когда вы запускаете несколько запросов, вы можете использовать все ресурсы.