У меня есть вопрос о последовательной обработке в пакете Spark. Вот стилизованная версия вопроса, на который я пытаюсь получить ответ для простоты.
import org.apache.spark.sql.SparkSession
val spark = SparkSession
.builder()
.appName("Simple Dataframe Processing")
.config("spark.some.config.option", "some-value")
.getOrCreate()
// For implicit conversions like converting RDDs to DataFrames
import spark.implicits._
val df = spark.read.json("devices.json")
// Displays the content of the DataFrame to stdout
df.show()
// +-------------------------+
// | device-guid| Operation|
// +----+-------+-------------
// |1234 | Add 3 |
// |1234 | Sub 3 |
// |1234 | Add 2 |
// |1234 | Sub 2 |
// |1234 | Add 1 |
// |1234 | Sub 1 |
// +----+-------+------------+
//I have a Database with one table with following columns
// device-guid (primary key) result
//I would like to take df and for each row in the df do a update operation to a single DB row, Adding or removing number as described in Operation column
//So the result I am expecting at the end of this in the DB is a single row with
// device-guid result
// 1234 0
df.foreach { row =>
UpdateDB(row) //Update the DB with the row's Operation.
//Actual method not shown
}
Допустим, я запускаю это в искровом кластере с YARN с 5 исполнителями по 2 ядра на 5 рабочих узлах.
Что в Spark гарантирует, что операция UpdateDB запланирована и выполнена в последовательности строк в кадре данных, а не когда-либо запланирована и выполняется параллельно?
Т.е. я всегда хочу получить ответ 0 в столбце результатов в моей БД.
В более широком смысле вопрос заключается в том, «что гарантирует последовательную обработку операций на фрейме данных даже с несколькими исполнителями и ядрами»?
Можете ли вы указать мне документ Spark, в котором указано, что эти задачи будут обрабатываться последовательно?
Есть ли какое-либо свойство Spark, которое необходимо установить, чтобы это работало?
С уважением,
Venkat