Apache kafka Can';t访问kafka.serializer.StringDecoder
我添加了卡夫卡和spark streaming的sbt包,如下所示:Apache kafka Can';t访问kafka.serializer.StringDecoder,apache-kafka,spark-streaming,Apache Kafka,Spark Streaming,我添加了卡夫卡和spark streaming的sbt包,如下所示: "org.apache.spark" % "spark-streaming_2.10" % "1.6.1", "org.apache.spark" % "spark-streaming-kafka_2.10" % "1.6.1" 但是,当我想使用kafkadirect流时,我无法访问它 val topics="CCN_TOPIC,GGSN_TOPIC" val topicsSet = topics.split(",").to
"org.apache.spark" % "spark-streaming_2.10" % "1.6.1",
"org.apache.spark" % "spark-streaming-kafka_2.10" % "1.6.1"
但是,当我想使用kafkadirect流时,我无法访问它
val topics="CCN_TOPIC,GGSN_TOPIC"
val topicsSet = topics.split(",").toSet
val kafkaParams = Map[String, String]("metadata.broker.list" -> kafkaBrokers)
val messages= org.apache.spark.streaming.kafka.KafkaUtils[String, String, kafka.serializer.StringDecoder, StringDecoder](
ssc, kafkaParams, topicsSet)
编译器无法识别kafka.serializer.StringDecoder
object serializer is not a member of package org.apache.spark.streaming.kafka
编辑:
我也试过了
import _root_.kafka.serializer
…但其中没有StringDecoder..请尝试以下操作:添加文件 卡夫卡2.11-0.10.0.0.jar
您的项目依赖关系。它应该可以修复您的错误。如果我使用了错误的术语,我表示歉意,我不是依赖项、链接等方面的专家。下面的方法使用HDP 2.4.3工作 1.找到正确的罐子 您需要在您的环境中找到正确的卡夫卡罐子 下面的shell脚本对于创建所有jar中所有类的常规列表并将它们转储到文件(当需要查找特定类的jar时,可以使用egrep搜索该文件)非常有用 我正在使用HDP,所以我指定HDP安装的根目录作为搜索JAR的点。您的平台罐可能在其他地方
all_hdp_classes () {
find -L /usr/hdp/current -maxdepth 20 -name "*.jar" -print | while read line; do
for i in `jar tf $line | grep .class`
do
echo $line : $i
done
done
}
all_hdp_classes > ~/all_hdp_classes
获得列表后,可以按如下方式搜索文件:
egrep 'kafka' ~/all_hdp_classes | grep Decoder
import org.apache.spark.streaming._
import _root_.kafka.serializer.StringDecoder
注意:Ambari仅在Kafka代理所在的节点上安装Kafka代理库。因此,您需要在该节点上搜索,否则将找不到任何内容(或者只找到spark示例)。
然后将Jar复制到运行Spark的节点上
在Kafka broker节点上,我发现以下Jar包含StringDecoder类:
/usr/hdp/current/kafka-broker/libs/kafka_2.10-0.10.1.2.1.2.0-10.jar
请注意,这是一个与kafka_2.11-0.10.0.0.jar不同的文件,正如另一个答案中所建议的,它不包含Decoder类(至少在我的环境中)
还要检查scala版本的2.10或2.11,确保Jar对齐
2.将Jar添加到Spark类路径
在Spark类路径中包含Jar
方法取决于是否要使用spark shell或spark submit仅更新单个会话的类路径,或者是否要更新所有spark会话的类路径(例如使用Ambari)
对于spark shell会话:
spark-shell --jars /path/to/jar/on/this/node/kafka_2.10-0.10.1.2.1.2.0-10.jar
请注意,spark文档中提到的spark-streaming-kafka-maven依赖项可能会在导入步骤中导致冲突,稍后将对此进行解释
如果需要,您仍然可以继续使用--packages选项添加它
示例(Spark 1.6.2和scala 2.10,您的可能有所不同):
3.导入到会话中
您可能会遇到以下错误:
error: object serializer is not a member of package org.apache.spark.streaming.kafka
在我上面的示例中,maven包包含了另一个kafka包,因此它作为“org.apache.spark.streaming.”的一部分导入
要解决此问题,请执行以下操作:
egrep 'kafka' ~/all_hdp_classes | grep Decoder
import org.apache.spark.streaming._
import _root_.kafka.serializer.StringDecoder
导致此问题的一个潜在原因是您导入了
导入org.apache.spark.streaming.kafka.KafkaUtils.createDirectStream
之前
导入kafka.serializer.StringDecoder
正确的顺序是
首先导入kafka.serializer.StringDecoder//
导入org.apache.spark.streaming.kafka.KafkaUtils.createDirectStream
从KafkaUtils类调用createDirectStream
方法的地方?添加根。帮助