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



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

问题:

  1. 200分区是如何出现的,这是默认设置吗?

  2. 我只有1个执行程序,200分区是否在单个执行程序中并行处理,或者一次处理一个分区?

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

  • 正如现在写的那样,Spark将仅使用1个分区。
  • 如果您看到200个分区,则意味着:

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

相关内容

  • 没有找到相关文章

最新更新