如何在kafka接收器连接器中添加带有kafka消息时间戳的列

时间:2018-11-15 10:26:45

标签: apache-kafka google-bigquery apache-kafka-connect

我正在使用properties / json文件配置我的连接器,我试图添加一个包含kafka时间戳的时间戳列,当它从源连接器读取消息时没有成功。

我尝试添加transforms,但是它始终为null,并且我的接收器连接器“大查询”会向我返回错误

  

无法更新表架构

我确实将这些配置放在了bigquery连接器属性中

transforms=InsertField
transforms.InsertField.timestamp.field=fieldtime
transforms.InsertField.type=org.apache.kafka.connect.transforms.InsertField$Value

我的源Config Sap连接器

{
    "name": "sap",
    "config": {
        "connector.class": "com.sap.kafka.connect.source.hana.HANASourceConnector",
        "tasks.max": "10",
        "topics": "mytopic",
        "connection.url": "jdbc:sap://IP:30015/",
        "connection.user": "user",
        "connection.password": "pass",
        "group.id":"589f5ff5-1c43-46f4-bdd3-66884d61m185",
        "mytopic.table.name":                          "\"schema\".\"mytable\""  
       }
}

我的接收器连接器BigQuery

name=bigconnect
connector.class=com.wepay.kafka.connect.bigquery.BigQuerySinkConnector
tasks.max=1

sanitizeTopics=true

autoCreateTables=true
autoUpdateSchemas=true

schemaRetriever=com.wepay.kafka.connect.bigquery.schemaregistry.schemaretriever.SchemaRegistrySchemaRetriever
schemaRegistryLocation=http://localhost:8081

bufferSize=100000
maxWriteSize=10000
tableWriteWait=1000

project=kafka-test-217517
topics=mytopic
datasets=.*=sap_dataset
keyfile=/opt/bgaccess.json
transforms=InsertField
transforms.InsertField.timestamp.field=fieldtime    
transforms.InsertField.type=org.apache.kafka.connect.transforms.InsertField$Value

2 个答案:

答案 0 :(得分:0)

我想您的错误是来自BigQuery,而不是Kafka Connect。

例如,以独立模式启动Connect Console使用者,您将看到类似

的消息

Struct{...,fieldtime=Fri Nov 16 07:38:19 UTC 2018}


经过connect-standalone ./connect-standalone.properties ./connect-console-sink.properties

的测试

我有一个有关Avro数据的输入主题...相应地更新您自己的设置

connect-standalone.properties

bootstrap.servers=kafka:9092

key.converter=io.confluent.connect.avro.AvroConverter
key.converter.schema.registry.url=http://schema-registry:8081
key.converter.schemas.enable=true

value.converter=io.confluent.connect.avro.AvroConverter
value.converter.schema.registry.url=http://schema-registry:8081
value.converter.schemas.enable=true

offset.storage.file.filename=/tmp/connect.offsets
offset.flush.interval.ms=10000

plugin.path=/usr/share/java

connect-console-sink.properties

name=local-console-sink
connector.class=org.apache.kafka.connect.file.FileStreamSinkConnector
tasks.max=1
topics=input-topic

transforms=InsertField
transforms.InsertField.timestamp.field=fieldtime
transforms.InsertField.type=org.apache.kafka.connect.transforms.InsertField$Value

答案 1 :(得分:0)

旧答案 我想我已经了解了背后的问题

首先,您不能在任何源连接器中使用转换InsertField,因为msg的时间戳值是在写入主题时分配的,因此它不是连接器已经知道的东西,
对于JDBC连接器,有此票证 https://github.com/confluentinc/kafka-connect-jdbc/issues/311

并且sap源连接器无法正常工作。

第二个BigQuery连接器存在一个错误,该错误不允许使用InsertField向此处提到的每个表添加时间戳记

https://github.com/wepay/kafka-connect-bigquery/issues/125#issuecomment-439102994

因此,如果要使用bigquery作为输出,则当前唯一的解决方案是在加载cink连接器之前手动编辑每个表的架构以添加列

更新2018-12-03 始终在SINK连接器中添加消息时间戳的最终解决方案。假设您要将时间戳添加到接收器连接器的每个表中

在您的源连接器中放置此配置

"transforms":"InsertField"
"transforms.InsertField.timestamp.field":"fieldtime", 
"transforms.InsertField.type":"org.apache.kafka.connect.transforms.InsertField$Value"

这将为每个源表添加一个名为“ fieldtime”的列名

在您的 SINK连接器中放置这些配置

"transforms":"InsertField,DropField",
"transforms.DropField.type":"org.apache.kafka.connect.transforms.ReplaceField$Value",
"transforms.DropField.blacklist":"fieldtime",
"transforms.InsertSource.timestamp.field":"kafka_timestamp",
"transforms.InsertField.timestamp.field":"fieldtime",
"transforms.InsertField.type":"org.apache.kafka.connect.transforms.InsertField$Value"

这实际上将删除列的字段时间,并再次加上消息的时间戳

此解决方案将自动添加具有正确值的列,而无需任何添加操作