没有合适的资源?快使用搜索试试~ 我知道了~
首页spark性能优化手册
spark性能优化手册
需积分: 9 20 下载量 6 浏览量
更新于2023-03-16
收藏 582KB DOCX 举报
spark优化,spark优化,spark优化,spark优化,spark优化
资源详情
资源推荐
1.优化介绍
的调优
的调优
的调优
2. Spark core 的调优方式
由于 的计算本质是基于内存的,所以 性能程序的性能可能因为集群中的任
何因素出现瓶颈:、网络带宽、或者是内存。如果内存能够容纳得下所有的数据,那
么网络传输和通信就会导致性能出现瓶颈。但是如果内存比较紧张,不足以放下所有的数
据(比如在针对 亿以上的数据量进行计算时),还是需要对内存的使用进行性能优化的,
比如说使用一些手段来减少内存的消耗。
性能优化,其实主要就是在于对内存的使用进行调优。因为通常情况下来说,如
果你的 应用程序计算的数据量比较小,并且你的内存足够使用,那么只要运维可以
保障网络通常,一般是不会有大的性能问题的。但是 应用程序的性能问题往往出现
在针对大数据量(比如 亿级别)进行计算时出现,因此通常来说, 性能优化,主
要是对内存进行性能优化。当然,除了内存调优之外,还有很多手段可以优化 应用
程序的性能。
2.1 Spark 性能优化技术
的性能优化,主要手段包括:
、使用高性能序列化类库
、优化数据结构
、对多次使用的 进行持久化
、使用序列化的持久化级别
、 ! 虚拟机垃圾回收调优
"、提高并行度
#、广播共享数据
$、数据本地化
%、&'()*) 和 '()*) 的合理使用
、'+ 调优(核心中的核心,重中之重)
2.2.1 内存都花费在哪里了?
、每个 ! 对象,都有一个对象头,会占用 " 个字节,主要是包括了一些对象的元信息,
比如指向它的类的指针。如果一个对象本身很小,比如就包括了一个 类型的 ,&,那么
它的对象头实际上比对象自己还要大。
、 ! 的 对象,会比它内部的原始数据,要多出 个字节。因为它内部使用
数组来保存内部的字符序列的,并且还得保存诸如数组长度之类的信息。而且因为
使用的是 -./" 编码,所以每个字符会占用 个字节。比如,包含 个字符的 ,会
占用 " 个字节。
、 ! 中的集合类型,比如 01 和 2&2,内部使用的是链表数据结构,所以对
链表中的每一个数据,都使用了 3) 对象来包装。3) 对象不光有对象头,还有指向下
一个 3) 的指针,通常占用 $ 个字节。
、元素类型为原始数据类型(比如 )的集合,内部通常会使用原始数据类型的包装类
型,比如 4,来存储元素。
2.2.2 如何判断你的程序消耗了多少内存?
这里有一个非常简单的办法来判断,你的 程序消耗了多少内存。
、首先,自己设置 的并行度,有两种方式:要不然,在 567、8.67等方法
中,传入第二个参数,设置 的 99 的数量;要不然,用 :67方法,
设 置 一 个 参 数 , &:' , 可 以 统 一 设 置 这 个 9 所 有 的
99 数量。
、其次,在程序中将 到内存中,调用 67方法即可。
、最后,观察 ! 的 ,你会发现类似于:“4;.<(11=>=&&&
&&??)@>65>##*(A:>1(7B的日志信息。这就显
示了每个 99 占用了多少内存。
、将这个内存信息乘以 99 数量,即可得出 的内存占用量。
2.3 数据序列化概述
在任何分布式系统中,序列化都是扮演着一个重要的角色的。如果使用的序列化技术,在
执行序列化操作的时候很慢,或者是序列化后的数据还是很大,那么会让分布式应用程序
的性能下降很多。所以,进行 性能优化的第一步,就是进行序列化的性能优化。
自身默认就会在一些地方对数据进行序列化,比如 '+。还有就是,如果我们的算
子函数使用到了外部的数据(比如 ! 内置类型,或者自定义类型),那么也需要让其可
序列化。
而 自身对于序列化的便捷性和性能进行了一个取舍和权衡。默认, 倾向于序列
化 的 便 捷 性 , 使 用 了 ! 自 身 提 供 的 序 列 化 机 制 — — 基 于 <@C4' 和
<@C<'' 的序列化机制。因为这种方式是 ! 原生提供的,很方便使用。
但是问题是, ! 序列化机制的性能并不高。序列化的速度相对较慢,而且序列化以后的
数据,还是相对来说比较大,还是比较占用内存空间。因此,如果你的 应用程序对
内存很敏感,那么,实际上默认的 ! 序列化机制并不是最好的选择。
2. 4 Spark 提供的两种序列化机制
实际上提供了两种序列化机制,它只是默认使用了第一种:
、 ! 序 列 化 机 制 : 默 认 情 况 下 , 使 用 ! 自 身 的 <@C4' 和
<@C<'' 机制进行对象的序列化。只要你的类实现了 5@ 接口,那么都
是可以序列化的。而且 ! 序列化机制是提供了自定义序列化支持的,只要你实现
385@ 接口即可实现自己的更高性能的序列化算法。 ! 序列化机制的速度比较慢,
而且序列化后的数据占用的内存空间比较大。
、*) 序列化机制: 也支持使用 *) 类库来进行序列化。*) 序列化机制比 ! 序
列化机制更快,而且序列化后的数据占用的空间更小,通常比 ! 序列化的数据占用的空
间要小 倍。*) 序列化机制之所以不是默认序列化机制的原因是,有些类型虽然实现了
5@ 接口,但是它也不一定能够进行序列化;此外,如果你要得到最佳的性能 ,
*) 还要求你在 应用程序中,对所有你需要序列化的类型都进行注册。
2.4.1 如何使用 Kryo 序列化机制(一)
如 果 要 使 用 *) 序 列 化 机 制 , 首 先 要 用 : 设 置 一 个 参 数 , 使 用 D
:676E5EAE5*)5E7 即可,即将
的序列化器设置为 *)5。这样, 在内部的一些操作,比如 '+,进行序列
化时,就会使用 *) 类库进行高性能、快速、更低内存占用量的序列化了。
使用 *) 时,它要求是需要序列化的类,是要预先进行注册的,以获得最佳性能——如果
不注册的话,那么 *) 必须时刻保存类型的全限定名,反而占用不少内存。 默认是
对 中常用的类型自动注册了 *) 的,都在 =) 类中。
但是,比如自己的算子中,使用了外部的自定义类型的对象,那么还是需要将其进行注册。
(实际上,下面的写法是错误的,因为 ' 不是共享的,所以累加的功能是无法实现
的)
!'FD'67G
!'@F56=)6AAAA77
'@:6'FH'&&6'77G
2.4.2 如何使用 Kryo 序列化机制(二)
如果要注册自定义的类型,那么就使用如下的代码,即可:
版本:
!:FD:67167=;67
:*)6=)6<:I'J77
!FD86:7
! 版本:
::FD:67167=;67
:*)6'7
!8FD !86:7
2.4.3 优化 Kryo 类库的使用
、优化缓存大小
如果注册的要序列化的自定义的类型,本身特别大,比如包含了超过 个 ,&。那么就
会导致要序列化的对象过大。此时就需要对 *) 本身进行优化。因为 *) 内部的缓存可能
不 够 存 放 那 么 大 的 对 象 。 此 时 就 需 要 调 用 :67 方 法 , 设 置
)5@'K@ 参数的值,将其调大。
默认情况下它的值是 ,就是说最大能缓存 1 的对象,然后进行序列化。可以在必要时将
其调大。比如设置为 。
、预先注册自定义类型
虽然不注册自定义类型,*) 类库也能正常工作,但是那样的话,对于它要序列化的每个
对象,都会保存一份它的全限定类名。此时反而会耗费大量内存。因此通常都建议预先注
册号要序列化的自定义的类。
2.4.5 在什么场景下使用 Kryo 序列化类库?
首先,这里讨论的都是 的一些普通的场景,一些特殊的场景,比如 的持久化,
在后面会讲解。这里先不说。
那么,这里针对的 *) 序列化类库的使用场景,就是算子函数使用到了外部的大数据的情
况。比如说吧,我们在外部定义了一个封装了应用所有配置的对象,比如自定义了一个
1),'9 对象,里面包含了 的数据。然后,在算子函数里面,使用到了这个
外部的大对象。
此时呢,如果默认情况下,让 用 C! 序列化机制来序列化这种外部的大对象,那么
就会导致,序列化速度缓慢,并且序列化以后的数据还是比较大,比较占用内存空间。
因此,在这种情况下,比较适合,切换到 *) 序列化类库,来对外部的大对象进行序列化
操作。一是,序列化速度会变快;二是,会减少序列化后的数据占用的内存空间。
2.5 优化数据结构
要减少内存的消耗,除了使用高效的序列化类库以外,还有一个很重要的事情,就是
优化数据结构。从而避免 ! 语法特性中所导致的额外内存的开销,比如基于指针的 !
数据结构,以及包装类型。
有一个关键的问题,就是优化什么数据结构?其实主要就是优化你的算子函数,内部
使用到的局部数据,或者是算子函数外部的数据。都可以进行数据结构的优化。优化之后
都会减少其对内存的消耗和占用。
2.5.1 如何优化数据结构(一)
、 优 先 使 用 数 组 以 及 字 符 串 , 而 不 是 集 合 类 。 也 就 是 说 , 优 先 用 ) , 而 不 是
=)2、2&2、01 等集合。
剩余20页未读,继续阅读
linke1183982890
- 粉丝: 11
- 资源: 25
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- 保险服务门店新年工作计划PPT.pptx
- 车辆安全工作计划PPT.pptx
- ipqc工作总结PPT.pptx
- 车间员工上半年工作总结PPT.pptx
- 保险公司员工的工作总结PPT.pptx
- 报价工作总结PPT.pptx
- 冲压车间实习工作总结PPT.pptx
- ktv周工作总结PPT.pptx
- 保育院总务工作计划PPT.pptx
- xx年度现代教育技术工作总结PPT.pptx
- 出纳的年终总结PPT.pptx
- 贝贝班班级工作计划PPT.pptx
- 变电值班员技术个人工作总结PPT.pptx
- 大学生读书活动策划书PPT.pptx
- 财务出纳月工作总结PPT.pptx
- 大学生“三支一扶”服务期满工作总结(2)PPT.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功