spark未序列化问题虽然不难,但资料却不系统,现总结以下:java
问题发生缘由jvm
当spark算子在使用外部变量时,就会发生序列化问题,以下图所示:spa
上述图中算子map会在各个节点运行,属于不一样jvm间数据交换,须要对交换的内容进行序列化。这就是为何须要序列化的缘由。3d
方法blog
1) 序列化类,并使用broadcast广播接口
2) 在算子内调用变量get
序列化类,使用broadcast广播变量,一个不错的方法,优点在于初始化类的时候只须要一次。其使用方法以下:it
类须要实现接口,此类由java实现,以下:spark
方法二,是在内部实现类:ast
若是在算子内须要sparkconf等参数,能够经过 conf =SparkContext.getOrCreate()实现
其余能够在算子内初始化类,缺点是,每一个map都须要初始化类。且不须要序列化额外操做。
实现以下: