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 中读取最新的分区

我们如何在 Apache Spark 中执行动态重新分区?

如何在 Apache Spark 中跨列创建 RDD 分区?

Apache Spark 如何将分区 ID 分配给其执行程序

在Apache Spark中使用Bigquery Connector时如何设置分区数?

如何使用 FileSystem API 计算分区?