我使用了Spark 2.1.1,并升级到了最新版本2.4.4。我从Spark UI观察到驱动程序内存在不断增加,在长时间运行之后,我出现了以下错误:java。lang.OutOfMemoryError:超出GC开销限制
在Spark 2.1.1中,驱动程序内存消耗(存储内存选项卡)极低,在运行ContextCleaner和BlockManager后,内存正在减少。
此外,我测试了Spark版本2.3.3, 2.4.3我也有同样的行为。
如何再现此行为:
创建一个非常简单的应用程序(streaming count\u file.py)以重现此行为。此应用程序从目录中读取CSV文件,计算行数,然后删除已处理的文件。
import os
from pyspark.sql import SparkSession
from pyspark.sql import functions as F
from pyspark.sql import types as T
target_dir = "..."
spark=SparkSession.builder.appName("DataframeCount").getOrCreate()
while True:
for f in os.listdir(target_dir):
df = spark.read.load(f, format="csv")
print("Number of records: {0}".format(df.count()))
os.remove(f)
print("File {0} removed successfully!".format(f))
提交代码:
spark-submit
--master spark://xxx.xxx.xx.xxx
--deploy-mode client
--executor-memory 4g
--executor-cores 3
--queue streaming count_file.py
具有相同行为的测试案例:
依赖项
最后,Spark UI内存的增加是Spark版本2.3.3以上的一个bug。有一个补丁。这将影响Spark 2.4.5版。
Spark相关问题:
>
Sparkhttps://issues.apache.org/jira/browse/SPARK-29321?page=com.atlassian.jira.plugin.system.issuetabpanels中可能存在内存泄漏
当我们试图取消部署应用程序时,一些Oracle类似乎正在泄漏。在使用旧的OJDBC14.jar驱动程序时,我没有看到这种情况,但我们不能使用这些驱动程序,因为我们正在迁移到Oracle11g,这需要更新的驱动程序。我猜这是Oracle驱动程序中的bug?我能做些什么来清理这些资源吗?我尝试关闭数据库连接池和其他东西,但没有成功... 我不使用Tomcat的连接池会更好吗?我们宁愿让服务器连接到数据
我是否正确理解了客户端模式的文档? 客户端模式与驱动程序在应用程序主程序中运行的集群模式相反? 在客户端模式下,驱动程序和应用程序主程序是独立的进程,因此+必须小于计算机的内存? 在客户端模式下,驱动程序内存不包括在应用程序主内存设置中吗?
spark-defaults.conf中没有任何内容,以编程方式初始化spark上下文的代码是: 在所有这些之后,Spark UI的Environment选项卡的Spark.driver.maxResultSize为10G,Spark.driver.memory为20G,但是驱动程序的存储内存的executors选项卡显示为0.0B/4.3GB。 (请注意:我以前的Spark.Driver.Mem
我正在对YARN上的Spark作业进行一些内存调优,我注意到不同的设置会给出不同的结果,并影响Spark作业运行的结果。但是,我很困惑,不明白为什么会这样,如果有人能给我一些指导和解释,我会很感激。 我将提供一些背景资料和张贴我的问题和描述案例,我已经经历了他们在下面。 我的环境设置如下: 存储器20G,每个节点20个vCore(共3个节点) Hadoop 2.6.0 火花1.4.0 我的代码对R
问题内容: 运行Web应用程序时,我收到此消息。它运行正常,但是我在关机期间收到此消息。 严重:Web应用程序注册了JBDC驱动程序[oracle.jdbc.driver.OracleDriver],但在Web应用程序停止时未能注销它。为了防止内存泄漏,已强制注销JDBC驱动程序。 任何帮助表示赞赏。 问题答案: 从6.0.24版本开始,Tomcat附带了内存泄漏检测功能,当webapp中存在与J
我正在通过阅读高性能Spark来学习如何配置Spark应用程序,其中提到的一句话让我感到困惑: 根据我的经验,设置Spark驱动程序内存的良好启发式方法只是不会导致驱动程序内存错误的最低可能值,即为执行程序提供最大可能的资源。 我的理解是驱动程序存在于它自己的节点中,而执行程序独立存在于工作节点上。我本以为我可以最大限度地利用驱动程序内存,而不必担心它会影响执行程序。 这本书的建议是真的吗?如果是