Apache Spark中的自动批处理

时间:2020-04-12 18:16:58

标签: apache-spark pyspark

在需要处理大量工作但集群较小的情况下,能否使Apache产生火花以某种方式为我简化工作,以使集群不会因内存不足而爆炸?

很多工作在这里意味着比可用内存总量还要多。

例如当我运行计划的批处理作业时,这种情况很有价值,并且由于某种原因,我们要处理的数据量异常大。这种情况很少见,但仍有望发生。我不想仅仅因为这些罕见的情况而扩大群集的大小。

在这些罕见的情况下,如何使Apache Spark减轻工作量,使其适合集群并避免内存不足?可以接受更长的执行时间来处理此平滑操作。

如果正常情况是可用RAM的数量远远少于要处理的数据的数量,那么当然应该增加群集以适应该问题。

该作业将处理文件,每个文件产生一个结果文件。每个文件可以完全独立于其他文件进行处理。每个文件代表大约相同的工作量和大小。几乎是标准的ETL工作。

为了让您感觉一个文件代表的负载,每个文件在专用的2核计算机上花费大约25分钟。在这25分钟中的大部分时间里,负载都是受CPU约束的,除了初始下载和最终上传相比,这两个比较快。

目前,我正在遍历需要执行工作的所有分区。对于每个这样的分区,我将所有文件添加到一个列表中,并从该文件列表中创建一个RDD。在正常情况下,这很好用。当我遇到那些罕见的情况时,我就会用光内存。

由于该RDD中的初始数据非常少(即使在极少数情况下),因此所有数据最终都位于同一分区中。我感觉这是问题的一部分,我应该将每个文件路径放在单独的分区中。我很难找到支持此功能的文档。

我是否真的必须自己遍历文件,还是Apache Spark可以通过某种方式支持我?如果是这样,怎么办?我的分区想法听起来不错吗?

1 个答案:

答案 0 :(得分:0)

内存不足的原因是我得到了无法容纳在RAM中的分区。

对我来说,我很难找到大量要重新分区的分区。我决定计算行数,并选择没有分区包含超过20万行。这使我的分区足够小,并且大小更均匀。

重新分区数据解决了问题。