我已经添加了kafka和spark流的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(",").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 ..
答案 0 :(得分:4)
请尝试此操作:添加文件
kafka_2.11-0.10.0.0.jar
到您的项目依赖项。它应该修复你的错误。
答案 1 :(得分:1)
道歉,如果我使用错误的术语,我不是依赖关系,链接等专家。下面的方法使用HDP 2.4.3。
您需要在您的环境中找到正确的Kafka罐。
以下shell脚本对于创建所有Jars中所有类的一般列表以及将它们转储到文件(当您需要为特定类查找Jars时可以使用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
注意:Ambari仅在Kafka代理所在的节点上安装Kafka代理库。因此,您需要在该节点上搜索,否则您将找不到任何内容(或者您只能找到spark示例)。 然后将Jar复制到运行Spark的节点上。
在Kafka代理节点上,我发现以下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对齐。
在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,您的可能不同):
spark-shell --packages org.apache.spark:spark-streaming-kafka_2.10:1.6.2 --jars kafka_2.10-0.10.1.2.1.2.0-10.jar
import org.apache.spark.streaming._
import kafka.serializer.StringDecoder
您可能会收到以下错误:
error: object serializer is not a member of package org.apache.spark.streaming.kafka
在上面的示例中,maven包中包含另一个kafka包,因此它是作为“org.apache.spark.streaming ._”的一部分导入的。
要解决,请执行以下操作:
import org.apache.spark.streaming._
import _root_.kafka.serializer.StringDecoder
答案 2 :(得分:0)
导致此问题的一个潜在原因是您导入
import org.apache.spark.streaming.kafka.KafkaUtils.createDirectStream
之前
import kafka.serializer.StringDecoder
。
正确的顺序是
import kafka.serializer.StringDecoder //first
import org.apache.spark.streaming.kafka.KafkaUtils.createDirectStream