我正在使用 Apache Spark 本地模式运行 pyspark 2.2.0 作业,并看到以下警告:
WARN RowBasedKeyValueBatch: Calling spill() on RowBasedKeyValueBatch. Will not spill but return 0.
此警告的原因可能是什么?这是我应该关心的事情还是我可以安全地忽略它?
如此处所示,此警告意味着您的 RAM 已满,并且该部分 RAM 内容已移至磁盘。
另请参阅 Spark 常见问题解答
我的数据是否需要适合内存才能使用 Spark?
不。如果内存无法容纳 Spark 的运算符,则会将数据溢出到磁盘,从而使其能够在任何大小的数据上良好运行。同样,不适合内存的缓存数据集要么会溢出到磁盘,要么会在需要时重新计算,具体取决于 RDD 的存储级别。
我猜这个消息比简单的警告更糟糕:它处于错误的边缘。
看看源代码:
/**
* 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;
}
所以我想说,你正处于“需要溢出但实际上没有溢出”的无限循环中。
添加到上面的注释中,我在运行
jupyter/scipy-notebook
Docker 映像(然后独立导入 PySpark)时收到此警告。当切换到 jupyter/pyspark-notebook
图像时,此问题已修复。
造成此问题的一个潜在原因
Warning
可能是驱动程序内存不足以在本地运行操作。为了解决这个问题,可以考虑在初始化SparkSession
时通过配置来增加驱动内存,如下所示:
.config("spark.driver.memory", "20g")
根据您的工作负载要求调整值 (
"20g"
)。