我需要一些帮助来了解Spark如何决定分区的数量以及如何在执行程序中处理它们,我很抱歉这个问题,因为我知道这是一个重复的问题,但是在阅读了很多文章之后我仍然没有能够理解我正在使用当前我正在使用的真实用例,以及我的spark submit config和cluster config。
我的硬件配置:
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数据帧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
用于处理每个分区中具有配置并发性的任务,即2(在我的情况下)?
答案 0 :(得分:0)
如果您看到200个分区,则表示:
spark.sql.shuffle.partitions
的默认值。并行性取决于执行计划和分配的资源。它不会高于min(number-partitions, spark-cores)
。如果有一个执行程序,它将由集群管理器分配给此执行程序的线程数。