Kafka sink错误“此连接器要求Kafka中的记录包含Cassandra表的键”

时间:2018-10-25 12:50:09

标签: cassandra apache-kafka apache-kafka-connect confluent

我正在尝试使用kafka将所有从SAP读取的表同步到cassandra中 这是我的卡桑德拉配置

{
    "name": "cassandra",
    "config": {
        "connector.class": "io.confluent.connect.cassandra.CassandraSinkConnector",
        "tasks.max": "5",
        "topics" :"sap_table1,sap_table2",
        "cassandra.keyspace": "sap",
        "cassandra.compression":"SNAPPY",
        "cassandra.consistency.level":"LOCAL_QUORUM",
        "cassandra.write.mode":"Update",
        "transforms":"prune", 
       "transforms.prune.type":"org.apache.kafka.connect.transforms.ReplaceField$Value",
        "transforms.prune.whitelist":"CreatedAt,Id,Text,Source,Truncated",
        "transforms.ValueToKey.fields":"ROWTIME"

    }
}

我收到此错误

Task threw an uncaught and unrecoverable exception. Task is being killed and will not recover until manually restarted. (org.apache.kafka.connect.runtime.WorkerSinkTask:584) org.apache.kafka.connect.errors.DataException: Record with a null key was encountered.  This connector requires that records from Kafka contain the keys for the Cassandra table. Please use a transformation like org.apache.kafka.connect.transforms.ValueToKey to create a key with the proper fields.

如果这是问题,那么从kafka sap connectior生成的所有表都没有键,我不知道

让我知道我是否正在做任何事情

谢谢

2 个答案:

答案 0 :(得分:0)

"ROWTIME"仅作为KSQL概念存在。它实际上不是您值中的一个字段,因此将键设置为null。

此外,ValueToKey不在transforms列表中,因此甚至没有应用。您还必须添加"transforms.ValueToKey.type"

您将不得不使用其他转换方法来将记录时间戳记设置为ConnectRecord消息键

答案 1 :(得分:0)

该错误表示您的数据未序列化,因此不是json格式或字典格式{'key':'value'}。 如果您直接从代理读取您的数据以作为故障排除方法,您会发现您的数据仅包含没有任何键的值:

使用此命令从代理读取数据:

/bin/kafka-console-consumer --bootstrap-server localhost:9092 --topic your_topic_name--from-beginning

所以解决此问题的最佳方法是添加 序列化程序到您的发布者配置文件中。 将此文件用作源连接器或发布者

name=src-view
connector.class=io.confluent.connect.jdbc.JdbcSourceConnector
tasks.max=1
topic.prefix=test-
connection.url=jdbc:postgresql://127.0.0.1:5434/test?user=testuser&password=testpass
mode=incrementing
incrementing.column.name=id
table.types=table
table.whitelist=table_name
validate.non.null=false
batch.max.rows=10000
bootstrap.servers=localhost:9092

key.converter=org.apache.kafka.connect.json.JsonConverter
key.converter.schema.registry.url=http://localhost:8081
value.converter=org.apache.kafka.connect.json.JsonConverter
value.converter.schema.registry.url=http://localhost:8081

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

以下是用于取消序列化数据的使用者(sink.conf):

name=cas-dest
connector.class=io.confluent.connect.cassandra.CassandraSinkConnector
tasks.max=1
topics=your_topic_name
cassandra.contact.points=127.0.0.1
cassandra.port=9042
cassandra.keyspace=your_keyspace_name
cassandra.write.mode=Update
cassandra.keyspace.create.enabled=true
cassandra.table.manage.enabled=true
key.converter.schema.registry.url=http://localhost:8081
value.converter.schema.registry.url=http://localhost:8081
bootstrap.servers=localhost:9092
key.converter=org.apache.kafka.connect.json.JsonConverter
key.converter.schema.registry.url=http://localhost:8081
value.converter=org.apache.kafka.connect.json.JsonConverter
value.converter.schema.registry.url=http://localhost:8081
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
transforms=createKey
transforms.createKey.fields=id,timestamp
transforms.createKey.type=org.apache.kafka.connect.transforms.ValueToKey

根据您的数据更改createKey.fields,请小心,因为它将是您的分区键,因此在选择键之前,请先阅读cassandra中的数据建模,并且它应该存在于数据键中。