Kafka连接转换。解析输入字符串并获取记录键

时间:2018-02-06 14:54:25

标签: json apache-kafka apache-kafka-connect

我使用简单的文件源阅读器

connector.class=org.apache.kafka.connect.file.FileStreamSourceConnector
tasks.max=1

文件内容是每行中的一个简单JSON对象。我发现有一种方法可以替换记录键并使用转换来完成此操作,例如

# Add the `id` field as the key using Simple Message Transformations
transforms=InsertKey

# `ValueToKey`: push an object of one of the column fields (`id`) into the key
transforms.InsertKey.type=org.apache.kafka.connect.transforms.ValueToKey
transforms.InsertKey.fields=ip

但我收到了错误

  

[从字段到键复制字段]仅支持Struct对象,   发现:java.lang.String

有没有办法解析字符串json并从那里获取密钥,就像我可以使用Flume和regex_extractor一样?

2 个答案:

答案 0 :(得分:1)

在SourceConnector上使用转换时,转换是在List<SourceRecord>返回的SourceConnector.poll()上完成的

在您的情况下,FileStreamSourceConnector读取文件的各行,并将每一行作为字符串放入SourceRecord对象中。因此,当转换获取SourceRecord时,它仅将其视为字符串,而不知道对象的结构。

要解决此问题,

  1. 您可以修改FileStreamSourceConnector代码,以使其返回SourceRecord以及输入的json字符串的有效StructSchema。您可以为此使用Kafka的SchemaBuilder类。
  2. 或者如果您在接收器连接器中使用此数据,则可以通过在接收器连接器上设置以下配置,然后在接收器连接器上进行转换,使KafkaConnect将其转换为JSON。
  

“ value.converter”:“ org.apache.kafka.connect.json.JsonConverter”
  “ value.converter.schemas.enable”:“ false”

如果使用第二个选项,请不要忘记将这些配置放在SourceConnector上。

  

“ value.convertor”:“ org.apache.kafka.connect.storage.StringConverter”
  “ value.converter.schemas.enable”:“ false”

答案 1 :(得分:0)

  

有一种方法可以替换记录密钥

有一个名为org.apache.kafka.connect.transforms.ReplaceField$Key

的单独变换

InsertKey将获取一个值并尝试插入到Struct / Map中,但您似乎正在使用String键