關於《Spark快速大數據分析》運行例子遇到的報錯及解決

一、描述

在書中第二章,有一個例子,構建完之後,運行:

${SPARK_HOME}/bin/spark-submit --class com.oreilly.learningsparkexamples.mini.java.WordCount ./target/learning-spark-mini-example-0.0.1.jar ./README.md ./wordcouts

如果用的spark版本與書中用到的不一樣的話,就會出現各種問題,譬如書中用的是1.2.0而我用的是最新的2.3.0。

二、問題及解決

1. 第一次編譯的時候,出現類似下面的報錯:

ERROR Executor: Exception in task 0.0 in stage 0.0 (TID 0)

java.lang.AbstractMethodError: com.oreilly.learningsparkexamples.mini.java.WordCount$1.call(Ljava/lang/Object;)Ljava/util/Iterator;
....

首先是解決版本依賴的問題:

(1)獲得spark-core的版本和spark的版本,通過查看以下路徑獲得:

${SPARK_HOME}/jars/spark-core_x.xx-y.y.y.jar

(2)修改mini-complete-example目錄下的pom.xml,把剛纔查看到的版本號替換原來的:

<dependency> <!-- Spark dependency -->
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-core_x.xx</artifactId>
    <version>y.y.y</version>
    <scope>provided</scope>
</dependency>

重新編譯。

 

2. 第二次編譯估計會遇到下面的報錯:

Java FlatMapFunction in Spark: error: is not abstract and does not override abstract method call(String) in FlatMapFunction
......

定位到出錯的句子:

JavaRDD<String> words = input.flatMap(
      new FlatMapFunction<String, String>() {
        public Iterable<String> call(String x) {
          return Arrays.asList(x.split(" "));
}});

又查了一下書裏關於FlatMapFunction<T, R>()接口的繼承規則,沒發現錯誤,轉念一下,可能又是版本不一樣造成的。查了一下最新版本的api,發現需要實現的方法的返回類型變了:

java.util.Iterator<R>    call(T t)

是一個Iterator<R>而不是Iterable<R>,對症下藥:

(1)導入Iterator包:

import java.util.Iterator;

(2)把出錯的句子修改成:

JavaRDD<String> words = input.flatMap(
      new FlatMapFunction<String, String>() {
        @Override public Iterator<String> call(String x) {
          return Arrays.asList(x.split(" ")).iterator();
        }});

重新編譯,打包:

mvn compile && mvn package

然後再運行,問題解決

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章