# #scala #apache-spark #google-cloud-dataproc
Вопрос:
У меня есть кластер spark, состоящий из главного и двух рабочих узлов.
При выполнении следующего кода для извлечения данных из базы данных фактическое выполнение выполняется мастером, а не одним из работников.
sparkSession.read
.format("jdbc")
.option("url", jdbcURL)
.option("user", user)
.option("query", query)
.option("driver", driverClass)
.option("fetchsize", fetchsize)
.option("numPartitions", numPartitions)
.option("queryTimeout", queryTimeout)
.options(options)
.load()
Является ли это ожидаемым поведением?
Есть ли какой-то способ отключить это поведение?
Комментарии:
1. Он должен выполняться на рабочих узлах, если только один другой исполнитель не создан на самом главном узле. каково поведение, когда вы запускаете другие общие операции с искрой, такие как groupBy/count и т. Д. ? Вы отслеживали и сравнивали то и другое ?
2. Как вы создаете свой сеанс spark (и какова его конфигурация)? Как вы проверяете, выполняется ли работа на главном или рабочем узлах?
3. @Sanket9394 в каком случае исполнитель создается на главном узле?
Ответ №1:
Приложения Spark имеют два типа исполнителей: драйвер и исполнитель, а также два типа операций: преобразование и действие. Согласно этому документу:
RDDs поддерживают два типа операций: преобразования, которые создают новый набор данных из существующего, и действия, которые возвращают значение программе-драйверу после выполнения вычисления с набором данных. Например, map-это преобразование, которое пропускает каждый элемент набора данных через функцию и возвращает новый RDD, представляющий результаты. С другой стороны, сокращение-это действие, которое объединяет все элементы RDD с помощью некоторой функции и возвращает конечный результат программе-драйверу (хотя существует также параллельный reduceByKey, который возвращает распределенный набор данных).
…
Все преобразования в Spark являются ленивыми, поскольку они не вычисляют свои результаты сразу. Вместо этого они просто запоминают преобразования, примененные к некоторому базовому набору данных (например, файлу). Преобразования вычисляются только в том случае, если для выполнения действия требуется, чтобы результат был возвращен программе драйвера. Такая конструкция позволяет Spark работать более эффективно. Например, мы можем понять, что набор данных, созданный с помощью карты, будет использоваться в уменьшении и вернет драйверу только результат уменьшения, а не более крупный сопоставленный набор данных.
Таким образом, в приложении Spark некоторые операции выполняются в исполнителях, некоторые операции выполняются в драйверах. В Dataproc исполнители всегда находятся в контейнерах YARN на рабочем узле. Но драйверы могут быть на главном узле или на рабочих узлах. По умолчанию используется «режим клиента», что означает, что драйверы запускаются на главном узле за пределами YARN. Но вы можете использовать gcloud dataproc jobs submit spark ... --properties spark.submit.deployMode=cluster
, чтобы включить «режим кластера», который будет запускать драйверы в контейнерах YARN на рабочих узлах. Смотрите этот документ для получения более подробной информации.