Apache spark如何计算分区以及在executor中如何处理分区
Posted
技术标签:
【中文标题】Apache spark如何计算分区以及在executor中如何处理分区【英文标题】:How Apache spark calculates partitions and how partitions are processed in executor 【发布时间】:2017-09-01 15:08:49 【问题描述】:我需要一些帮助来了解 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
问题:
spark 是如何提出200
分区的,这是默认设置吗?
由于我只有 1 个执行器,200
分区是在单个执行器中并行处理还是一次处理一个分区?
executor-cores
是否用于在每个分区中使用配置的并发处理任务,即 2(在我的情况下)?
【问题讨论】:
【参考方案1】: 正如现在所写的 Spark will use 1 partition only。如果您看到 200 个分区,则表示:
代码中没有显示后续的shuffle(交换)。 您使用spark.sql.shuffle.partitions
的默认值。
并行度取决于执行计划和分配的资源。它不会高于min(number-partitions, spark-cores)
。如果只有一个执行器,它将由集群管理器分配给该执行器的线程数。
【讨论】:
以上是关于Apache spark如何计算分区以及在executor中如何处理分区的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Apache Spark 中跨列创建 RDD 分区?
Apache Spark 如何将分区 ID 分配给其执行程序