【问题标题】:Autobatching in Apache SparkApache Spark 中的自动批处理
【发布时间】: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


【解决方案1】:

内存不足的原因是我的分区无法放入 RAM。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-16
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多