我们有一个没有本地磁盘的 Spark 集群,并且已设置溢出到 NFS。我们意识到这不是 Spark 的设计用途,但这就是我们当前的现实。
在这个世界上,泄漏会大大减慢 Spark 工作的速度,我们希望将其最小化。对于我们拥有的大多数作业,Spark 执行器有足够的 RAM 来保存所有中间计算结果,但我们看到 Spark 总是将 shuffle 结果写入磁盘,即在特殊情况下写入 NFS。我们已经尝试过所有 Spark 配置选项,这些选项看起来与尝试让 Spark 将 shuffle 输出写入 RAM 没有任何效果。
我在一些地方看到 Spark 更喜欢将 shuffle 输出写入磁盘,例如Does Spark write middle shuffleoutputs to disk。我的问题是:
有没有办法让 Spark 在有可用 RAM 的情况下使用 RAM 进行随机输出?
如果不是,有什么方法可以让它使用更少的大写操作?我们看到它执行大量 1-5KB 的小写入,并在每次写入后等待 NFS 延迟。以下配置选项没有帮助:
spark.buffer.size
spark.shuffle.spill.batchSize
spark.shuffle.spill.diskWriteBufferSize
spark.shuffle.file.buffer
spark.shuffle.unsafe.file.output.buffer
spark.shuffle.sort.initialBufferSize
spark.io.compression.*.blockSize
Run Code Online (Sandbox Code Playgroud)
我对 apache-spark 没有任何经验,但确保任何“中间”内容进入 RAM 而不是网络附加存储的一种方法是设置 RAM 驱动器并将任何文件 I/O 指向该驱动器。对象简单地保存在内存中可能会慢一些,但比存储在 NFS 服务器上要快得多。
这也是控制 RAM 使用“多少”的一种方法,如果有其他情况会导致 RAM 耗尽。RAM 驱动器可以定义最大大小,一旦满了,文件 I/O 将停止对其进行操作。然而,如果应用程序没有“保留 XX GB RAM 备用”配置来限制其使用量,则它可能会为自己分配所有 RAM,并且机器会陷入停滞。
归档时间: |
|
查看次数: |
271 次 |
最近记录: |