【问题标题】:Kafka Connect issue when reading from a RabbitMQ queue从 RabbitMQ 队列读取时出现 Kafka Connect 问题
【发布时间】:2019-11-28 01:19:48
【问题描述】:

我正在尝试使用具有以下配置的 Kafka 连接器从 RabbitMQ 队列将数据读入我的主题:

{
  "name" : "RabbitMQSourceConnector1",
  "config" : {
   "connector.class" : "io.confluent.connect.rabbitmq.RabbitMQSourceConnector",
   "tasks.max" : "1",
   "kafka.topic" : "rabbitmqtest3",
   "rabbitmq.queue" : "taskqueue",
    "rabbitmq.host" : "localhost",
    "rabbitmq.username" : "guest",
    "rabbitmq.password" : "guest",
    "value.converter": "org.apache.kafka.connect.json.JsonConverter",
    "value.converter.schemas.enable": "true",
    "key.converter": "org.apache.kafka.connect.json.JsonConverter",
    "key.converter.schemas.enable": "true"

  }
}

但是我在将源流转换为 JSON 格式时遇到了麻烦,因为我丢失了原始消息

原文:

{'id': 0, 'body': '010101010101010101010101010101010101010101010101010101010101010101010'}

收到:

{"schema":{"type":"bytes","optional":false},"payload":"eyJpZCI6IDEsICJib2R5IjogIjAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMCJ9"}

有人知道为什么会这样吗?

编辑:我尝试使用“value.converter”将消息转换为字符串:“org.apache.kafka.connect.storage.StringConverter”,但结果是一样的:

11/27/19 4:07:37 PM CET , 0 , [B@1583a488

EDIT2:

我现在正在接收 JSON 文件,但内容仍以 BASE64 编码

知道如何直接将其转换回 UTF8 吗?

{
 "name": "adls-gen2-sink",
 "config": {
   "connector.class":"io.confluent.connect.azure.datalake.gen2.AzureDataLakeGen2SinkConnector",
   "tasks.max":"1",
   "topics":"rabbitmqtest3",
   "flush.size":"3",
   "format.class":"io.confluent.connect.azure.storage.format.json.JsonFormat",
   "value.converter":"org.apache.kafka.connect.converters.ByteArrayConverter",
   "internal.value.converter": "org.apache.kafka.connect.converters.ByteArrayConverter",
   "topics.dir":"sw66jsoningest",
   "confluent.topic.bootstrap.servers":"localhost:9092",
   "confluent.topic.replication.factor":"1",
   "partitioner.class" : "io.confluent.connect.storage.partitioner.DefaultPartitioner"

          }
}

更新:

考虑到这个流程,我得到了解决方案:

消息 (JSON) --> RabbitMq (ByteArray) --> Kafka (ByteArray) -->ADLS (JSON)

我在 RabbitMQ 到 Kafka 连接器上使用此转换器将消息从 Base64 解码为 UTF8。

"value.converter": "org.apache.kafka.connect.converters.ByteArrayConverter"

之后我将消息视为字符串并将其保存为 JSON。

"value.converter":"org.apache.kafka.connect.storage.StringConverter",
"format.class":"io.confluent.connect.azure.storage.format.json.JsonFormat",

非常感谢!

【问题讨论】:

  • 实际上rabbitmq消息都是二进制的,所以你得到的很可能是针对payload属性的base64编码值,你应该尝试用avro消费者读取数据

标签: apache-kafka rabbitmq apache-kafka-connect confluent-platform


【解决方案1】:

如果您设置schemas.enable": "false",则不应获取架构和有效负载字段

如果您不希望发生任何翻译,请使用 ByteArrayConverter

如果您的数据只是一个纯字符串(包括 JSON),请使用 StringConverter

不清楚您如何打印结果消息,但看起来您正在打印字节数组而不是将其解码为字符串

【讨论】:

  • 你是对的,schemas.enable": "true" 是真的,对不起。你看到的输出是我从 Kafka 消费者控制台读取的主题。所需的输出格式是 JSON但由于我将 JSON 消息从 python 脚本发送到 rabbitMQ ,然后我使用连接器将消息导入到 Kafka 主题,最后我使用另一个 Kafka 连接连接器将结果写入 ADLS Gen2 容器......当我看看到 ADLS 中的最终 JSON 文件,我得到了用 Base64 编码的那些字符。不确定我是否解释得很好。
  • JSON 只是一个字符串,所以每个连接器应该只在每个片段上使用 StringConverter
  • 我同意这一点,问题是rabbitMQ 消息被转换为二进制,正如@Soumen Mukherjee 之前评论的那样。所以它认为这是我遵循的消息的流程,如果我错了,请纠正我:原始消息 (JSON) --> RabbitMq (ByteArray) --> Kafka (ByteArray) -->ADLS (JSON)
  • 所以基本上现在我正在接收 JSON 格式的消息,但内容仍以 Base64 编码,使其无法使用。任何想法? “format.class”:“io.confluent.connect.azure.storage.format.json.JsonFormat”,“value.converter”:“org.apache.kafka.connect.converters.ByteArrayConverter”,“connector.class”: “io.confluent.connect.azure.datalake.gen2.AzureDataLakeGen2SinkConnector”,
  • 我没有使用 Azure 存储。也许它需要特定格式的数据。例如,使用 ByteArrayConverter 然后 JsonFormat 会将字节放入 JSON 字符串,这可以解释为什么您会看到 [B@1583a488。在写入 JSON 之前,必须使用 StringConverter 将数据反序列化为字符串
猜你喜欢
  • 1970-01-01
  • 2011-10-05
  • 2022-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-31
  • 2018-12-22
  • 1970-01-01
相关资源
最近更新 更多