2017-04-03 3 views
0

Ich erhalte folgende Fehlermeldung, während ich mich mit einem Kinesis-Stream verbinde.java.lang.NoSuchMethodError: org.apache.spark.storage.BlockManager

java.lang.NoSuchMethodError: org.apache.spark.storage.BlockManager.get(Lorg/apache/spark/storage/BlockId;)Lscala/Option; 
    at org.apache.spark.streaming.kinesis.KinesisBackedBlockRDD.getBlockFromBlockManager$1(KinesisBackedBlockRDD.scala:104) 

Mein Funke Streaming-Code ist,

sc = SparkContext(appName="PythonStreamingTest") 
ssc = StreamingContext(sc, 10) 
dstream = KinesisUtils.createStream(
    ssc, "PythonStreamingTest", "questions", "https://kinesis.us-west-2.amazonaws.com", "us-west-2", InitialPositionInStream.TRIM_HORIZON, 1) 
dstream.foreachRDD(stream_rdd) 

def stream_rdd(rdd): 
    if not rdd.isEmpty(): 
     return rdd.foreach(classify) 

def classify(ele): 
    if ele!="": 
     print ele 

Zunächst wird der Strom kommt leer, da es eine Weile dauert, bis der Kinesis-Stream zu verbinden. Aber dann bricht es plötzlich den Code auf. Der Rest der Spur ist,

17/04/02 17:52:00 ERROR Executor: Exception in task 0.0 in stage 1.0 (TID 1) 
java.lang.NoSuchMethodError: org.apache.spark.storage.BlockManager.get(Lorg/apache/spark/storage/BlockId;)Lscala/Option; 
    at org.apache.spark.streaming.kinesis.KinesisBackedBlockRDD.getBlockFromBlockManager$1(KinesisBackedBlockRDD.scala:104) 
    at org.apache.spark.streaming.kinesis.KinesisBackedBlockRDD.compute(KinesisBackedBlockRDD.scala:117) 
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:323) 
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:287) 
    at org.apache.spark.api.python.PythonRDD.compute(PythonRDD.scala:63) 
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:323) 
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:287) 
    at org.apache.spark.api.python.PythonRDD.compute(PythonRDD.scala:63) 
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:323) 
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:287) 
    at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:87) 
    at org.apache.spark.scheduler.Task.run(Task.scala:99) 
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:282) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 

ich meine Arbeit mit dem folgenden Befehl einreichen,

spark-submit --jars spark-streaming-kinesis-asl-assembly_2.11-2.0.0.jar --driver-memory 5g Question_Type_Classification_testing_purpose/classifier_streaming.py 

ich auf einem lokalen Rechner den Code leite. Wenn ich also 5g Speicher spende, sollte der Executor gut funktionieren. Der gleiche Code funktioniert für Spark 1.6. Vor kurzem habe ich Spark 2.1 geändert und kann diesen Code nicht mehr ausführen. Ich habe mein Kinesisglas und Py4j aktualisiert.

Ich habe meinen Code getestet, indem ich einen Kinesis-Consumer geschrieben habe, und der Stream ist vollkommen in Ordnung.

Kann mir bitte jemand sagen, was das mögliche Problem sein kann? Ist der leere Stream ein Problem? Wenn ja, warum erhalte ich bei der Verwendung von Spark-Streaming einen leeren Stream? Jede Hilfe wird wirklich geschätzt.

+0

Spark-2 könnte die Methode entfernt haben, die in 1.6 gearbeitet ... Lesen Sie die API-Dokumentation –

+0

, welche Methode Sie sprechen? Ich verwende hier nur eine Methode, die "createStream()" ist und die in der Bibliothek vorhanden ist. – Alvin

+0

'NoSuchMethodError' ...' org.apache.spark.storage.BlockManager.get' ... Woher wissen Sie, dass diese Methode existiert? –

Antwort

2

spark-streaming-kinesis-asl ist die eigene interne Bibliothek von Spark und verwendet interne Spark-APIs (z. B. BlockManager.get). Die Methodensignatur von BlockManager.get wurde in https://github.com/apache/spark/commit/29cfab3f1524c5690be675d24dda0a9a1806d6ff#diff-2b643ea78c1add0381754b1f47eec132L605 geändert, so dass Sie NoSuchMethodError sehen, wenn die Spark-Version> = 2.0.1 ist, aber spark-streaming-kinesis-asl Version ist < 2.0.1.

Da Spark nicht verspricht, interne APIs zwischen den Releases nicht zu brechen, müssen Sie im Allgemeinen spark-streaming-kinesis-asl mit der gleichen Spark-Version verwenden.

Für die neuesten Spark-Versionen wurde das Kinesis-asl-Assembly-Jar wegen des potenziellen Lizenzproblems [1] entfernt. Daher können Sie das Assembly-Jar möglicherweise nicht finden. Sie können jedoch --packages org.apache.spark:spark-streaming-kinesis-asl_2.11:2.1.0 verwenden, um spark-streaming-kinesis-asl und seine Abhängigkeiten automatisch in den Klassenpfad einzufügen, anstatt das Assembly-Jar selbst zu erstellen.

[1] https://issues.apache.org/jira/browse/SPARK-17418

+0

Können Sie bitte erklären, was Sie meinen, "Sie müssen diese Bibliotheken mit der gleichen Version von Spark verwenden". Ich verwende Spark 2.1 und verwende die neueste Kinesis asl-Bibliothek/Jar, die auf der Apache Spark-Website verfügbar ist. Das Glas soll mit Spark 2.0 und höher kompatibel sein. Ich bin mir also nicht sicher, was ich vermisse. Ist das Glas, das ich benutze ein falsches Glas? – Alvin

+0

'spark-streaming-kinesis-asl-assembly_2.11-2.0.0.jar' ist eine Spark-Bibliothek, nicht die Kinesis-asl-Bibliothek. Ich erklärte in der Antwort, warum 'das Glas mit Spark 2.0 und größer kompatibel sein soll'. Ist nicht korrekt. – zsxwing

+0

Ändern Sie 'spark-streaming-kinesis-asl-assembly_2.11-2.0.0.jar' in' spark-streaming-kinesis-asl-assembly_2.11-2.1.0.jar', wenn Sie Spark 2.1.0 verwenden.Bitte stellen Sie immer sicher, dass Spark-Streaming-Kinesis-Asl- und Spark-Versionen identisch sind, und dies ist der einfachste Weg, solche Fehler zu vermeiden. – zsxwing

Verwandte Themen