如何阻止Spark结构化流填充HDFS

时间:2019-03-13 14:16:58

标签: apache-spark hdfs amazon-emr spark-structured-streaming

我有一个在AWS EMR上运行的Spark结构化流任务,该任务本质上是在一分钟时间窗口内两个输入流的联接。输入流具有1分钟的水印。我不做任何汇总。我将结果手动“写入”到S3中,每个批次分别使用forEachBatchforeachPartition将数据转换为字符串并写入S3。

我想运行很长时间,也就是“永远”,但是不幸的是,Spark缓慢地填充了群集中的HDFS存储,并最终因此死掉了。

似乎累积了两种类型的数据。登录/var中的.delta.snapshot/mnt/tmp/.../文件。当我使用CTRL + C终止任务时(或者将yarnyarn application kill一起使用时,也不会删除它们),我必须手动删除它们。

我用spark-submit运行任务。我尝试添加

--conf spark.streaming.ui.retainedBatches=100 \
--conf spark.streaming.stopGracefullyOnShutdown=true \
--conf spark.cleaner.referenceTracking.cleanCheckpoints=true \
--conf spark.cleaner.periodicGC.interval=15min \
--conf spark.rdd.compress=true

不起作用。当我添加--master yarn时,存储临时文件的路径有些变化,但是随着时间的推移它们累积的问题仍然存在。添加--deploy-mode cluster似乎使问题变得更糟,因为似乎要写入更多的数据。

我曾经在代码中添加一个Trigger.ProcessingTime("15 seconds),但是由于我发现如果触发时间与计算时间相比太短,Spark可能无法自行清除,因此我删除了它。这似乎有所帮助,HDFS的填充速度较慢,但​​临时文件仍在堆积。

如果我不加入两个流,而只是在两个流上selectunion上将它们写入S3的结果,则不会发生杂凑int /mnt/tmp。可能是我的集群对于输入数据而言太小了吗?

我想了解为什么Spark会写这些临时文件,以及如何限制它们占用的空间。我还想知道如何限制日志消耗的空间量。

2 个答案:

答案 0 :(得分:0)

由于https://issues.apache.org/jira/browse/SPARK-22783,Spark用日志填充HDFS

需要设置spark.eventLog.enabled=false,以便不创建日志。

答案 1 :(得分:0)

除了@adrianN的回答外,在EMR方面,它们还将应用程序日志保留在HDFS上-请参见https://aws.amazon.com/premiumsupport/knowledge-center/core-node-emr-cluster-disk-space/