簡體   English   中英

java.lang.NoSuchMethodError:org.apache.spark.storage.BlockManager

[英]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)

我的火花流代碼是

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

最初,該流變為空白,因為需要一段時間才能連接到Kinesis流。 但是突然之間,它破壞了代碼。 剩下的痕跡是,

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)

我使用以下命令提交工作,

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

我在本地計算機上運行代碼。 因此,如果我要提供5g的內存,則執行程序應該可以正常工作。 相同的代碼適用於Spark 1.6。 最近,我更改為Spark 2.1,但無法運行此代碼。 我也更新了我的運動罐和Py4j。

我通過編寫Kinesis使用者來測試我的代碼,它可以完美地完成流。

誰能讓我知道可能是什么問題? 空流是否會引起問題? 如果是,為什么在使用Spark流時會出現空流? 任何幫助都非常感謝。

spark-streaming-kinesis-asl是Spark自己的內部庫,並且正在使用Spark內部API(例如BlockManager.get)。 BlockManager.get的方法簽名已在https://github.com/apache/spark/commit/29cfab3f1524c5690be675d24dda0a9a1806d6ff#diff-2b643ea78c1add0381754b1f47eec132L605中進行了更改,因此如果Spark版本為> = 2.0.1,但spark-streaming-kinesis-asl ,您將看到NoSuchMethodError spark-streaming-kinesis-asl版本小於2.0.1。

通常,由於Spark不能保證不會在發行版之間破壞內部API,因此必須將spark-streaming-kinesis-asl與相同版本的Spark配合使用。

對於最新的Spark版本,由於潛在的許可證問題[1],已刪除了kinesis asl組裝罐,因此您可能找不到組裝罐。 但是,您可以使用--packages org.apache.spark:spark-streaming-kinesis-asl_2.11:2.1.0spark-streaming-kinesis-asl及其依賴項自動添加到類路徑中,而不用構建程序集jar由你自己。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM