我正在将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
答案 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)