Spark批处理中的顺序处理

时间:2018-10-29 21:42:37

标签: apache-spark apache-spark-sql scheduled-tasks

我对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的Spark集群中运行此程序,它具有5个执行程序,在5个工作程序节点上各有2个核心。 Spark中的什么能保证UpdateDB操作按数据帧中的行顺序进行调度和执行,而不是EVER并行进行调度和执行?

即我一直想在数据库的结果列中得到0的答案。

从广义上讲,问题是:“即使有多个执行者和内核,也能保证对数据帧上的操作进行顺序处理?”

您能指出一些将按顺序处理这些任务的Spark文档吗?

是否需要设置任何Spark属性才能使其正常工作?

此致

Venkat

1 个答案:

答案 0 :(得分:2)

  

从广义上讲,问题是:“即使有多个执行者和内核,也能保证对数据帧上的操作进行顺序处理?”

除了完全没有并行性外,什么都没有,或者只有一个分区。

单个内核可能会产生类似的效果,但不能保证特定的块顺序。

如果您确实需要顺序处理,那么您使用的是错误的工具。