Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Caching EMR在多次迭代后耗尽内存,即使终止进程也无法清除缓存_Caching_Apache Spark_Memory_Memory Leaks_Emr - Fatal编程技术网

Caching EMR在多次迭代后耗尽内存,即使终止进程也无法清除缓存

Caching EMR在多次迭代后耗尽内存,即使终止进程也无法清除缓存,caching,apache-spark,memory,memory-leaks,emr,Caching,Apache Spark,Memory,Memory Leaks,Emr,我在AWS的电子病历上运行spark作业 Master:m3.xlarge Core:r3.xlarge * 4 这是一个长时间运行的过程,将在每小时循环相同的作业。在每次迭代中,它将从S3加载大约6亿个数据,执行一些基本操作,如map、groupby、reduce、collect,最后将数据写入RDS。我使用dataframe和dataset完成所有工作,并使用ganglia观察内存使用情况 在每次迭代开始时,我将调用spark.catalog.clearCache(),以确保所有缓存的数据

我在AWS的电子病历上运行spark作业

Master:m3.xlarge
Core:r3.xlarge * 4
这是一个长时间运行的过程,将在每小时循环相同的作业。在每次迭代中,它将从S3加载大约6亿个数据,执行一些基本操作,如map、groupby、reduce、collect,最后将数据写入RDS。我使用dataframe和dataset完成所有工作,并使用ganglia观察内存使用情况

在每次迭代开始时,我将调用
spark.catalog.clearCache()
,以确保所有缓存的数据集都未持久化。我检查
spark.sparkContext.getPersistentRDDs.keys.size的值,并在每次迭代开始时得到0

然而,我的内存使用率仍在缓慢增长,下面是运行进程两天后的内存使用率屏幕截图

奇怪的是,在内存使用量达到上限后,我的“使用”内存开始下降,“缓存”内存继续变大,如下所示:

最后,大约3-4天后,它的内存就用完了

OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00007f91f9d03000, 12288, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 12288 bytes for committing reserved memory.
此外,在进程终止后,“高速缓存”内存仍然保持不变,如下所示:


因为我在每次迭代中所做的是相同的,它可以从零开始,而不需要任何来自前一次迭代的数据。如何在每次迭代中真正“清理”机器上的内存使用情况?谢谢

你在干什么工作?类似ALS或PIC的东西?只要读取json文件并进行一些聚合和计数,然后将结果保存到您所引用的迭代中。你说的是什么样的迭代?因为我每小时都会做相同的工作,所以我只是写一个循环来做这个,如果工作在一小时前完成,我就让它休息一会儿。像这样``loop(){doMyJob;SleepIfNeeded;loop}``如果在一个作业中运行无限循环,这可能是个问题。我建议从外部进程控制运行计划(每小时或任何时间),这可以是一个简单的cron,也可以是像Oozie这样更复杂的进程(我相信也存在其他进程)。更多信息请参见。