由于大部分
Spark
计算都是在内存中完成的,所以Spark
程序的瓶颈可能由集群中任意一种资源导致,如:CPU
、网络带宽、或者内存等。最常见的情况是,数据能装进内存,而瓶颈是网络带宽;当然,有时候我们也需要做一些优化调整来减少内存占用,例如将RDD
以序列化格式保存。
本文将主要涵盖两个主题:1.数据序列化(这对于优化网络性能极为重要);2.减少内存占用以及内存调优。同时,我们也会提及其他几个比较小的主题。
1 数据序列化
序列化在任何一种分布式应用性能优化时都扮演几位重要的角色。如果序列化格式序列化过程缓慢,或者需要占用字节很多,都会大大拖慢整体的计算效率。
通常,序列化都是Spark
应用优化时首先需要关注的地方。Spark
着眼于便利性(允许你在计算过程中使用任何Java
类型)和性能的一个平衡。Spark
主要提供了两个序列化库:
-
Java serialization
:默认情况,Spark
使用Java
自带的ObjectOutputStream
框架来序列化对象,这样任何实现了java.io.Serializable
接口的对象,都能被序列化。同时,你还可以通过扩展java.io.Externalizable
来控制序列化性能。Java
序列化很灵活但性能较差,同时序列化后占用的