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(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(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,我无法 运行 这段代码。我也更新了我的 kinesis jar 和 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 版本 < 2.0.1,您将看到 NoSuchMethodError

通常,因为 Spark 不保证不会破坏不同版本之间的内部 API,所以您必须使用 spark-streaming-kinesis-asl 与相同版本的 Spark。

对于最新的 Spark 版本,由于潜在的许可证问题 [1],kinesis asl assembly jar 已被删除,因此您可能无法找到该 assembly jar。但是,您可以使用 --packages org.apache.spark:spark-streaming-kinesis-asl_2.11:2.1.0 自动将 spark-streaming-kinesis-asl 及其依赖项添加到类路径中,而不是自己构建程序集 jar。

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