![](https://csdnimg.cn/release/download_crawler_static/86370114/bg4.jpg)
的 Executor 中占用过多内存导致的频繁 GC,都会极大地影响性能。如
果使用的外部变量比较大,建议使用 Spark 的广播功能,对该变量进行
广播。广播后的变量,会保证每个 Executor 的内存中,只驻留一份变
量副本,而 Executor 中的 task 执行时共享该 Executor 中的那份变量
副本。这样的话,可以大大减少变量副本的数量,从而减少网络传输的
性能开销,并减少对 Executor 内存的占用开销,降低 GC 的频率。
广播大变量发送方式:Executor 一开始并没有广播变量,而是 task 运
行需要用到广播变量,会找 executor 的 blockManager 要,
bloackManager 找 Driver 里面的 blockManagerMaster 要。
使用广播变量可以大大降低集群中变量的副本数。不使用广播变量,变
量的副本数和 task 数一致。使用广播变量变量的副本和 Executor 数一
致。
7. 使用 Kryo 优化序列化性能
在 Spark 中,主要有三个地方涉及到了序列化:
1) 在算子函数中使用到外部变量时,该变量会被序列化后进行网络传输。
2) 将自定义的类型作为 RDD 的泛型类型时(比如 JavaRDD<SXT>,
SXT 是自定义类型),所有自定义类型对象,都会进行序列化。因此
这种情况下,也要求自定义的类必须实现 Serializable 接口。
3) 使用可序列化的持久化策略时(比如 MEMORY_ONLY_SER),
Spark 会将 RDD 中的每个 partition 都序列化成一个大的字节数组。
Kryo 序列化器介绍:
Spark 支持使用 Kryo 序列化机制。Kryo 序列化机制,比默认的 Java 序
列化机制,速度要快,序列化后的数据要更小,大概是 Java 序列化机制
的 1/10。所以 Kryo 序列化优化以后,可以让网络传输的数据变少;在
集群中耗费的内存资源大大减少。
对于这三种出现序列化的地方,我们都可以通过使用 Kryo 序列化类库,
来优化序列化和反序列化的性能。Spark 默认使用的是 Java 的序列化机
制,也就是 ObjectOutputStream/ObjectInputStream API 来进行序
列化和反序列化。但是 Spark 同时支持使用 Kryo 序列化库,Kryo 序列