当前位置: 首页 > 知识库问答 >
问题:

在Spark中重新分区大文件

籍兴文
2023-03-14

我是Spark的新手,有一个1 TB的文件需要处理。

我的系统规格是:

每个节点:64 GB RAM
节点数:2
每个节点的核心:5

正如我所知,我必须重新分区数据以获得更好的并行性,因为火花将尝试仅通过(核心总数*2或3或4)创建默认分区。但在我的情况下,由于数据文件非常大,我必须将这些数据重新分区为一个数字,以便这些数据可以以有效的方式处理。

如何选择要在重新分区中传递的分区数??我应该如何计算它?我应该采取什么方法来解决这个问题…

提前非常感谢。

共有1个答案

欧阳博超
2023-03-14

根据我的理解,< code >分区和< code >并行性是两回事。然而,在Spark中并行执行任务时,两者是相辅相成的。并行度是< code >执行器数量*内核数量,在您的情况下是< code>2 * 5 = 10。所以在任何给定的时刻,你最多可以运行10个任务。如果你的数据被分成10个分区,那么所有的数据都会被同时处理。然而,如果您有20个分区,那么spark将开始处理10个分区,并且基于每个任务完成的时间,Spark将调度下一个分区进行处理。这将一直发生,直到它处理完所有的分区。

默认情况下,一个分区是一个数据块。我猜你的1 TB数据存储在HDFS上。如果底层数据块大小为256MB,那么您将拥有1TB/256MB数量的数据块,这些数据块又是分区。

请注意,一旦数据被读取,您就可以根据您的需求对其进行重新分区。

如何选择要在重新分区中传递的分区数??我应该如何计算它?我应该采取什么方法来解决这个问题…

您需要查看您的火花应用程序如何保持分区的大小,然后确定是否可以减少或增加该数字。还有一件事是执行器内存的考虑。如果您的分区太大,那么您也可能遇到OutOfMemory错误。这些只是指导方针,而不是广泛的列表。

这https://blog.cloudera.com/how-to-tune-your-apache-spark-jobs-part-1/multipart系列对分区和执行器进行了更详细的讨论。

 类似资料:
  • 我使用pyspark,我有一个大型数据源,我想重新分区,明确指定每个分区的文件大小。 我知道使用< code>repartition(500)函数会将我的拼花分解成500个大小几乎相同的文件。问题是每天都有新数据添加到这个数据源中。有些日子可能会有大量的投入,有些日子可能会有少量的投入。因此,当查看一段时间内的分区文件大小分布时,每个文件的大小在< code>200KB到< code>700KB之

  • 我在这里浏览了文档:https://spark . Apache . org/docs/latest/API/python/py spark . SQL . html 它说: 重新分区:生成的DataFrame是哈希分区的 对于repartitionByRange:结果DataFrame是范围分区的 而且之前的一个问题也提到了。然而,我仍然不明白它们到底有什么不同,当选择一个而不是另一个时会有什么

  • 我有一个大约 100GB 的数据源,我正在尝试使用日期列对其进行分区。 为了避免分区内出现小块,我添加了一个重新分区(5 ),使每个分区内最多有5个文件: 我的问题是,在我分配的30个执行器中,只有5个在实际运行。最后我得到了我想要的东西(每个分区内有5个文件),但由于只有5个执行器在运行,所以执行时间非常长。 你有什么建议可以让我做得更快吗?

  • 根据Spark 1.6.3的文档,应该保留结果数据表中的分区数: 返回由给定分区表达式分区的新DataFrame,保留现有的分区数 Edit:这个问题并不涉及在Apache Spark中删除空DataFrame分区的问题(例如,如何在不产生空分区的情况下沿列重新分区),而是为什么文档所说的内容与我在示例中观察到的内容不同

  • 我有数千个压缩文件,每个压缩文件的大小为 2GB,位于 HDFS 中。我正在使用火花来处理这些文件。我正在使用Spark textFile()方法从HDFS加载文件。我的问题是如何重新分区数据,以便我可以并行处理每个文件。目前,每个.gz文件都在单个任务中处理。因此,如果我处理 1000 个文件,则只执行 1000 个任务。我知道,压缩文件是不可拆分的。但是,我可以使用其他方法来更快地运行我的作业

  • 我需要从一个Hive表中读取数据并将其插入到另一个Hive表中。两个表的架构是相同的。该表按日期分区 步骤1:从Spark的源表中读取数据。 第 2 步:按列(国家、日期)和分区数重新分区为 4。 我只得到每个国家代码1个分区