文章目录
一. RDD序列化的原因
Spark初始化工作是在Driver端进行的
,而实际运行程序是在Executor端进行的,这就涉及到了跨进程通信,是需要序列化的。所以用户开发的关于RDD的map,flatMap,reduceByKey等transformation 操作(闭包)有如下执行过程:
- 代码中对象在driver本地序列化
- 对象序列化后传输到远程executor节点
- 远程executor节点反序列化对象,最终在远程executor节点中执行。
在spark中4个地方用到了序列化:
- 算子中用到了driver定义的外部变量时;
- 将自定义的class作为RDD的数据类型时;
- 使用可序列化的持久化策略的时候。比如:MEMORY_ONLY_SER,spark会将RDD中每个分区都序列化成一个大的字节数组;
- shuffle。
二. Kryo序列化框架
官网地址: https://github.com/EsotericSoftware/kryo
Java的序列化能够序列化任何的类。但是比较重,序列化后对象的体积也比较大。
Spark出于性能的考虑,Spark2.0开始支持另外一种Kryo序列化机制。Kryo速度是Serializable的10倍。当RDD在Shuffle数据的时候,简单数据类型、数组和字符串类型已经在Spark内部使用Kryo来序列化。
spark使用Kryo序列化框架
public class Test02_Kryo {
public static void main(String[] args) throws ClassNotFoundException {
// 1.创建配置对象
SparkConf conf = new SparkConf().setMaster("local[*]").setAppName("sparkCore")
// 替换默认的序列化机制
.set("spark.serializer",