2016-11-08 113 views
0

我在Spark中得到了任務不可序列化錯誤。我已經搜索並試圖使用一些靜態函數建議在一些職位,但它仍然給出了同樣的錯誤。任務不可串行化 - Spark Java

守則如下:

public class Rating implements Serializable { 
    private SparkSession spark; 
    private SparkConf sparkConf; 
    private JavaSparkContext jsc; 
    private static Function<String, Rating> mapFunc; 

    public Rating() { 
     mapFunc = new Function<String, Rating>() { 
      public Rating call(String str) { 
       return Rating.parseRating(str); 
      } 
     }; 
    } 

    public void runProcedure() { 
     sparkConf = new SparkConf().setAppName("Filter Example").setMaster("local"); 
     jsc = new JavaSparkContext(sparkConf); 
     SparkSession spark = SparkSession.builder().master("local").appName("Word Count") 
      .config("spark.some.config.option", "some-value").getOrCreate();   

     JavaRDD<Rating> ratingsRDD = spark.read().textFile("sample_movielens_ratings.txt") 
       .javaRDD() 
       .map(mapFunc); 
    } 

    public static void main(String[] args) { 
     Rating newRating = new Rating(); 
     newRating.runProcedure(); 
    } 
} 

錯誤得出: enter image description here

我怎麼解決這個問題? 在此先感謝。

回答

7

顯然Rating不能是Serializable,因爲它包含對Spark結構(即SparkSession,SparkConf等)的引用作爲屬性。這裏

的問題是在

JavaRDD<Rating> ratingsRD = spark.read().textFile("sample_movielens_ratings.txt") 
      .javaRDD() 
      .map(mapFunc); 

如果你看看mapFunc定義,你返回一個Rating對象。

mapFunc = new Function<String, Rating>() { 
    public Rating call(String str) { 
     return Rating.parseRating(str); 
    } 
}; 

該功能(在火花方面具有變換)中使用的map內部。因爲轉換直接執行到工作節點而不是在驅動程序節點中,所以它們的代碼必須是可串行化的。這迫使Spark嘗試序列化Rating類,但這是不可能的。

嘗試從Rating中提取您需要的功能,並將它們放置在不具有任何Spark結構的不同類中。最後,使用這個新類作爲你的mapFunc函數的返回類型。

+0

將評分和程序分成兩個班級工作!謝謝 :) – Fleur

相關問題