Водитель координирует работу рабочих и общее выполнение заданий.
Таким образом, драйвер разбивает приложение Spark на задачи и планирует их запуск на исполнителях.
скажем, мы хотим загрузить данные из хранилища данных (у которого есть sql engine). эта работа может быть распределена между исполнителями
используя метод чтения spark jdbc, который подходит для наших нужд.
Вы можете взглянуть на эти типы чтения здесь ..
[https://spark.apache.org/docs/2.3.0/api/scala/index.html#org.apache.spark.sql.DataFrameReader][1]
с этим, скажем, мы решили использовать задачу 10, которая должна считывать данные БД параллельно между рабочими, мы можем кодировать это в программе spark.
Предположим, что в таблице 1000 записей (только для примера), и мы хотим прочитать это параллельно над
столбец с именем "ID", который имеет значения от 1 до 1000.
построение синтаксиса, как показано ниже, и вызов действия, будет считывать данные из базы данных.
val resultDf = spark.read.format("jdbc").option("url", connectionUrl)
.option("dbtable","(select * from table)")
.option("user",devUserName)
.option("password",devPassword)
.option("numPartitions", 10)
.option("partitionColumn", "ID")
.option("lowerBound", 1)
.option("upperBound", 1000)
.load()
он строит запросы примерно так, как показано ниже, чтобы каждая задача работала с хранилищем данных параллельно (при условии, что у нас достаточно ресурсов (ядер) для этой искровой работы), чтобы извлечь данные
и dataDrame resultDf построен.
task 1 :select * from table where ID <= 100
task 2 :select * from table where ID > 100 AND ID <= 200
task 3 :select * from table where ID > 200 AND ID <= 300
....
....
task 4 :select * from table where ID > 900 AND ID <= 1000
Мы должны выработать стратегию, чтобы узнать правильный столбец для раздела (partitionColumn) и количество необходимых разделов (numPartitions).