【问题标题】:How does the number of partitions affect `wholeTextFiles` and `textFiles`?分区数如何影响 `wholeTextFiles` 和 `textFiles`?
【发布时间】:2016-02-27 15:46:21
【问题描述】:

在 spark 中,我了解如何使用 wholeTextFilestextFiles,但我不确定何时使用哪个。以下是我目前所知道的:

  • 在处理不按行分割的文件时,应使用wholeTextFiles,否则使用textFiles

我认为默认情况下,wholeTextFilestextFiles 分别按文件内容和行进行分区。但是,它们都允许您更改参数minPartitions

那么,更改分区如何影响这些分区的处理方式?

例如,假设我有一个 100 行的非常大的文件。将其处理为具有 100 个分区的 wholeTextFiles 与使用默认分区 100 将其处理为 textFile (逐行分区)之间有什么区别。

这些有什么区别?

【问题讨论】:

标签: python apache-spark pyspark


【解决方案1】:

作为参考,wholeTextFiles 使用 WholeTextFileInputFormat 扩展 CombineFileInputFormat

关于wholeTextFiles 的几点说明。

  • wholeTextFiles 返回的 RDD 中的每条记录都有文件名和文件的全部内容。这意味着(根本)无法拆分文件。
  • 因为它扩展了CombineFileInputFormat,它会尝试将一组较小的文件合并到一个分区中。

如果我在一个目录中有两个小文件,则这两个文件可能最终都位于一个分区中。如果我设置minPartitions=2,那么我可能会取回两个分区。

现在如果我设置minPartitions=3,我仍然会取回两个分区,因为wholeTextFiles 的约定是RDD 中的每条记录都包含一个完整的文件。

【讨论】:

  • 感谢您的回答。所以,让我确保我理解正确:InputFormatsplitabilityminPartitions 仅影响文件如何转换为 RDD。正确的?然后,在读取输入后,建议使用repartition 重新分区一个特别大的unsplittable 文件,这将基于hadoop blocks 拆分文件。是吗?
  • 几乎正确。 Sparks repartition 使用内部混洗框架,不考虑 HDFS 块或底层存储的任何细节。
  • 好的,那么我为repartition 提供的任何值都应该按我提供的数字划分?
  • JavaPairRDD wholeTextFiles = jssc.sparkContext().wholeTextFiles(args[0]); wholeTextFiles.repartition(3); WholeTextFiles 没有被重新分区。虽然我指定了 3 个分区,但它只占用了两个分区。
  • 你的回答救了我。非常感谢。
猜你喜欢
  • 2012-04-06
  • 2019-05-13
  • 2019-05-06
  • 1970-01-01
  • 1970-01-01
  • 2013-07-25
  • 2015-10-09
  • 1970-01-01
  • 2019-01-08
相关资源
最近更新 更多