从spark.read中的option(“ numPartitions”,x)提交的spark-submit中的num-executors,executor-cores,executor-memory有什么区别?

时间:2018-09-18 08:56:04

标签: apache-spark apache-spark-sql

我在PostgreSQL DB上读取RDBMS表为:

val dataDF    = spark.read.format("jdbc").option("url", connectionUrl)
                            .option("dbtable", s"(${execQuery}) as year2017")
                            .option("user", devUserName)
                            .option("password", devPassword)
                            .option("numPartitions",10)
                            .load()

选项:numPartitions表示将数据分割成几个分区,然后以并行方式处理每个分区,在这种情况下,它是:10.我认为这是一个很不错的选择,直到我遇到了令人敬畏的功能spark-submit:--num-executors,--executor-cores,--executor-memory。我从以下链接中通过spark-submit读取了上述三个参数的概念:here

我不明白的是,如果两者都用于并行处理,彼此之间有何不同?

有人能让我知道上述选择之间的区别吗?

1 个答案:

答案 0 :(得分:3)

read.jdbc(..numPartitions..)中,numPartitions是数据(数据帧/数据集)具有的分区数。换句话说,读取的数据帧上的所有后续操作将具有等于numPartitions的并行度。 (此选项还控制到JDBC源的并行连接数。)

要了解--num-executors--executor-cores--executor-memory,您应该了解Task的概念。您对数据框(或数据集)执行的每个操作都将转换为数据框分区上的Task。因此,在每个数据分区上的每个操作都存在一个Task

TaskExecutor上执行。 --num-executors控制Spark产生的执行程序的数量;因此,这控制了Tasks的并行性。其他两个选项--executor-cores--executor-memory控制您提供给每个执行者的资源。除其他外,这取决于您希望在每台计算机上拥有的执行程序的数量。

P.S:假定您正在手动分配资源。 Spark还具有dynamic allocation的功能。

有关此的更多信息,您可以使用以下链接:


编辑:

以下声明有一个重要警告:

  

对读取的数据帧的所有后续操作的并行度将等于numPartitions

诸如联接和聚合(涉及随机排序)之类的操作以及诸如union(不对数据进行随机整理)之类的操作可能会改变分区因子。