由于无效的ZKStringSerializer引用,无法Instanciate ZkClient

时间:2016-08-05 11:34:55

标签: scala apache-kafka

我正在将Play v 2.3.4应用迁移到Play v 2.5.4。在此过程中,我还必须升级到Scala 2.11.8和kafka 9.0+以支持更新的Play版本。

我已经解决了大多数问题,但我无法通过AdminUtils来解决一些管理Kafka主题的代码的Kafka问题。麻烦都集中在kafka.utils.ZkStringSerialzier。

我正在使用org.I0Itec.zkclient包来实现在ZkUtils对象构造中传递的实例ZkClient对象,但它失败了,因为它无法解析我的ZkStringSerializer。

相关代码是:

import kafka.admin.AdminUtils
import kafka.utils.ZkUtils
import kafka.utils.ZKStringSerializer
import org.I0Itec.zkclient.{ZkClient, ZkConnection}
object Topic {
    def CreateKafkaTopic(topic: String, zookeeperHosts: String, partitionSize: Int, replicationCount: Int, connectionTimeoutMs: Int = 10000, sessionTimeoutMs: Int = 10000): Boolean = {
        var zkSerializer: ZKStringSerializer = ZKStringSerializer
        val zkClient: ZkClient= new ZkClient(zookeeperHosts, connectionTimeoutMs, sessionTimeoutMs, zkSerializer)
        val topicConfig: Properties = new Properties()
        val isSecureKafkaCluster: Boolean = false

        val zkUtils: ZkUtils = new ZkUtils(zkClient, new ZkConnection(zookeeperHosts), isSecureKafkaCluster)

        AdminUtils.createTopic(zkUtils, topic, partitionSize, replicationCount, topicConfig)
        zkClient.close()
    }
}

上面的代码导致ZKStringSerializer从他的位置无法访问的错误。

我发现了几个相关的帖子来创建主题(主要是在Java和Kafka 9.0之前) Creating a topic for Apache Kafka 0.9 Using Java How create Kafka ZKStringSerializer in Java? How Can we create a topic in Kafka from the IDE using API 最后 Creating a Kafka topic results in no leader

基于这些我按代码更新如下:

import kafka.admin.AdminUtils
import kafka.utils.ZkUtils
import kafka.utils.ZKStringSerializer$
import org.I0Itec.zkclient.{ZkClient, ZkConnection}
object Topic {
    def CreateKafkaTopic(topic: String, zookeeperHosts: String, partitionSize: Int, replicationCount: Int, connectionTimeoutMs: Int = 10000, sessionTimeoutMs: Int = 10000): Boolean = {
        var zkSerializer: ZKStringSerializer = ZKStringSerializer$.MODULE$
        val zkClient: ZkClient= new ZkClient(zookeeperHosts, connectionTimeoutMs, sessionTimeoutMs, zkSerializer)
        val topicConfig: Properties = new Properties()
        val isSecureKafkaCluster: Boolean = false

        val zkUtils: ZkUtils = new ZkUtils(zkClient, new ZkConnection(zookeeperHosts), isSecureKafkaCluster)

        AdminUtils.createTopic(zkUtils, topic, partitionSize, replicationCount, topicConfig)
        zkClient.close()
    }
}

然后我就无法解决符号ZkStringSerialzer $ errors。

我同时尝试使用org.I0Itec.zkclient.serialize.ZkSerializer对象,但它没有什么区别。

所以我的问题实际上是两个方面:  1.' $'有什么意义? scala中的Import和Declarations语句的字符。我在字符串插值(e / g / s" var值是$ var")中使用它来引用变量,但这看起来不同。  2.我的代码出了什么问题。这是我导入,声明,还有别的方式吗?

我是scala和Play的新手,但我现在感觉很白痴,所以任何建议/帮助都表示赞赏

〜戴夫

P.S。 如果它帮助项目文件中的相关位

build.sbt:

lazy val `api` = (project in file(".")).enablePlugins(PlayScala)
scalaVersion := "2.11.8"

libraryDependencies ++= Seq(
  "org.apache.kafka" % "kafka_2.11" % "0.9.0.1",
  jdbc,
  cache,
  ws,
  specs2 % Test
)

plugins.sbt:

resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/"

addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.5.4")

addSbtPlugin("com.typesafe.sbt" % "sbt-coffeescript" % "1.0.0")

addSbtPlugin("com.typesafe.sbt" % "sbt-less" % "1.0.0")

addSbtPlugin("com.typesafe.sbt" % "sbt-jshint" % "1.0.1")

addSbtPlugin("com.typesafe.sbt" % "sbt-rjs" % "1.0.1")

addSbtPlugin("com.typesafe.sbt" % "sbt-digest" % "1.0.0")

addSbtPlugin("com.typesafe.sbt" % "sbt-mocha" % "1.0.0")

build.properties:

sbt.version=0.13.5

2 个答案:

答案 0 :(得分:0)

在周末解决了这个问题后,我放弃了之前使用过的ZKClient软件包,直接使用了简单的Kafka,这实际上更加干净,试图使用I0Itech ZKClient。

新实施如下:

import java.util.Properties
import kafka.admin.AdminUtils
import kafka.utils.ZkUtils

class Topic {
  def CreateKafkaTopic(topic: String, zookeeperHosts: String, partitionSize: Int, replicationCount: Int, connectionTimeoutMs: Int = 10000, sessionTimeoutMs: Int = 10000): Boolean = {
    if (ListKafkaTopics(zookeeperHosts).contains(topic) ) {
      return false
    }
    val zkUtils = ZkUtils.apply(zookeeperHosts, sessionTimeoutMs, connectionTimeoutMs, false)
    AdminUtils.createTopic( zkUtils, topic, partitionSize, replicationCount, new Properties())
    zkUtils.close()
    true
  }
}

结束结束时删除了一个依赖项并使代码更清晰,所以我想是双赢。

〜戴夫

答案 1 :(得分:0)

此问题的原因是ZkStringSerialzer被声明为私有,只需使用ZkUtils.createZkClient即可,如下所示:

    ZkUtils.createZkClient(zookeeperHosts, sessionTimeoutMs, connectionTimeoutMs)