【问题标题】:How is a Spark Dataframe partitioned by default?Spark Dataframe 默认是如何分区的?
【发布时间】:2021-05-28 21:38:39
【问题描述】:

我知道 RDD 是使用 HashPartitioner 根据键值进行分区的。但是 Spark Dataframe 没有 key/value 的概念,默认是如何分区的。

【问题讨论】:

    标签: apache-spark apache-spark-sql rdd


    【解决方案1】:

    Dataframe 的分区取决于为创建它而运行的任务数。

    没有应用“默认”分区逻辑。以下是一些如何设置分区的示例:

    • 通过val df = Seq(1 to 500000: _*).toDF() 创建的Dataframe 将只有一个分区。
    • 通过val df = spark.range(0,100).toDF() 创建的Dataframe 的分区数与可用内核数一样多(例如,当您的主服务器设置为local[4] 时为4)。此外,请参阅下面关于“默认并行性”的备注,该备注适用于像 parallelize 这样没有父 RDD 的操作。
    • 从 RDD (spark.createDataFrame(rdd, schema)) 派生的 Dataframe 将具有与底层 RDD 相同数量的分区。就我而言,由于我在本地有 6 个核心,因此 RDD 是用 6 个分区创建的。
    • 从 Kafka 主题消费的 Dataframe 将具有与主题的分区匹配的分区数量,因为它可以使用与主题有分区来消费主题一样多的核心/插槽。
    • 通过读取文件创建的数据框,例如来自 HDFS 的分区数量将与文件匹配,除非单个文件必须根据默认为 128MB 的spark.sql.files.maxPartitionBytes 拆分为多个分区。
    • 从需要 shuffle 的转换派生的 Dataframe 将具有由spark.sql.shuffle.partitions 设置的可配置分区数量(默认为 200)。
    • ...

    RDD 和结构化 API 之间的主要区别之一是您对分区的控制不如 RDD 那样多,您甚至可以定义自定义分区器。这对于 Dataframe 是不可能的。

    默认并行度

    Execution Behavior 配置spark.default.parallelism 的文档说明:

    对于没有父 RDD 的并行化等操作,它取决于集群管理器:

    本地模式:本地机器上的核心数

    Mesos细粒度模式:8

    其他:所有执行器节点上的核心总数或2个,以较大者为准

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-02
      • 1970-01-01
      • 2017-01-15
      • 2016-03-06
      相关资源
      最近更新 更多