1. 程式人生 > >Spark專案實戰-troubleshooting之解決各種序列化導致的報錯

Spark專案實戰-troubleshooting之解決各種序列化導致的報錯

在實際專案中,用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.....
}

});