Spark作业执行之JVM参数设置

本文讨论了Spark作业在执行过程中遇到的内存问题,如`GC overhead limit exceeded`和`Java heap space`错误。解决方案涉及调整JVM参数`-Xms`和`-Xmx`以增加Java堆大小,以及在`spark-env.sh`中配置`SPARK_DRIVER_MEMORY`和`SPARK_WORKER_MEMORY`。同时,解释了在YARN上运行时,需要关注`yarn-site.xml`中的配置,如`yarn.app.mapreduce.am.resource.mb`和`yarn.scheduler.maximum-allocation-mb`,以及`executorMemory`和`executorMemoryOverhead`的关系,以确保Executor能有效运行并避免内存溢出问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

spark作业提交后,在driver上运行init()方法时报错:java.lang.OutOfMemoryError: GC overhead limit exceeded

报错原因是代码中使用了HashMap而且数据量很大,所以导致GC overhead,调整JVM的启动参数-Xms和-Xmx,这个参数配置Java堆的大小,因为代码运行时hashmap对象存放在堆中,故需调大改参数。配置时需要考虑机器的内存大小,不能盲目配置过大。

若作业提交时以yarn-client模式提交,Driver运行时的JVM参数是spark在spark-env.sh 配置文件中读取,因此在spark-env.sh中加入配置:SPARK_DRIVER_MEMORY=2G

作业在每个worker上运行时报错:Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

此时需要配置每个worker运行的MEMORY参数,在spark-env.sh中配置:

export SPARK_WORKER_MEMORY=4g

export SPARK_WORKER_CORES=4


spark作业提交时配置两个参数:--executor-memory 4G --total-executor-cores 4

executor-memory属性配置的是JVM进程Java堆区域,这个值设置为多大合适呢?

首先要注意的是,设置的值必须要小于运行Excutor的container的最大内存。

spark作业在提交时指定了运行模式,我这里指定的是yarn-client模式,以这种模式运行作业时,资源管理部分完全由yarn进行管理,yarn-site.xml配置文件中有两个属性        

        <property>

                <name>yarn.app.mapreduce.am.resource.mb</name>
                <value>2048</value>
        </property>
        <property>
                <name>yarn.scheduler.maximum-allocation-mb</name>
                <value>10240</value>

        </property>

ApplicationMaster运行在一个container中,yarn.app.mapreduce.am.resource.mb属性配置ApplicationMaster所在的container的最大内存

Excutor也是运行在container中,yarn.scheduler.maximum-allocation-mb配置Excutor所在的container的最大内存,该值默认值为1024m

其次需要知道executor执行的时候,用的内存可能会超过executor-memoy,所以会为executor额外预留一部分内存属性。

因此 executorMemory(实际上Excutor所使用的最大内存) =args.executorMemory(--executor-memory参配置的属性值) + executorMemoryOverhead(额外预留一部分内存)

其中executorMemory = yarn.scheduler.maximum-allocation-mb中配置的container的最大内存

属性spark.yarn.executor.memoryOverhead用于配置预留的这部分内存,MemoryOverheadJVM进程中除Java以外占用的空间大小,包括方法区(永久代)、Java虚拟机栈、本地方法栈、JVM进程本身所用的内存、直接内存如果没有配置该属性,则默认值由一个公式math.max((MEMORY_OVERHEAD_FACTOR * executorMemory).toInt, MEMORY_OVERHEAD_MIN))进行计算其中,MEMORY_OVERHEAD_FACTOR=0.1,MEMORY_OVERHEAD_MIN=384m,executorMemory=args.executor-memory。

### Spark 性能优化常用参数配置 在 Apache Spark 的性能优化中,参数配置起着至关重要的作用。通过合理设置资源分配、任务调度、内存管理等方面的参数,可以显著提升作业执行效率和稳定性。以下是一些常见的优化参数及其配置建议。 #### 1. 资源分配相关参数 - `--num-executors`:指定执行器的数量。增加执行器数量可以提高并行度,但也会增加资源消耗。通常建议根据集群资源进行合理配置。 - `--executor-cores`:每个执行器使用的 CPU 核心数。更高的核心数可以提高单个执行器的处理能力,但需要避免过度占用资源。 - `--executor-memory`:每个执行器的内存大小。在实际工作中,通常设置为 2~4GB,具体值需根据任务需求和集群资源决定。 - `--driver-memory`:驱动程序的内存大小。如果需要执行类似 `collect` 的操作,应适当增加该值以避免内存不足。 #### 2. 内存管理相关参数 - `spark.memory.fraction`:用于缓存和执行的堆内存比例,默认为 0.6。可以通过调整该参数优化内存使用。 - `spark.memory.storageFraction`:存储内存占执行和存储总内存的比例,默认为 0.5。减少该值可以增加执行内存的可用空间。 - `spark.executor.memoryOverhead`:为执行器分配的额外内存,用于 JVM 开销、元数据存储等。通常建议设置执行器内存的 10%~20%。 #### 3. 任务调度与并行度 - `spark.default.parallelism`:默认的并行度,通常用于 RDD 的转换操作。可以根据集群的核心数和任务规模进行调整。 - `spark.sql.shuffle.partitions`:控制 Shuffle 操作后的分区数,默认为 200。增加分区数可以提高并行度,但也会增加任务调度的开销。 - `spark.locality.wait`:任务等待本地数据的时间,默认为 3 秒。增加等待时间可以提高数据本地性的调度机会,减少数据传输开销。 #### 4. 数据本地性与存储格式 - 数据本地性对性能提升尤为重要,尽量确保数据和计算在同一节点上进行。可以通过 `spark.locality.wait` 参数控制等待时间[^1]。 - 使用高效的存储格式如 Parquet 可以显著提升数据扫描的吞吐量。Spark 1.6 版本在 Parquet 读写操作中进行了大量优化,相比 1.5 版本,性能提升约 1 倍,同时降低了 CPU 消耗[^4]。 #### 5. 其他常见优化参数 - `spark.sql.adaptive.enabled`:启用自适应查询优化功能,可以在运行时动态调整执行计划,提高性能。 - `spark.sql.adaptive.skewedJoin.enabled`:启用自适应倾斜 Join 优化,解决数据倾斜问题。 - `spark.sql.broadcastTimeout`:广播变量的超时时间,避免因网络问题导致任务失败。 #### 示例配置 以下是一个典型的 Spark 作业提交命令,包含了一些常见的优化参数设置: ```bash spark-submit \ --name mySparkJobName \ --class com.example.MySparkJob \ --master yarn \ --deploy-mode cluster \ --num-executors 4 \ --executor-cores 3 \ --executor-memory 4G \ --driver-memory 2G \ --conf "spark.default.parallelism=200" \ --conf "spark.locality.wait=5s" \ --conf "spark.sql.shuffle.partitions=300" \ --conf "spark.sql.adaptive.enabled=true" \ --conf "spark.sql.adaptive.skewedJoin.enabled=true" \ mySparkJob.jar ``` #### 6. 配置管理建议 - 在生产环境中,推荐使用 `spark-defaults.conf` 文件或集群管理器的配置来管理参数,以保持一致性并避免重复设置[^3]。 - 对于不同的作业,可以根据具体需求在代码中或使用 `spark-submit` 命令行参数动态指定参数。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值