Spark Kafka 0.10 NoSuchMethodError org.apache.kafka.clients.consumer.KafkaConsumer.assign

时间:2017-03-26 22:55:33

标签: apache-spark

当我尝试使用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

2 个答案:

答案 0 :(得分:2)

我的猜测是你在正在加载的运行时类路径中的某个地方有一个流浪的Kafka客户端而不是spark-sql-kafka-0-10依赖的那个。

答案 1 :(得分:0)

在现代CDH发行版(例如Cloudera 5.12)中,有一种更简单的方法。

  1. 在Cloudera Manager的UI中,转到Spark2选项卡,然后转到“配置”。
  2. 通过“ kafka”关键字搜索必要的配置。您应该将spark_kafka_version的配置设置为“ 0.9”或“无”。
  3. 设置“ 0.10”值并部署客户端配置。
  4. 如有必要,重新启动Spark2服务。

如果上述方法不起作用(Cloudera中没有'0.10'值或没有这样的配置),则可以手动编辑配置:

  1. 在任何编辑器中打开文件/etc/spark2/conf.cloudera.spark2_on_yarn/spark-env.sh
  2. 以以下方式编辑2个配置(SPARK_KAFKA_VERSIONSPARK_DIST_CLASSPATH): SPARK_KAFKA_VERSION=${SPARK_KAFKA_VERSION:-'0.10'} SPARK_DIST_CLASSPATH="$SPARK_HOME/kafka-0.10/*"

  3. 在每个YARN节点和客户端节点上执行步骤1-2。