【问题标题】:SBT cannot import Kafka encoder/decoder classesSBT 无法导入 Kafka 编码器/解码器类
【发布时间】:2016-07-23 16:50:17
【问题描述】:

项目设置:

  • 1 个生产者 - 序列化对象并将字节发送到 Kafka
  • 1 spark 消费者 - 应该在 kafka.serializer 中使用 DefaultDecoder 包消耗字节

问题:

  • SBT 导入正确的库 (kafka-clients + kafka_2.10) 但 在 kafka_2.10 jar 中找不到任何类。
  • 好像在错误的路径下搜索 (org.apache.spark.streaming.kafka 而不是 org.apache.kafka)。

错误信息:

    object serializer is not a member of package org.apache.spark.streaming.kafka [error] 
import kafka.serializer.DefaultDecoder.

sbt-tree

    [info]   +-org.apache.spark:spark-streaming-kafka_2.10:1.6.1
    [info]   | +-org.apache.kafka:kafka_2.10:0.8.2.1 [S] <-- **DefaultDecoder is in here 
but SBT can't find it (org.apache.kafka.serialization.DefaultDecoder)**
    [info]   | | +-org.apache.kafka:kafka-clients:0.8.2.1

built.sbt:

  lazy val commonSettings = Seq(
  organization := "org.RssReaderDemo",
  version := "0.1.0",
  scalaVersion := "2.10.6"
)

resolvers += "Artima Maven Repository" at "http://repo.artima.com/releases"

val spark = "org.apache.spark" % "spark-core_2.10" % "1.6.1"
val sparkStreaming = "org.apache.spark" % "spark-streaming_2.10" % "1.6.1"
val sparkStreamKafka = "org.apache.spark" % "spark-streaming-kafka_2.10" % "1.6.1"

// Needed to be able to parse the generated avro JSON schema
val jacksonMapperAsl = "org.codehaus.jackson" % "jackson-mapper-asl" % "1.9.13"

val scalactic = "org.scalactic" %% "scalactic" % "2.2.6"
val scalatest = "org.scalatest" %% "scalatest" % "2.2.6" % "test"

val avro = "org.apache.avro" % "avro" % "1.8.0"

lazy val root = (project in file(".")).
  settings(commonSettings: _*).
  settings(
    libraryDependencies += spark,
    libraryDependencies += sparkStreaming,
    libraryDependencies += sparkStreamKafka,
    libraryDependencies += jacksonMapperAsl,
    libraryDependencies += scalactic,
    libraryDependencies += scalatest,
    libraryDependencies += avro
  )

【问题讨论】:

  • 导致SBT出错的代码:import kafka.serializer.DefaultDecoder

标签: apache-spark sbt apache-kafka spark-streaming kafka-consumer-api


【解决方案1】:

这与 SBT 无关。你可能有类似

import org.apache.spark.streaming._
import kafka.serializer.DefaultDecoder

因为存在org.apache.spark.streaming.kafka 包,所以此导入解析为org.apache.spark.streaming.kafka.serializer.DefaultDecoder。您可以按如下方式导入正确的类:import _root_.kafka.serializer.DefaultDecoder。有关 Scala 导入的更多详细信息,请参阅https://wiki.scala-lang.org/display/SYGN/Language+FAQs#LanguageFAQs-HowdoIimport

【讨论】:

  • 谢谢 - 看起来是这样。
  • 谢谢。我的代码是根据你的建议编译的
  • 谢谢 - 这让我朝着正确的方向前进。我通过在我的导入中更明确地解决了这个问题: import org.apache.spark.streaming.{Seconds, StreamingContext} import kafka.serializer.StringDecoder 这将是我的风格偏好,但两者都应该工作。
  • 感谢这篇文章对我有很大帮助
【解决方案2】:

您需要在“import org.apache.spark.streaming._”之前“import kafka.serializer.StringDecoder”。导入顺序可以解决问题。

作品-

import kafka.serializer.StringDecoder
import org.apache.spark.streaming._

例外-

import org.apache.spark.streaming._
import kafka.serializer.StringDecoder

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-03
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 2017-03-01
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多