在spark中自己定义的序列化java序列化:Serialization,但是这种序列化并不稳定,所以一般不使用自带的序列化,而是使用外部的kryo序列化,在下面的三个场景中会使用到该种序列化:
- 在算子函数中使用到外部变量时,该变量会被序列化后进行网络传输(见“原则七:广播大变量”中的讲解)。
- 将自定义的类型作为RDD的泛型类型时(比如JavaRDD,Student是自定义类型),所有自定义类型对象,都会进行序列化。因此这种情况下,也要求自定义的类必须实现Serializable接口。
- 使用可序列化的持久化策略时(比如MEMORY_ONLY_SER),Spark会将RDD中的每个partition都序列化成一个大的字节数组。
val sparkConf = new SparkConf() .setMaster("local") .setAppName("Test") .set("spark.serializer", "org.apache.spark.serializer.KryoSerializer") /*.set("spark.kryo.registrationRequired", "true")*/ .registerKryoClasses(Array( classOf[Array[String]], classOf[util.HashMap[String, String]], classOf[util.ArrayList[String]], classOf[MyTest] ))