Spark專案實戰-troubleshooting之解決各種序列化導致的報錯
阿新 • • 發佈:2018-12-11
在實際專案中,用client模式去提交spark作業,觀察本地打印出來的log。如果出現了類似於Serializable、Serialize等等字眼,報錯的log,那麼基本上可以斷定是序列化問題導致的報錯。 雖然是報錯,但是序列化報錯應該是屬於比較簡單的了,很好處理。
序列化報錯要注意的三個點:
1、你的運算元函式裡面,如果使用到了外部的自定義型別的變數,那麼此時,就要求你的自定義型別,必須是可序列化的。
final Teacher teacher = new Teacher("leo"); studentsRDD.foreach(new VoidFunction() { public void call(Row row) throws Exception { String teacherName = teacher.getName(); .... } }); public class Teacher implements Serializable { }
2、如果要將自定義的型別,作為RDD的元素型別,那麼自定義的型別也必須是可以序列化的。
JavaPairRDD<Integer, Teacher> teacherRDD
JavaPairRDD<Integer, Student> studentRDD
studentRDD.join(teacherRDD)
public class Teacher implements Serializable {
}
public class Student implements Serializable {
}
3、不能在上述兩種情況下,去使用一些第三方的,不支援序列化的型別。
Connection conn =
studentsRDD.foreach(new VoidFunction() {
public void call(Row row) throws Exception {
conn.....
}
});