Spark性能调优第四季

2024-01-20 01:48
文章标签 性能 第四季 spark 调优

本文主要是介绍Spark性能调优第四季,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Spark性能调优第四季

spark性能调优之序列化

spark JVM性能调优

一、spark性能调优之序列化

1.之所以进行序列化,最重要的原因是内存空间有限(减少GC的压力,最大化的避免Full GC的产生,一旦产生Full GC则整个Task处于停止状态),减少磁盘IO的压力、减少网络IO的压力;

2.什么会产生必要的序列化和反序列化?发生磁盘IO和网络通信的时候需要序列化和反序列化,更为重要是考虑序列化和反序列化的时候有两种情况:

a)persist(checkpoint)的时候必须考虑序列化和反序列化,例如说cache到内存的时候只能使用JVM分配的60%的内存空间,此时好的序列化机制就至关重要;

b)编程的时候,使用算子的函数的操作如果传入了外部数据就必须进行序列化和反序列化;

conf.set(spark.serializer.org.apache.spark.serializer.KryoSerializer)

conf.resistryKryoClass(Array(classOf[Person]))

val person = new Person()

rdd.map(item=>person.add(item))

3.强烈建议使用Kryo序列化器进行序列化和反序列化;Spark默认情况下使用的不是Kryo而是Java自带的序列化器;ObjectInput Stream和ObjectOutputStream(主要是考虑了方便性和通用性);如果自定义的RDD中数据元素的类型则必须实现Serializable接口,当然你也可以实现自己的序列化接口Exteralizable来实现更加高效的Java序列化算法,采用ObjectInput Stream和ObjectOutputStream会导致序列化后数据占用大量的内存或者大量的消耗网络,并且在序列化和反序列化的时候比较消耗CPU;

4.强烈建议采用Kryo序列化机制,Spark下使用Kryo序列化机制会比Java默认的序列化机制更加节省空间(节省近10倍的空间)以及更少的消耗CPU,强烈建议在一切情况下使用Kryo序列化机制;

5.使用Kryo的两种方式:

a)在spark-defaults.conf中配置

b)在程序的sparkConf中配置,

conf.set(spark.serializer.org.apache.spark.serializer.KryoSerializer)

使用Kryo可以更加快速、更低存储空间的占用量以及更高性能的方式来进行序列化;

6.Spark中Scala常用的类型自动的通过AllScalaRegister注册给了Kryo进行序列化管理;

7.如果进行自定义的类型必须注册给序列化器,例如:

conf.set(spark.serializer.org.apache.spark.serializer.KryoSerializer)

conf.resistryKryoClass(Array(classOf[Person]))

val person = new Person()

rdd.map(item=>person.add(item))

8.Kryo在序列化的时候会缓存空间默认大小为2MB,可以根据具体的业务模型调整大小,具体方式:

设置spark.kryoserializer.buffer为10MB

9.在使用Kryo的时候强烈建议注册时写完整的包名和类名,否则每次序列化的时候都会保存一份包名和类名的完整信息,这就会不必要的消耗内存空间;

 

二、spark JVM性能调优

1.好消息是spark的钨丝计划是用来专门解决JVM性能问题,不好的消息是至少在spark2.0以前钨丝计划功能不稳定、不完善且只能在特定的情况下发生作用,也就是说包括spark.1.6.0在内的spark以及以前的版本我们大多数情况下没有使用钨丝计划的功能,所以此时就必须关注JVM性能调优;

2.JVM性能调优的关键是调优GC,为什么GC如此重要,主要是因为Spark热衷于RDD的持久化!!!GC本身的性能的开销是和数据量成正比的;

3.初步可以考虑的是尽量多的使用array和String,并且在序列化机制方面尽可能的采用Kryo,这样每个partition都成为字节数组;

4.监视GC的基本方式有两种:

a)配置spark-executor-extraJavaOptions=-verbose:gc -XX:+PrintGCDetails -XX:+ PrintGCDateTimeStamps

b)SparkUI

5.Spark在默认情况下使用60%的内存空间进行cache缓存RDD的内容,也就说task的执行的时候只能使用剩下的40%;如果空间不够用就会(频繁的)触发GC

可以设置spark-memory.fraction参数来进行调整空间的使用,例如降低cache的空间,让Task使用更多的空间来创建对象和完成计算;

再次,强烈建议使用RDD从Cache的时候使用kryo序列化机制,从而给task可以分配更大的空间来完成计算(避免频繁的GC)

6.因为在老年代空间满的时候会发生Full GC操作,而老年代空间中基本都是活的比较久的对象(经历了数次GC依旧存在的对象),此时会停下所有的线程,进行Full GC,对old区中的对象进行整理,严重影响性能;

a)可以考虑设置spark-memory.fraction参数来进行调整空间的使用来给年轻代更多的空间用于存放短时间的存活的对象;

b)-Xmn调整Eden区域;

c)对RDD中操作的对象和数据大小的评估,如果HDFS上解压后一般体积可能变成远离啊体积的3倍左右;根据数据的大小来设置Eden;如果有10个Task,每个Task处理的HDFS上的数据是128MB,则需要设置-Xmn为10*128*3*4/3的大小;

d)-XX:SupervisorRatio

e)-XX:NewRatio

这篇关于Spark性能调优第四季的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/624408

相关文章

C#使用yield关键字实现提升迭代性能与效率

《C#使用yield关键字实现提升迭代性能与效率》yield关键字在C#中简化了数据迭代的方式,实现了按需生成数据,自动维护迭代状态,本文主要来聊聊如何使用yield关键字实现提升迭代性能与效率,感兴... 目录前言传统迭代和yield迭代方式对比yield延迟加载按需获取数据yield break显式示迭

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

SpringBoot操作spark处理hdfs文件的操作方法

《SpringBoot操作spark处理hdfs文件的操作方法》本文介绍了如何使用SpringBoot操作Spark处理HDFS文件,包括导入依赖、配置Spark信息、编写Controller和Ser... 目录SpringBoot操作spark处理hdfs文件1、导入依赖2、配置spark信息3、cont

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

黑神话,XSKY 星飞全闪单卷性能突破310万

当下,云计算仍然是企业主要的基础架构,随着关键业务的逐步虚拟化和云化,对于块存储的性能要求也日益提高。企业对于低延迟、高稳定性的存储解决方案的需求日益迫切。为了满足这些日益增长的 IO 密集型应用场景,众多云服务提供商正在不断推陈出新,推出具有更低时延和更高 IOPS 性能的云硬盘产品。 8 月 22 日 2024 DTCC 大会上(第十五届中国数据库技术大会),XSKY星辰天合正式公布了基于星

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动