序列化: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(注册指定类)