无法访问kafka.serializer.StringDecoder

时间:2016-10-16 23:39:04

标签: apache-kafka spark-streaming

我已经添加了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 ..

3 个答案:

答案 0 :(得分:4)

请尝试此操作:添加文件

  

kafka_2.11-0.10.0.0.jar

到您的项目依赖项。它应该修复你的错误。

答案 1 :(得分:1)

道歉,如果我使用错误的术语,我不是依赖关系,链接等专家。下面的方法使用HDP 2.4.3。

1。找到正确的Jar

您需要在您的环境中找到正确的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对齐。

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,您的可能不同):

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

3。导入您的会话

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