我需要一些帮助来了解Spark如何决定分区的数量以及如何在执行者中处理它们,我为这个问题感到抱歉,因为我知道这是一个重复的问题,但甚至仍然阅读了很多文章后,我无法理解我正在使用现实生活中的用例,以及我的Spark提交配置和群集配置。
我的硬件配置:
3 Node machine with total Vcores=30 and Total Memory=320 GB.
spark-submit config:
spark-submit
--verbose
--master yarn
--deploy-mode cluster
--num-executors 1
--executor-memory 3g
--executor-cores 2
--conf spark.yarn.maxAppAttempts=1
--conf spark.yarn.am.attemptFailuresValidityInterval=1h
--conf spark.driver.memory=1000m
--conf spark.speculation=true
我使用Spark DataFrame JDBC API从MySQL数据库中读取:
val jdbcTable= sqlContext.read.format("jdbc").options(
Map(
"url" -> jdcbUrl,
"driver" -> "net.sourceforge.jtds.jdbc.Driver",
"dbtable" ->
s"(SELECT * FROM SOMETHING WHERE COLUMN > ${lastExtractUnixTime}) as t"))
.load
JDBCTABLE DATAFRAME创建的分区总数为200
问题:
200
分区是如何出现的,这是默认设置吗?我只有1个执行程序,
200
分区是否在单个执行程序中并行处理,或者一次处理一个分区?executor-cores
是否用于使用配置的并发性(在我的情况下)处理每个分区中的任务?
- 正如现在写的那样,Spark将仅使用1个分区。
-
如果您看到200个分区,则意味着:
- 随后没有代码中显示的混乱(Exchange)。
- 您使用
spark.sql.shuffle.partitions
的默认值。
-
并行性将取决于执行计划和分配的资源。它不会高于
min(number-partitions, spark-cores)
。如果有一个执行人,将由集群管理器分配给该执行程序的线程数量。