我在连接到kinesis流时收到以下错误消息。
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,我无法运行此代码。我也更新了我的kinesis jar和Py4j。
我通过编写Kinesis消费者测试了我的代码,它使得流完全正常。
任何人都可以告诉我可能存在的问题吗?空流是否会产生问题?如果是,为什么我在使用Spark流时会得到一个空流?任何帮助都非常感谢。
答案 0 :(得分:2)
spark-streaming-kinesis-asl
是Spark自己的内部库,正在使用Spark内部API(例如,BlockManager.get)。 BlockManager.get
中的NoSuchMethodError
方法签名已更改,因此如果Spark版本为> = 2.0.1但spark-streaming-kinesis-asl
版本为< spark-streaming-kinesis-asl
,则会看到--packages org.apache.spark:spark-streaming-kinesis-asl_2.11:2.1.0
2.0.1。
通常,因为Spark不承诺不在版本之间破坏内部API,所以必须使用spark-streaming-kinesis-asl
和相同版本的Spark。
对于最新的Spark版本,由于潜在的许可证问题[1],kinesis asl程序集jar被删除,因此您可能无法找到程序集jar。但是,您可以使用{{1}}自动将{{1}}及其依赖项添加到类路径中,而不是自己构建程序集jar。