【发布时间】:2020-10-09 15:44:09
【问题描述】:
在我有很多工作要处理但集群较小的情况下,我可以让 Apache spark 以某种方式为我平滑工作,以免集群因内存不足而爆炸吗?
在这里,大量工作意味着超过可用内存的总量。
这很有价值的情况是,例如在运行我计划的批处理作业时,由于某种原因,我们需要处理异常数量的数据。这应该很少见,但仍有望发生。我不想仅仅因为这些罕见的情况而扩大集群的规模。
对于这些罕见的情况,如何让 Apache Spark 平滑工作负载以使其适合集群并避免内存不足?更长的执行时间来处理这种平滑是可以接受的。
如果正常情况是可用 RAM 量远小于要处理的数据量,那么当然应该增长集群以适应问题。
作业将处理文件,每个文件产生一个结果文件。每个文件都可以完全独立于其他文件进行处理。每个文件代表大致相同的工作量和大小。几乎是一种标准的 ETL 工作。
为了让您了解一个文件所代表的负载,每个文件在专用的 2 核计算机上大约需要 25 分钟。在这 25 分钟的大部分时间里,负载都是 CPU 密集型的,除了初始下载和最终上传相比而言相当快。
目前我正在遍历所有需要执行工作的分区。对于每个这样的分区,我将所有文件添加到一个列表中,并从这个文件列表中创建一个 RDD。在正常情况下,这工作得很好。当我遇到那些罕见的情况时,我就会耗尽内存。
由于这个 RDD 中的初始数据非常少(即使在极少数情况下),所以所有这些数据最终都在同一个分区中。我觉得这是我的问题的一部分,我应该将每个文件路径放在一个单独的分区中。我很难找到支持这一点的文档。
我真的必须自己循环文件吗,或者 Apache Spark 能以某种方式支持我吗?如果是这样,怎么做?我的分区想法听起来合理吗?
【问题讨论】:
-
您需要提供您的代码示例,以便我们更好地了解您的火花流是什么。但是,为什么不预先计算您要处理的文件的大小,然后将它们分成微批次(而不是一个一个)。如果 HDFS/Another FS 中的文件支持 du 函数,您可以轻松计算每个文件的大小,并将它们分成微批处理,并知道您的程序将处理多少。
-
我相信这是一个很常见的问题,通常通过请求的排队和异步处理来解决,en.m.wikipedia.org/wiki/Queueing_theory
-
@ShemTov,我现在更新了描述。
标签: apache-spark pyspark