spark未序列化問題雖然不難,但資料卻不系統,現總結如下:
問題發生原因
當spark算子在使用外部變量時,就會發生序列化問題,如下圖所示:
上述圖中算子map會在各個節點運行,屬於不同jvm間數據交換,需要對交換的內容進行序列化。這就是為什么需要序列化的原因。
方法
1) 序列化類,並使用broadcast廣播
2) 在算子內調用變量
序列化類,使用broadcast廣播變量,一個不錯的方法,優勢在於初始化類的時候只需要一次。其使用方法如下:
類需要實現接口,此類由java實現,如下:
方法二,是在內部實現類:
如果在算子內需要sparkconf等參數,可以通過 conf =SparkContext.getOrCreate()實現
其他可以在算子內初始化類,缺點是,每個map都需要初始化類。且不需要序列化額外操作。
實現如下: