序列化:Java序列化 Kryo序列化 官网:http://spark.apache.org/docs/latest/tuning.html
如果Kryo序列化的对象比较大,需要添加一个参数spark.kryoserializer.buffer(默认64k)(有点小需要调大一点) spark.kryoserializer.buffer.max(默认64m)(需要大于对象尝试序列化的数据的大小,并且小于2048m)(一般2047m??)
如果没有注册你的自定义类,kryo也可以工作,但它必须存储每个对象的完整类名,很浪费性能
代码打包成jar运行后(带有sc.stop()),把序列化给关掉了,在18080端口(history记录)看不到,只好命令行运行(4040的Storage查看) //部分代码 import scala.collection.mutable.ArrayBuffer case class Person(name:String, age:Int, gender:String, address:String) val persons = new ArrayBuffer[Person]() for(i <-1 to 1000000) { persons += (Person("name"+i, 10+i, "male", "beijing")) } val rdd = sc.parallelize(persons) rdd.persist(StorageLevel.MEMORY_ONLY) rdd.count() rdd.unpersist() //注册代码(命令行注册不上去,又换成打包jar了,使用了Thread.sleep(1000000),方便查看) conf.set("spark.serializer","org.apache.spark.serializer.KryoSerializer") conf.registerKryoClasses(Array(classOf[Person]))结果:
Java序列化: MEMORY_ONLY: 95.3 MB MEMORY_ONLY_SER: 39.8 MB ------------------------------ Kryo序列化:(命令行启动可以加--conf spark.serializer=org.apache.spark.serializer.KryoSerializer) MEMORY_ONLY: 95.3 MB MEMORY_ONLY_SER: 119.1 MB(没有注册指定类) MEMORY_ONLY_SER: 27.5 MB(注册指定类)