- 1、本文档共75页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Spark 性能优化;1;Spark的功能涵盖了大数据领域的离线批处理、SQL类处理、流式/实时计算、机器学习、图计算等各种不同类型的计算操作,应用范围与前景非常广泛。
不对Spark作业进行合理的调优,Spark作业执行速度可能会很慢,无法体现Spark作为一种快速大数据计算引擎的优势。
开发调优和资源调优是所有Spark作业都需要注意和遵循的一些基本原则,是高性能Spark作业的基础;
数据倾斜调优是用来解决Spark作业数据倾斜的解决方案。
shuffle调优是对Spark作业的shuffle运行过程及细节进行调优。;开发Spark作业的性能优化的基本原则
原则一:避免创建重复的RDD
原则二:尽可能复用同一个RDD
原则三:对多次使用的RDD进行持久化
原则四:尽量避免使用shuffle类算子
原则五:使用map-side预聚合的shuffle操作
原则六:使用高性能的算子
原则七:广播大变量
原则八:使用Kryo优化序列化性能
原则九:优化数据结构
;原则一:避免创建重复的RDD
开发一个Spark作业时,首先是基于某个数据源创建一个初始的RDD;接着对这个RDD执行某个算子操作,然后得到下一个RDD;以此类推,循环往复,直到计算出最终我们需要的结果。在这个过程中,多个RDD会通过不同的算子操作(比如map、reduce等)串起来,这个“RDD串”,就是RDD lineage,也就是“RDD的血缘关系链”。
开发过程中要注意:对于同一份数据,只应该创建一个RDD,不能创建多个RDD来代表同一份数据。
创建了多个RDD,Spark作业会进行多次重复计算来创建多个代表相同数据的RDD,进而增加了作业的性能开销。;原则一:避免创建重复的RDD;原则二:尽可能复用同一个RDD
在对不同的数据执行算子操作时还要尽可能地复用一个RDD
有一个RDD的数据格式是key-value类型的,另一个是单value类型的,这两个RDD的value数据是完全一样的。那么可以只使用key-value类型的那个RDD,因为其中已经包含了另一个的数据。
对于多个RDD的数据有重叠或者包含的情况,应该尽量复用一个RDD,这样可以尽可能地减少RDD的数量,从而尽可能减少算子执行的次数。;原则二:尽可能复用同一个RDD
;原则三:对多次使用的RDD进行持久化
Spark中对于一个RDD执行多次算子的默认原理是这样的:每次对一个RDD执行一个算子操作时,都会重新从源头处计算一遍,计算出那个RDD来,然后再对这个RDD执行你的算子操作
对多次使用的RDD进行持久化,保存到内存或者磁盘中。以后每次对这个RDD进行算子操作时,都会直接从内存或磁盘中提取持久化的RDD数据,然后执行算子,而不会从源头处重新计算一遍这个RDD,再执行算子操作。;原则三:对多次使用的RDD进行持久化;原则三:对多次使用的RDD进行持久化
默认情况下,性能最高的是MEMORY_ONLY
如果使用MEMORY_ONLY级别时发生了内存溢出,建议尝试使用MEMORY_ONLY_SER级别
如果纯内存的级别都无法使用,建议使用MEMORY_AND_DISK_SER策略,而不是MEMORY_AND_DISK策略。
通常不建议使用DISK_ONLY和后缀为_2的级别
;原则四:尽量避免使用shuffle类算子
要尽量避免使用shuffle类算子。因为Spark作业运行过程中,最消耗性能的地方就是shuffle过程。
则尽可能避免使用reduceByKey、join、distinct、repartition等会进行shuffle的算子
尽量使用map类的非shuffle算子。
;原则五:使用map-side预聚合的shuffle操作
如果因为业务需要,一定要使用shuffle操作,无法用map类的算子来替代,那么尽量使用可以map-side预聚合的算子。
所谓的map-side预聚合,说的是在每个节点本地对相同的key进行一次聚合操作,类似于MapReduce中的本地combiner。
建议使用reduceByKey或者aggregateByKey算子来替代掉groupByKey算子
groupByKey不进行任何本地聚合时,所有数据都会在集群节点之间传输;
reduceByKey每个节点本地的相同key数据,都进行了预聚合,然后才传输到其他节点上进行全局聚合。;原则五:使用map-side预聚合的shuffle操作
groupByKey的原理图;原则五:使用map-side预聚合的shuffle操作
reduceByKey原理图;原则六:使用高性能的算子
使用reduceByKey/aggregateByKey替代groupByKey
使用mapPartitions替代普通map
使用forea
文档评论(0)