Spark&Spark性能调优实战

Spark特别适用于多次操作特定的数据,分mem-only和mem & disk。当中mem-only:效率高,但占用大量的内存,成本非常高;mem
& disk:内存用完后,会自己主动向磁盘迁移,攻克了内存不足的问题,却带来了数据的置换的消费。Spark常见的调优工具有nman、Jmeter和Jprofile,下面是Spark调优的一个实例分析:

1、场景:精确客户群

对一个容量为300g的客户信息表在spark上进行查询优化,该大宽表有1800多列。有效使用的有20列。

2、优化达到的效果:查询由原来的40.232s减少为2.7s

3、优化过程分析

第一步:首先发现磁盘存在大量的iowait,通过查看相关日志文件,发现一个block的大小进而推算出整个数据文件大小为300G整个内存无法容纳,採用压缩的方法实现优化。结合本数据文件的特点。存在大量的0和1,选
Gzip算法进行压缩。压缩后的大小为1.9G,该步使得查询从40.232降为了20.12s。

第二步:大宽表存在1800多列。而有效使用的仅仅有20多列,故通过RCFILE仅仅将有效的列载入。该步使得查询从20s降为12s。

第三步:通过Jprofile分析出CPU的负载过高,究竟是什么原因造成的,细致发现序列化机制有问题。Spark的serialization框架有两种:java自身的和kryo的。当中kryo
是一个高速高效的Java对象图形序列化框架,主要特点是性能、高效和易用,换成kryo后,查询从12s降到7s。

第四步:进一步分析CPU各核负载量非常不均匀。内存也没实用满,系统的资源没有得到充分利用,该怎样利用? (1)Spark的RDD的partition个数创建task的个数是相应的;(2)Partition的个数在hadoop的RDD中由block的个数决定的,内存:系统总内存数=work内存大小*work数=SPARK_WORKER_MEMORY*SPARK_WORKER_INSTANCES;

CPU:系统总的task数=work数×work所占的cores数=SPARK_WORKER_INSTANCES*SPARK_WORKER_CORES,计算task并行度。内存分配情况,调优參数:

SPARK_WORKER_INSTANCES=4

SPARK_WORKER_CORES = 3

SPARK_WORKER_MEMORY = 6G

Cpu(12core)  mem(24G),通过这几个參数的优化,查询由7s降到5s。

第五步:进一步发现Sharkserver端出现明显的fullGC,通过调优參数

Export SHARK_MASTER_MEM=2g,该步由6s降到3sl;

第六步:又发现当两表关联时,cpu
出现瓶颈,分析原因是日表做了gzip压缩,优化方法:日表不使用gzip压缩。将日表做成内存表。查询从3s降到2s。

4、总结

优化是一个逐步求精的过程,回想该优化过程,主要是从下面几个因素考虑:(1)mem;(2)cpu;(3)dis;(4)网络IO;(5)序列化机制。

认真这些因素为主线,挖掘与其相关的内容时行大胆尝试。

时间: 2024-08-05 13:29:53

Spark&Spark性能调优实战的相关文章

Spark&Spark性能调优实战

Spark特别适用于多次操作特定的数据,分mem-only和mem & disk.其中mem-only:效率高,但占用大量的内存,成本很高;mem & disk:内存用完后,会自动向磁盘迁移,解决了内存不足的问题,却带来了数据的置换的消费.Spark常见的调优工具有nman.Jmeter和Jprofile,以下是Spark调优的一个实例分析: 1.场景:精确客户群 对一个容量为300g的客户信息表在spark上进行查询优化,该大宽表有1800多列,有效使用的有20列. 2.优化达到的效果:

JVM 性能调优实战之:一次系统性能瓶颈的寻找过程

玩过性能优化的朋友都清楚,性能优化的关键并不在于怎么进行优化,而在于怎么找到当前系统的性能瓶颈.性能优化分为好几个层次,比如系统层次.算法层次.代码层次...JVM 的性能优化被认为是底层优化,门槛较高,精通这种技能的人比较少.笔者呆过几家技术力量不算弱的公司,每个公司内部真正能够进行 JVM 性能调优的人寥寥无几.甚至没有.如是乎,能够有效通过 JVM 调优提升系统性能的人往往被人们冠以"大牛"."大师"之类的称呼.其实 JVM 本身给我们提供了很多强大而有效的监

JVM 性能调优实战之:使用阿里开源工具 TProfiler 在海量业务代码中精确定位性能代码

本文是<JVM 性能调优实战之:一次系统性能瓶颈的寻找过程> 的后续篇,该篇介绍了如何使用 JDK 自身提供的工具进行 JVM 调优将 TPS 由 2.5 提升到 20 (提升了 7 倍),并准确定位系统瓶颈:我们应用里静态对象不是太多.有大量的业务线程在频繁创建一些生命周期很长的临时对象,代码里有问题.那么问题来了,如何在海量业务代码里边准确定位这些性能代码?本文将介绍如何使用阿里开源工具 TProfiler 来定位这些性能代码,成功解决掉了 GC 过于频繁的性能瓶颈,并最终在上次优化的基础

PHP 性能分析第三篇: 性能调优实战

注意:本文是我们的 PHP 性能分析系列的第三篇,点此阅读 PHP 性能分析第一篇: XHProf & XHGui 介绍 ,或  PHP 性能分析第二篇: 深入研究 XHGui. 在本系列的 第一篇 中,我们介绍了 XHProf .而在 第二篇 中,我们深入研究了 XHGui UI, 现在最后一篇,让我们把 XHProf /XHGui 的知识用到工作中! 性能调优 不用运行的代码才是绝好的代码.其他只是好的代码.所以,性能调优时,最好的选择是首先确保运行尽可能少的代码. OpCode 缓存 首先

UIKit性能调优实战讲解

使用微信扫一扫查看全文干货 作者:bestswifter 在使用UIKit的过程中,性能优化是永恒的话题.很多人都看过分析优化滑动性能的文章,但其中不少文章只介绍了优化方法却对背后的原理避而不谈,或者是晦涩难懂而且读者缺乏实践体验的机会.不妨思考一下下面的问题自己是否有一个清晰的认识: 为什么要把控件尽量设置成不透明的,如果是透明的会有什么影响,如何检测这种影响? 为什么cell中的图片,尽可能要使用正确的大小.格式,如果错误会有什么影响,如何检测这种影响? 为什么设置阴影和圆角有可能影响滑动时

深入理解JVM(6)——JVM性能调优实战

如何在高性能服务器上进行JVM调优:以便充分利用高性能服务器的硬件资源,有两种JVM调优方案. 一.        采用64位操作系统,并为JVM分配大内存 分析:如果JVM中堆内存太小,那么就会频繁地发生垃圾回收,而垃圾回收都会伴随不同程度的程序停顿. a)        优点:扩大堆内存的话可以减少垃圾回收的频率,从而避免程序的停顿.因此,人们自然而然想到扩大内存容量.而32位操作系统理论上最大只支持4G内存,64位操作系统最大能支持128G内存,因此我们可以使用64位操作系统,并使用64位

ifeve.com 南方《JVM 性能调优实战之:使用阿里开源工具 TProfiler 在海量业务代码中精确定位性能代码》

https://blog.csdn.net/defonds/article/details/52598018 多次拉取 JStack,发现很多线程处于这个状态:    at jrockit/vm/Allocator.getNewTla(JJ)V(Native Method)    at jrockit/vm/Allocator.allocObjectOrArray(Allocator.java:354)[optimized]    at java/util/HashMap.resize(Hash

[大数据性能调优] 第二章:彻底解密Spark的HashShuffle

本課主題 Shuffle 是分布式系统的天敌 Spark HashShuffle介绍 Spark Consolidated HashShuffle介绍 Shuffle 是如何成为 Spark 性能杀手 Shuffle 性能调优思考 Spark HashShuffle 源码鉴赏 引言 Spark HashShuffle 是它以前的版本,现在1.6x 版本默应是Sort-Based Shuffle,那为什么要讲 HashShuffle 呢,因为有分布式就一定会有 Shuffle,而且 HashShu

spark性能调优(二) 彻底解密spark的Hash Shuffle

装载:http://www.cnblogs.com/jcchoiling/p/6431969.html 引言 Spark HashShuffle 是它以前的版本,现在1.6x 版本默应是 Sort-Based Shuffle,那为什么要讲 HashShuffle 呢,因为有分布式就一定会有 Shuffle,而且 HashShuffle 是 Spark以前的版本,亦即是 Sort-Based Shuffle 的前身,因为有 HashShuffle 的不足,才会有后续的 Sorted-Based S