我在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
我不明白的是,如果两者都用于并行处理,彼此之间有何不同?
有人能让我知道上述选择之间的区别吗?
答案 0 :(得分:3)
在read.jdbc(..numPartitions..)
中,numPartitions
是数据(数据帧/数据集)具有的分区数。换句话说,读取的数据帧上的所有后续操作将具有等于numPartitions
的并行度。 (此选项还控制到JDBC源的并行连接数。)
要了解--num-executors
,--executor-cores
,--executor-memory
,您应该了解Task
的概念。您对数据框(或数据集)执行的每个操作都将转换为数据框分区上的Task
。因此,在每个数据分区上的每个操作都存在一个Task
。
Task
在Executor
上执行。 --num-executors
控制Spark产生的执行程序的数量;因此,这控制了Tasks
的并行性。其他两个选项--executor-cores
和--executor-memory
控制您提供给每个执行者的资源。除其他外,这取决于您希望在每台计算机上拥有的执行程序的数量。
P.S:假定您正在手动分配资源。 Spark还具有dynamic allocation的功能。
有关此的更多信息,您可以使用以下链接:
编辑:
以下声明有一个重要警告:
对读取的数据帧的所有后续操作的并行度将等于
numPartitions
。
诸如联接和聚合(涉及随机排序)之类的操作以及诸如union(不对数据进行随机整理)之类的操作可能会改变分区因子。