spark的序列化主要使用了hadoop的writable和java的Serializable。
說到底就是使用hadoop的writable替換了java的默認序列化實現方式。
class SerializableWritable[T <: Writable](@transient var t: T) extends Serializable {
def value: T = t override def toString: String = t.toString private def writeObject(out: ObjectOutputStream): Unit = Utils.tryOrIOException { out.defaultWriteObject() new ObjectWritable(t).write(out) } private def readObject(in: ObjectInputStream): Unit = Utils.tryOrIOException { in.defaultReadObject() val ow = new ObjectWritable() ow.setConf(new Configuration()) ow.readFields(in) t = ow.get().asInstanceOf[T] } }
這個有個讓人疑惑的地方是使用@transient 表示該值不會被序列化,我做個一個測試是可以的,為什么呢,因為spark這里定制了java的序列化,使用hadoop的序列化方案,同時t是Writable類型沒有實現Serializable接口不能被序列化。
object SerializableWritableTest extends App
{
println("start")
val name:Text=new Text("gaoxing");
val s=new SerializableWritable[Text](name);
val fout=new FileOutputStream("name.dat");
val out=new ObjectOutputStream(fout);
out.writeObject(s)
val fin=new FileInputStream("name.dat");
val in=new ObjectInputStream(fin);
val n=in.readObject()
println(n.asInstanceOf[SerializableWritable[Text]].value.toString)
println("end")
}
