【问题标题】:Partition data when reading file in Spark在 Spark 中读取文件时的分区数据
【发布时间】:2020-04-25 07:17:11
【问题描述】:

我是 Spark 的新手。考虑以下代码:

val rdd = sc
  .objectFile[(Int, Int)]("path")
  .partitionBy(new HashPartitioner(sc.defaultParallelism))
  .persist()
rdd.count()

从文件中读取的每个元组是否直接发送到哈希分区器指定的分区?还是先将整个文件读入内存而不考虑partitioner,然后根据partitioner进行分配。对我来说,前者可能更有效,因为数据被洗牌一次,而后者需要两次洗牌。

【问题讨论】:

  • RDD 是现实中的遗留物。

标签: apache-spark shuffle


【解决方案1】:

请在代码中找到cmets

val rdd = sc
  .objectFile[(Int, Int)]("path") // Loads the whole file with default minimum partitions and default partitioner
  .partitionBy(new HashPartitioner(sc.defaultParallelism)) // Re-partitions the RDD using HashPartitioner
  .persist() 

【讨论】:

  • Spark 会针对第一种情况优化代码吗?
  • Spark 延迟加载文件,直到在 RDD/Dataframe/Dataset 上执行操作,并且由于文件太大而我面临 OOM。
  • 对。假设我们现在调用rdd.count(),我想知道Spark是如何优化代码的。也就是,每个元组会直接发送到HashPartitioner指定的分区吗?
  • 所有执行器都会报告计数,驱动程序会汇总并输出。但在此之前,所有数据都将由 Driver 读取并在 executor 之间进行分区
  • Spark 不会优化代码。 Spark 在内部使用 Parquet 文件格式进行计算,每个分区文件的头部和底部都有一组完整的元数据。因此,spark 在文件计数时不需要扫描。
猜你喜欢
  • 2018-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-24
  • 2022-09-25
  • 2018-01-29
  • 2019-02-17
  • 2020-08-21
相关资源
最近更新 更多