这个问题在这里已有答案:
我在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 回答
在
read.jdbc(..numPartitions..)
中,numPartitions
是您的数据(Dataframe / Dataset)具有的分区数 . 换句话说,读取数据帧上的所有后续操作都将具有等于numPartitions
的并行度 . (此选项还控制对JDBC源进行的并行连接数 . )要理解
--num-executors
,--executor-cores
,--executor-memory
,您应该理解Task
的概念 . 您在Dataframe(或数据集)上执行的每个操作都会转换为Dataframe分区上的Task
. 因此,对于数据的每个分区,每个操作都存在一个Task
.Task
在Executor
上执行 .--num-executors
控制将由Spark生成的执行程序的数量;因此,这可以控制Tasks
的并行性 . 另外两个选项--executor-cores
和--executor-memory
控制您为每个执行程序提供的资源 . 除其他外,这取决于您希望在每台机器上执行的执行程序的数量 .P.S:这假设您手动分配资源 . Spark也能够dynamic allocation .
有关此内容的更多信息,您可以使用以下链接:
Spark Configuration
Related StackOverflow Post
EDITS:
以下声明有一个重要的警告:
诸如连接和聚合(涉及shuffle)之类的操作以及诸如union(其不会混洗数据)之类的操作可能会改变分区因子 .