当我尝试使用Kafka集成进行结构化流式传输时,我遇到了NoSuchMethodError。当第一条记录可用时,堆栈跟踪看起来像这样: 引起:java.lang.NoSuchMethodError:
org.apache.kafka.clients.consumer.KafkaConsumer.assign(Ljava/util/Collection;)V
at org.apache.spark.sql.kafka010.CachedKafkaConsumer.createConsumer(CachedKafkaConsumer.scala:56)
at org.apache.spark.sql.kafka010.CachedKafkaConsumer.<init>(CachedKafkaConsumer.scala:45)
at org.apache.spark.sql.kafka010.CachedKafkaConsumer$.getOrCreate(CachedKafkaConsumer.scala:349)
at org.apache.spark.sql.kafka010.KafkaSourceRDD$$anon$1.<init>(KafkaSourceRDD.scala:137)
at org.apache.spark.sql.kafka010.KafkaSourceRDD.compute(KafkaSourceRDD.scala:136)
at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:323)
...
我的sbt有这些依赖关系:
libraryDependencies ++= Seq(
scalaTest % Test,
"org.apache.spark" %% "spark-core" % "2.1.0" % "provided",
"org.apache.spark" %% "spark-sql" % "2.1.0" % "provided",
"org.apache.spark" %% "spark-sql-kafka-0-10" % "2.1.0" % "provided",
"org.apache.hadoop" % "hadoop-client" % "2.6.0" % "provided"
)
和Scala版本是2.11.8。
我能够为数据帧运行spark应用程序。这只是Kafka集成给了我这个错误。结构化流媒体代码只是文档here中的示例:
val ds1 = spark
.readStream
.format("kafka")
.option("kafka.bootstrap.servers", "data01:9092,data02:9092,data03:9092")
.option("subscribe", "cluster-topic-01")
.load()
val ds2 = ds1.selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)")
val query = ds2.writeStream
.format("console")
.start()
query.awaitTermination()
我可以在哪些建议中查看问题? TIA
答案 0 :(得分:2)
我的猜测是你在正在加载的运行时类路径中的某个地方有一个流浪的Kafka客户端而不是spark-sql-kafka-0-10
依赖的那个。
答案 1 :(得分:0)
在现代CDH发行版(例如Cloudera 5.12)中,有一种更简单的方法。
spark_kafka_version
的配置设置为“ 0.9”或“无”。如果上述方法不起作用(Cloudera中没有'0.10'值或没有这样的配置),则可以手动编辑配置:
/etc/spark2/conf.cloudera.spark2_on_yarn/spark-env.sh
。以以下方式编辑2个配置(SPARK_KAFKA_VERSION
和SPARK_DIST_CLASSPATH
):
SPARK_KAFKA_VERSION=${SPARK_KAFKA_VERSION:-'0.10'}
SPARK_DIST_CLASSPATH="$SPARK_HOME/kafka-0.10/*"
在每个YARN节点和客户端节点上执行步骤1-2。