Apache spark如何计算分区以及如何在执行程序中处理分区

时间:2017-09-01 15:08:50

标签: mysql hadoop apache-spark spark-dataframe

我需要一些帮助来了解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

问题:

  1. 如何使用200分区产生火花,这是默认设置吗?

  2. 由于我只有1个执行程序,200分区是在单个执行程序中并行处理的,还是一次处理一个分区?

  3. 是否executor-cores用于处理每个分区中具有配置并发性的任务,即2(在我的情况下)?

1 个答案:

答案 0 :(得分:0)

  • 正如现在写的Spark will use 1 partition only
  • 如果您看到200个分区,则表示:

    • 代码中没有显示随后的随机播放(交换)。
    • 您使用spark.sql.shuffle.partitions的默认值。
  • 并行性取决于执行计划和分配的资源。它不会高于min(number-partitions, spark-cores)。如果有一个执行程序,它将由集群管理器分配给此执行程序的线程数。