#docker #apache-spark #kubernetes #minikube
#докер #apache-spark #kubernetes #мини-куб
Вопрос:
В настоящее время у меня есть только один компьютер, и другого у меня не будет.
-
Я запускаю Spark на ядрах своего процессора:
master=local[5]
, используя его напрямую: я устанавливаюspark-core
иspark-sql
для зависимостей, не делаю никакой другой конфигурации, и мои программы запускаются немедленно. Конечно, это удобно. -
Но должен ли я попытаться создать архитектуру с master и некоторыми workers с помощью контейнеров Docker или minikube (Kubernetes) на моем компьютере?
Будет ли решение # 2 — со всеми требуемыми настройками — вознаградит меня лучшей производительностью, потому что Spark действительно предназначен для работы таким образом, даже на одном компьютере,
или я потеряю некоторое время, потому что режим, в котором я сейчас его запускаю, без использования сети, без необходимости в местоположении данных, всегда даст мне лучшую производительность, а решение # 1 всегда будет лучшим на одном компьютере?
Моя гипотеза заключается в том, что # 1 подходит. Но у меня нет истинного измерения для этого. Нет источника для сравнения. Кто испытал два способа выполнения операций на компьютере sigle?
Ответ №1:
Это действительно зависит от ваших целей — если вы всегда будете запускать свой Spark-код на одном узле с локальным мастером, то просто используйте его. Но если вы собираетесь запускать полученный код в распределенном режиме на нескольких компьютерах, то эмуляция кластера с помощью Docker может быть полезной, так как вы получите действительно распределенный код и сможете обнаружить проблемы, которые не всегда обнаруживаются при запуске вашего кода с локальным мастером.
Вместо прямого использования Docker (это может быть сложно настроить, хотя это все еще возможно), возможно, вы можете рассмотреть возможность использования Spark в Kubernetes, например, через minikube — в Google есть множество статей на эту тему.
Комментарии:
1. Ваша идея — это моя гипотеза: лучше всего придерживаться локальных настроек и не пытаться создать набор контейнеров. Но я ищу опыт, который люди конкретно привели к тому, чтобы узнать, каковы их наблюдения.
2. Я говорю исходя из моего личного практического опыта использования Docker Spark несколько лет назад, и это потребовало довольно много усилий 🙂
Ответ №2:
Проведя тестирование этого с размером исполнителя, разница с тем, когда имеет смысл использовать больше нескольких исполнителей, равна # CPUs > 32. Во время выполнения AWS EMR spark по умолчанию используется не менее 4 процессоров на исполнителя, а Databricks всегда использует исполнители fat, что означает > 32 ЦП на экземплярах 8xl. Вашим самым большим ограничением, как правило, является сборка мусора JVMs, которая ограничивает размер кучи. Локальный режим имеет пару преимуществ в производительности по сравнению с кластерным режимом.
- полный этап генерации кода должен выполняться как на диске, так и на каждом исполнителе. Для коротких запросов это может добавить несколько 100 МС на этап.
- связь с драйвером <-> исполнителем имеет задержку.
- общая память между драйвером и исполнителями. Это снижает вероятность ООМ и уменьшает объем загрузки на диск.
Люди в конечном итоге предпочитают использовать несколько исполнителей / экземпляров не потому, что это было бы быстрее, чем один экземпляр, а потому, что это единственный способ масштабирования с точки зрения объема данных и распараллеливания. (также для восстановления после сбоя)
Если вы чувствуете себя амбициозным, есть инструмент тестирования производительности под названием TPC-DS, который запускает набор запросов обработки данных к стандартизированному набору данных
https://github.com/databricks/spark-sql-perf
https://github.com/maropu/spark-tpcds-datagen
Также, если вы чувствуете себя предприимчивым, в коде spark есть скрипт для запуска мини-кластера на minikube, если вам нужен быстрый и простой способ протестировать это.