Apache Spark 警告“在 RowBasedKeyValueBatch 上调用溢出()”的含义

问题描述 投票:0回答:4

我正在使用 Apache Spark 本地模式运行 pyspark 2.2.0 作业,并看到以下警告:

WARN RowBasedKeyValueBatch: Calling spill() on RowBasedKeyValueBatch. Will not spill but return 0.

此警告的原因可能是什么?这是我应该关心的事情还是我可以安全地忽略它?

apache-spark pyspark warnings
4个回答
24
投票

此处所示,此警告意味着您的 RAM 已满,并且该部分 RAM 内容已移至磁盘。

另请参阅 Spark 常见问题解答

我的数据是否需要适合内存才能使用 Spark?

不。如果内存无法容纳 Spark 的运算符,则会将数据溢出到磁盘,从而使其能够在任何大小的数据上良好运行。同样,不适合内存的缓存数据集要么会溢出到磁盘,要么会在需要时重新计算,具体取决于 RDD 的存储级别。


5
投票

我猜这个消息比简单的警告更糟糕:它处于错误的边缘。

看看源代码:

 /**
   * Sometimes the TaskMemoryManager may call spill() on its associated MemoryConsumers to make
   * space for new consumers. For RowBasedKeyValueBatch, we do not actually spill and return 0.
   * We should not throw OutOfMemory exception here because other associated consumers might spill
   */
  public final long spill(long size, MemoryConsumer trigger) throws IOException {
    logger.warn("Calling spill() on RowBasedKeyValueBatch. Will not spill but return 0.");
    return 0;
  }

这里:https://github.com/apache/spark/blob/master/sql/catalyst/src/main/java/org/apache/spark/sql/catalyst/expressions/RowBasedKeyValueBatch.java

所以我想说,你正处于“需要溢出但实际上没有溢出”的无限循环中。


0
投票

添加到上面的注释中,我在运行

jupyter/scipy-notebook
Docker 映像(然后独立导入 PySpark)时收到此警告。当切换到
jupyter/pyspark-notebook
图像时,此问题已修复。


0
投票

造成此问题的一个潜在原因

Warning
可能是驱动程序内存不足以在本地运行操作。为了解决这个问题,可以考虑在初始化
SparkSession
时通过配置来增加驱动内存,如下所示:

.config("spark.driver.memory", "20g")

根据您的工作负载要求调整值 (

"20g"
)。

© www.soinside.com 2019 - 2024. All rights reserved.