卡夫卡结构化流 java.lang.NoClassDefFoundError

Posted

技术标签:

【中文标题】卡夫卡结构化流 java.lang.NoClassDefFoundError【英文标题】:Kafka Structured Streaming java.lang.NoClassDefFoundError 【发布时间】:2018-02-21 09:38:13 【问题描述】:

我之前能够运行 Kafka 结构流式编程。但突然间,我所有的结构流式 python 程序都因错误而失败。我从 Spark 网站上获取了基本的 Kafka 结构流式编程,但也因同样的错误而失败。

py4j.protocol.Py4JJavaError:调用 o31.load 时出错。 : java.lang.NoClassDefFoundError: org/apache/kafka/common/序列化/ByteArrayDeserializer 在 org.apache.spark.sql.kafka010.KafkaSourceProvider$.(KafkaSourceProvider.scala:376) 在 org.apache.spark.sql.kafka010.KafkaSourceProvider$.(KafkaSourceProvider.scala)

我正在使用的 Spark 提交

spark-submit --packages org.apache.spark:spark-sql-kafka-0-10_2.11:2.2.0 C:\Users\ranjith.gangam\PycharmProjects\sparktest\Structured_streaming.py

这是我从 Spark github 获取的代码

spark = SparkSession\
      .builder\
      .appName("StructuredKafkaWordCount")\
      .getOrCreate()

# Create DataSet representing the stream of input lines from kafka
lines = spark\
    .readStream\
    .format("kafka")\
    .option("kafka.bootstrap.servers", bootstrapServers)\
    .option(subscribeType, topics)\
    .load()\
    .selectExpr("CAST(value AS STRING)")

words = lines.select(
    # explode turns each item in an array into a separate row
    explode(
        split(lines.value, ' ')
    ).alias('word')
)

# Generate running word count
wordCounts = words.groupBy('word').count()
# Start running the query that prints the running counts to the console
query = wordCounts\
    .writeStream\
    .outputMode('complete')\
    .format('console')\
    .start()

query.awaitTermination()

【问题讨论】:

【参考方案1】:

您的方法是正确的,但不幸的是,PySpark 尚不支持 Kafka 0.10。正如您在SPARK-16534 中看到的那样。

到目前为止,对 pySpark 的唯一支持是 Kafka 0.8。因此,您可以迁移到 spark 0.8 或将代码更改为 Scala。

【讨论】:

添加包 spark-streaming-kafka-0-10-assembly_2.10:2.2.0 后工作正常 @ranjithreddy 你能把你的评论作为答案吗?这样就很容易找到了。谢谢。

以上是关于卡夫卡结构化流 java.lang.NoClassDefFoundError的主要内容,如果未能解决你的问题,请参考以下文章

Kafka主题的JSON中没有发生结构化流 - 流连接

卡夫卡流与卡夫卡消费者如何决定使用啥

春云流卡夫卡

卡夫卡流加入

卡夫卡火花流工作有许多活跃的工作

卡夫卡火花流动态模式