【问题标题】:How to ensure that loading of Spark DataFrame from Parquet is distributed and parallelized?如何确保从 Parquet 加载 Spark DataFrame 是分布式和并行化的?
【发布时间】:2017-03-14 19:33:37
【问题描述】:

当 Spark 将源数据从文件加载到 DataFrame 中时,哪些因素决定了数据是在单个节点(很可能是驱动程序/主节点)上完全加载到内存中,还是在计算所需的最小并行子集中 (大概在工作者/执行者节点上)?

特别是,如果使用 Parquet 作为输入格式并通过 Spark DataFrame API 加载,需要注意哪些事项以确保从 Parquet 文件加载并行化并推迟到执行程序,并限制在列的范围内相关执行程序节点上的计算需要?

(我希望了解 Spark 用于在分布式执行计划中调度源数据加载的机制,以避免通过加载完整数据集耗尽任何一个节点上的内存。)

【问题讨论】:

    标签: apache-spark apache-spark-sql spark-dataframe parquet


    【解决方案1】:

    只要您使用 spark 操作,所有数据转换和聚合都仅在 executor 上执行。因此驱动程序不需要加载数据,它的工作是管理处理流程。只有在您使用某些终端操作时,驱动程序才会获取数据,例如collect()first()show()toPandas()toLocalIterator() 等。此外,执行程序不会将所有文件内容加载到内存中,而是获取最小的可能块(称为分区)。

    如果您使用 Parquet 等列存储格式,则仅加载执行计划所需的列 - 这是 spark 中的默认行为。

    编辑:我刚刚看到 spark 中可能存在错误,如果您在架构中使用嵌套列,则可能会加载不必要的列,请参阅:Why does Apache Spark read unnecessary Parquet columns within nested structures?

    【讨论】:

      猜你喜欢
      • 2017-05-05
      • 2019-03-02
      • 2018-11-30
      • 2019-05-07
      • 2014-11-25
      • 1970-01-01
      • 2016-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多