首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kafka乱码--汉字在debezium中变成乱码

Kafka乱码--汉字在debezium中变成乱码
EN

Stack Overflow用户
提问于 2018-10-16 22:26:55
回答 1查看 297关注 0票数 0

我用debezium得到了混乱的代码:

代码语言:javascript
复制
"doulist_name": "2013 豆瓣电影��碑榜】" 

mysql数据库中有中文单词,我用debezium把数据发送给kafka。我发现在消费消息时,中文字变成了乱码,我该如何解决这个问题呢?有什么我可以使用的配置吗?

当我使用flume和kafka生成器生成中文单词时,它工作得很好。

配置的一部分:

代码语言:javascript
复制
key.converter=org.apache.kafka.connect.json.JsonConverter
value.converter=org.apache.kafka.connect.json.JsonConverter
key.converter.schemas.enable=true
value.converter.schemas.enable=true
internal.key.converter=org.apache.kafka.connect.json.JsonConverter
internal.value.converter=org.apache.kafka.connect.json.JsonConverter
internal.key.converter.schemas.enable=false
internal.value.converter.schemas.enable=false

connector.class=io.debezium.connector.mysql.MySqlConnector
database.server.id=18405
database.server.name=mysqlfullfillment
database.whitelist=test
database.history.kafka.bootstrap.servers=192.168.0.100:9092
database.history.kafka.topic=dbhistory.fullfillment-local
include.schema.changes=true
transforms=unwrap
transforms.unwrap.type=io.debezium.transforms.UnwrapFromEnvelope

mysql字符集: utf8 mysql config picture

版本: debezium v0.7.5,kafka v1.1.1

添加:

当我用控制台./kafka-console-consumer.sh --zookeeper 192.168.0.100:2181 --topic mysqlfullfillment.test.doulist测试它时,我得到了混乱的代码

代码语言:javascript
复制
"doulist_name": "2013 豆瓣电影��碑榜】"

在我的spark代码中,我得到了同样混乱的代码:

代码语言:javascript
复制
  def main(args: Array[String]) {
    val spark = SparkSession
      .builder()
      .master("local")
      .appName("KafkaWordCount")
      .config("spark.streaming.stopGracefullyOnShutdown", "true")
      .getOrCreate()
    simpleTestCode(spark)
  }

  def simpleTestCode(spark: SparkSession): Unit = {
    val kafkaParams = Map[String, Object](
      "bootstrap.servers" -> "localhost:9092",
      "key.deserializer" -> classOf[StringDeserializer],
      "value.deserializer" -> classOf[StringDeserializer],
      "group.id" -> "KafkaWordCountgroup",
      "auto.offset.reset" -> "latest",
      "enable.auto.commit" -> (true: java.lang.Boolean)
    )
    val topics = Array("mysqlfullfillment.test.doulist")
    val ssc = new StreamingContext(spark.sparkContext, Seconds(2))

    ssc.checkpoint("/home/feng/software/code/bigdata/spark-warehouse")
    val stream = KafkaUtils.createDirectStream[String, String](
      ssc,
      PreferBrokers,
      Subscribe[String, String](topics, kafkaParams)
    )

    stream.map(mapFunc = record => (record.key, record.value)).foreachRDD(
      r => r.collect().foreach(t => print("message:" + t)))

    ssc.start()
    ssc.awaitTermination()
  }
EN

回答 1

Stack Overflow用户

发布于 2018-10-27 19:55:32

我解决了这个问题。

当我在debezium中使用JsonConverter时:

代码语言:javascript
复制
key.converter=org.apache.kafka.connect.json.JsonConverter
value.converter=org.apache.kafka.connect.json.JsonConverter

它将使用JsonSerializer来序列化数据,所以我必须在kafka中使用JsonDeserializer

代码语言:javascript
复制
val kafkaParams = Map[String, Object](
      "bootstrap.servers" -> CommonUtil.getKafkaServers,
      "key.deserializer" -> classOf[JsonDeserializer],
      "value.deserializer" -> classOf[JsonDeserializer],
      "group.id" -> groupId,
      "auto.offset.reset" -> "latest",
      "enable.auto.commit" -> (false: java.lang.Boolean)
    )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52837776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档