Spark 超大数据量下OOM的解决

这篇具有很好参考价值的文章主要介绍了Spark 超大数据量下OOM的解决。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

大表2T,小表 30G+,两表join到一新表分区。

要求: 尽可能的少用executor core和memory,并减少时间占用

spark数据量大处理方法,大数据,hdfs,Java,spark,Powered by 金山文档

前提

executor core和memory占用已经够高(--num-executors 200 --executor-cores 4 --executor-memory 30G ),不能再添加过多了。

executor内存 集群统一配置的上限是:yarn.scheduler.maximum-allocation-mb = 30G,

所以 针对spark常见的优化——“把小变量广播出去”变的不太可行。广播的内容会存在每一个executor内,那内存都被广播占满了。

已经做过的优化:

  • “尽量避免频繁new新的rdd对象”

  • “用reduceBy代替groupBy 的shuffle算子”

在处理过程中,频繁遇到了oom报错的问题

现象

spark数据量大处理方法,大数据,hdfs,Java,spark,Powered by 金山文档

显然GC时间过久,这还是在使用了reduceByKey的情况下

executors内报错

spark数据量大处理方法,大数据,hdfs,Java,spark,Powered by 金山文档
spark数据量大处理方法,大数据,hdfs,Java,spark,Powered by 金山文档

CoarseGrainedExecutorBackend: RECEIVED SIGNAL TERM 可以通过配置关闭动态分配

--conf spark.dynamicAllocation.enabled=false

日志里原因: jvm 堆OOM 了

spark数据量大处理方法,大数据,hdfs,Java,spark,Powered by 金山文档

解决方案

1 调低为spark缓存保留的内存占比 和 executor里的核数

广义上讲,spark Executor JVM内存可以分为两部分。Spark memory 和 User memory。这由属性spark.memory.fraction 控制 ,他的值介于 0 和 1 之间, 默认为0.6。

在 spark 应用程序中处理图像或进行内存密集型处理时,请考虑减少spark.memory.fraction. 这将为您的应用程序工作提供更多内存。Spark 可以溢出,所以它仍然可以使用较少的内存共享。

问题的第二部分是work的划分。如果可能,将数据分成更小的块。较小的数据可能需要较少的内存。但如果那是不可能的,那么你就是在牺牲计算来换取内存。通常,单个执行程序将运行多个内核。执行器的总内存必须足以处理所有并发任务的内存需求。如果增加执行程序内存不是一个选项,您可以减少每个执行程序的核心数,以便每个任务获得更多内存来使用。使用 1 个核心执行程序进行测试,这些执行程序具有您可以提供的最大可能内存,然后不断增加核心,直到找到最佳核心数

(--num-executors 200 --executor-cores 4 --executor-memory 30G )

2 调整 driver和executor的 spark.yarn.executor.memoryOverhead,提高稳定性

在 YARN,K8S 部署模式下,container 会预留一部分内存,形式是堆外,用来保证稳定性,主要存储nio buffer,函数栈等一些开销。

这部分内存,你不用管堆外还是堆内,开发者用不到,spark也用不到,

所以不用关心,千万不指望调这个参数去提升性能,它的目的是保持运行时的稳定性。

3 添加堆外内存: spark.memory.offHeap.size

作为一个 JVM 进程,Executor 的内存管理建立在 JVM 的内存管理之上,Spark 对 JVM 的堆内(On-heap)空间进行了更为详细的分配,以充分利用内存。同时,Spark 引入了堆外(Off-heap)内存,使之可以直接在工作节点的系统内存中开辟空间,进一步优化了内存的使用。

在默认情况下堆外内存并不启用,可通过配置 spark.memory.offHeap.enabled 参数启用,并由 spark.memory.offHeap.size 参数设定堆外空间的大小。

4 调整driver 的 Xmx 堆 和 Xms 堆

调大driver的内存(Xmx)

修改集群的配置文件 spark-defaults.conf文件

spark.driver.memory              30g

或者直接在spark-submit命令里修改

--driver-memory 30G

这个值默认是1G,即使改大了也不会生效。 SPARK_DRIVER_MEMORY 只设置了 Xmx heap(堆)。初始堆大小保持为 1G,并且堆的大小永远不会扩展到 Xmx 堆。

修改Xms

你有没有转储你的master gc日志?所以我遇到了类似的问题,我发现 SPARK_DRIVER_MEMORY 只设置了 Xmx heap(堆)。初始堆大小保持为 1G,并且堆的大小永远不会扩展到 Xmx 堆。

使用如下配置就看生效了

--conf spark.driver.extraJavaOptions=-Xms10g

ps aux | grep java 你将会看到如下的日志:=

24501 30.7 1.7 41782944 2318184 pts/0 Sl+ 18:49 0:33 /usr/java/latest/bin/java -cp /opt/spark/conf/:/opt/spark/jars/* -Xmx30g -Xms10g

添加配置如下:

--conf spark.dynamicAllocation.enabled=false --conf spark.core.connection.ack.wait.timeout=300
--conf spark.storage.memoryFraction=0.5 --conf spark.shuffle.memoryFraction=0.3
--conf spark.yarn.driver.memoryOverhead=3072 --conf spark.executor.memoryOverhead=3072
--conf spark.memory.offHeap.enabled=true --conf spark.memory.offHeap.size=8g
--conf spark.driver.extraJavaOptions=-Xms20g

参考

https://spark.apache.org/docs/latest/cluster-overview.html

https://www.cnblogs.com/frankdeng/p/9301783.html

https://stackoverflow.com/questions/21138751/spark-java-lang-outofmemoryerror-java-heap-space

https://www.jianshu.com/p/391f8776e66f

https://blog.csdn.net/u012811805/article/details/104745457/文章来源地址https://www.toymoban.com/news/detail-571518.html

到了这里,关于Spark 超大数据量下OOM的解决的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • spark 数据倾斜处理

    1. 对多次使用的RDD进行持久化 同常内存够的时候建议使用:MEMORY_ONLY 如果内存不够的时候使用 通常建议使用:MEMORY_AND_DISK_SER策略,而不是 MEMORY_AND_DISK策略。 2. 使用高性能的算子 3. 广播大变量 4. 使用Kryo优化序列化性能 Kryo序列化器介绍: Spark支持使用Kryo序列化机制。Kryo序列化

    2024年02月11日
    浏览(48)
  • Spark大数据处理学习笔记(2.2)搭建Spark Standalone集群

    一、在master虚拟机上安装配置Spark 1.1 将spark安装包上传到master虚拟机 下载Spark:pyw2 进入/opt目录,查看上传的spark安装包 1.2 将spark安装包解压到指定目录 执行命令: tar -zxvf spark-3.3.2-bin-hadoop3.tgz 修改文件名:mv spark-3.3.2-bin-hadoop3 spark-3.3.2 1.3 配置spark环境变量 执行命令:vim

    2024年02月09日
    浏览(52)
  • Spark大数据处理讲课笔记4.1 Spark SQL概述、数据帧与数据集

      目录 零、本讲学习目标 一、Spark SQL (一)Spark SQL概述 (二)Spark SQL功能 (三)Spark SQL结构 1、Spark SQL架构图 2、Spark SQL三大过程 3、Spark SQL内部五大组件 (四)Spark SQL工作流程 (五)Spark SQL主要特点 1、将SQL查询与Spark应用程序无缝组合 2、Spark SQL以相同方式连接多种数据

    2024年02月09日
    浏览(64)
  • Spark大数据处理讲课笔记4.2 Spark SQL数据源 - 基本操作

      目录 零、本讲学习目标 一、基本操作 二、默认数据源 (一)默认数据源Parquet (二)案例演示读取Parquet文件 1、在Spark Shell中演示 2、通过Scala程序演示 三、手动指定数据源 (一)format()与option()方法概述 (二)案例演示读取不同数据源 1、读取房源csv文件 2、读取json,保

    2024年02月09日
    浏览(44)
  • Spark Streaming实时数据处理

    作者:禅与计算机程序设计艺术 Apache Spark™Streaming是一个构建在Apache Spark™之上的快速、微批次、容错的流式数据处理系统,它可以对实时数据进行高吞吐量、低延迟地处理。Spark Streaming既可用于流计算场景也可用于离线批处理场景,而且可以将结构化或无结构化数据源(如

    2024年02月06日
    浏览(54)
  • 大数据处理与分析-Spark

    (基于Hadoop的MapReduce的优缺点) MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心框架 MapReduce是一种用于处理大规模数据集的编程模型和计算框架。它将数据处理过程分为两个主要阶段:Map阶段和Reduce阶段。在Map阶段,数据被分割为多

    2024年02月04日
    浏览(43)
  • 大数据处理:利用Spark进行大规模数据处理

    大数据处理是指对大规模、高速、多源、多样化的数据进行处理、分析和挖掘的过程。随着互联网、人工智能、物联网等领域的发展,大数据处理技术已经成为当今科技的核心技术之一。Apache Spark是一个开源的大数据处理框架,它可以处理批量数据和流式数据,并提供了一系

    2024年03月22日
    浏览(55)
  • Spark Streaming实时流式数据处理

    作者:禅与计算机程序设计艺术 Apache Spark Streaming 是 Apache Spark 提供的一个用于高吞吐量、容错的流式数据处理引擎。它可以实时的接收数据并在系统内部以微批次的方式进行处理,并将结果输出到文件、数据库或实时消息系统中。Spark Streaming 支持 Java、Scala 和 Python 编程语言

    2024年02月08日
    浏览(50)
  • 4.5 Spark SQL 处理JSON数据

    4.1 Spark SQL概述 4.2 Spark SQL DataFrame 编程操作大全 (超详细)

    2024年02月02日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包