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

相关文章

JVisualVM之Java性能监控与调优利器详解

《JVisualVM之Java性能监控与调优利器详解》本文将详细介绍JVisualVM的使用方法,并结合实际案例展示如何利用它进行性能调优,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录1. JVisualVM简介2. JVisualVM的安装与启动2.1 启动JVisualVM2

Java使用MethodHandle来替代反射,提高性能问题

《Java使用MethodHandle来替代反射,提高性能问题》:本文主要介绍Java使用MethodHandle来替代反射,提高性能问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录一、认识MethodHandle1、简介2、使用方式3、与反射的区别二、示例1、基本使用2、(重要)

PyTorch高级特性与性能优化方式

《PyTorch高级特性与性能优化方式》:本文主要介绍PyTorch高级特性与性能优化方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、自动化机制1.自动微分机制2.动态计算图二、性能优化1.内存管理2.GPU加速3.多GPU训练三、分布式训练1.分布式数据

Linux高并发场景下的网络参数调优实战指南

《Linux高并发场景下的网络参数调优实战指南》在高并发网络服务场景中,Linux内核的默认网络参数往往无法满足需求,导致性能瓶颈、连接超时甚至服务崩溃,本文基于真实案例分析,从参数解读、问题诊断到优... 目录一、问题背景:当并发连接遇上性能瓶颈1.1 案例环境1.2 初始参数分析二、深度诊断:连接状态与

Java的"伪泛型"变"真泛型"后对性能的影响

《Java的伪泛型变真泛型后对性能的影响》泛型擦除本质上就是擦除与泛型相关的一切信息,例如参数化类型、类型变量等,Javac还将在需要时进行类型检查及强制类型转换,甚至在必要时会合成桥方法,这篇文章主... 目录1、真假泛型2、性能影响泛型存在于Java源代码中,在编译为字节码文件之前都会进行泛型擦除(ty

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

Redis中高并发读写性能的深度解析与优化

《Redis中高并发读写性能的深度解析与优化》Redis作为一款高性能的内存数据库,广泛应用于缓存、消息队列、实时统计等场景,本文将深入探讨Redis的读写并发能力,感兴趣的小伙伴可以了解下... 目录引言一、Redis 并发能力概述1.1 Redis 的读写性能1.2 影响 Redis 并发能力的因素二、

jvm调优常用命令行工具详解

《jvm调优常用命令行工具详解》:本文主要介绍jvm调优常用命令行工具的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一 jinfo命令查看参数1.1 查看jvm参数二 jstack命令2.1 查看现场堆栈信息三 jstat 实时查看堆内存,gc情况3.1

Golang中拼接字符串的6种方式性能对比

《Golang中拼接字符串的6种方式性能对比》golang的string类型是不可修改的,对于拼接字符串来说,本质上还是创建一个新的对象将数据放进去,主要有6种拼接方式,下面小编就来为大家详细讲讲吧... 目录拼接方式介绍性能对比测试代码测试结果源码分析golang的string类型是不可修改的,对于拼接字

mysql线上查询之前要性能调优的技巧及示例

《mysql线上查询之前要性能调优的技巧及示例》文章介绍了查询优化的几种方法,包括使用索引、避免不必要的列和行、有效的JOIN策略、子查询和派生表的优化、查询提示和优化器提示等,这些方法可以帮助提高数... 目录避免不必要的列和行使用有效的JOIN策略使用子查询和派生表时要小心使用查询提示和优化器提示其他常