六、火花,火花调优

  (TOC)

  

一、火花调优概论

  

1.1什么是火花调优

  

?火花的计算本质是分布式计算,程序的性能受集群中的任何因素的影响,如:CPU、网络带宽,内存等。一般情况下,如果内存足够大,那么其他因素影响性能。然后出现调优需求时,更多是因为资源不够用的情况,所以才需要调节资源的使用情况,更加高效的使用资源,比如如果内存比较紧张,不足以存放所有数据(10亿条),需要针对内存的使用,进行调优来减少内存的消耗

  

1.2火花调优的主要方向

  

?引发的性能优化,大部分的工作,是对于内存的使用,进行调优。通常情况下,火花处理的程序数据量较小,内存足够使用,只要保证网络通常,一般不会出现大的性能问题。但是,火花应用程序的性能问题往往出现在针对大数据量进行计算时(数据突增)。这种情况往往是现环境是无法满足的,所以可能导致集群崩溃。
?除了内存调优之外,还有一些手段可以优化性能。比如火花使用过程中有和mysql交互的话,此时调优也要考虑到mysql的性能问题。

  

1.3火花调优的主要技术手段

  

1,使用高性能序列化类库。目的减少序列化时间以及序列化后数据的大小
2,优化数据结构。目的减少内存占用
3,对多次使用的抽样进行持久化抽样缓存),检查点
4,使用序列化的持久化级别:MEMORY_ONLY不序列化,MEMORY_ONLY_SER序列化。
MEMORY_ONLY比MEMORY_ONLY_SER要占用更多内存空间。
但是要注意,序列化会增加cpu使用成本,所以要权衡好
5, Java虚拟机垃圾回收调优。
6,洗牌调优,90%的问题都是洗牌导致(1. x版本时此问题严重,到2. x版,本官网基本已优化,所以到2. x版本,这个问题可忽略)

  

其他性能优化的方式:
提高计算并行度
广播共享数据

  

下面会针对这6点调优手段进行分析

  

二,诊断火花内存使用情况

  

2.1内存花费(对象内存花费)

  
 <代码> 1,每个java/scala对象,由两部分组成,一个是对象头,占用16个字节,主要包含对象的一些元信息,比如指向它的类的指针。另一个是对象本身。如果对象比较小,比如int,它的对象头比自己对象本身都大。
  
  2、字符串对象,会比他内部的原始数据,多出40个字节,用于保存字符串类型的元信息
  字符串内部使用字符数组来保存字符串序列,并且还要保存诸如数组长度之类的信息.String使用utf - 16编码,所以每个字符会占用2个字节。
  比如:包含10个字符的字符串,占用2 * 10 + 40个字节。
  
  3、集合类型,比如HashMap和LinkedList,内部使用链表数据结构,对链表中的每个数据,使用条目对象包装.Entry对象,不光有对象头,还有指向下一个条目的指针,占用8个字节,所以一句话就是,这种内部还包含多个对象的类型,占用内存更多。因为对象多了,除了对象本身数据占用内存之外,更多对象也就会有更多对象头,占用了不少内存空间。
  
  4,基本数据类型的集合,比如int集合,内部会使用对象的包装类整数来存储元素。 
  

2.2获取火花程序内存使用情况

  

到司机日志目录下查看程序运行日志

  
 <代码>少$ {spark_home}/工作/app-xxxxxx/0/stderr
  观察到类似如下信息:
  信息MemoryStore: broadcast_1作为值存储在内存块(约320.9 KB大小,免费366.0 MB)
  19/07/05 05:57:47信息MemoryStore: rdd_3_1作为值存储在内存块(大约26.0 MB大小,自由339.9 MB)
  19/07/05 05:57:47信息执行人:完成任务阶段0.0 1.0 2212字节(TID 1)。结果发送给司机
  19/07/05 05:57:48信息MemoryStore: rdd_3_0作为值存储在内存块(大约26.7 MB大小,自由313.2 MB)
  
  估计尺寸320.9 KB:当前使用的内存大概大小
  免费366.0 MB:剩余空闲内存大小 
  

这样就可以知道任务使用内存的情况了

  

三,火花调优技术手段

  

2.1使用高性能序列化类库

  

2.1.1火花序列化的使用情况

  

?火花作为一个分布式系统,和其他分布式系统一样,都需要序列化。任何一个分布式系统中,序列化都是很重要的一环。如果使用的序列化技术,操作很慢,序列化后数据量大,会导致分布式系统应用程序性能下降很多,所以,引发性能优化的第一步,就是进行序列化性能的优化。
?火花在一些地方是会使用序列化,比如洗牌的时候,但是引发对便捷性和性能进行了取舍,火花为了便捷性,默认使用了java的序列化机制,java的序列化机制之前也讲过,性能不高,序列化速度慢,序列化后数据大。所以一般生产中,最好修改火花使用的序列化机制

六、火花,火花调优