我正在尝试创建一个Kafka-connect连接器,以将其从AVRO Topic下沉到文件中。
然后使用kafka-connect将文件还原到另一个主题。
接收器工作正常,我可以看到接收器文件正在增长并读取了数据。但是,当我尝试还原到新主题时,新主题仍然没有数据。
并且没有错误,我已经重置偏移量,创建了一个新的kafka-connect并尝试还原,创建了一个完整的新Kafka群集,并且始终相同,源连接器上没有错误,但是主题是空的。
以下是源连接器配置的输出:
kubernetes.default.svc.cluster.local
这是源连接器状态的输出:
{
"name": "restored-exchange-rate-log",
"config": {
"connector.class": "org.apache.kafka.connect.file.FileStreamSourceConnector",
"value.converter.schema.registry.url": "http://kafka-schema:8881",
"file": "/tmp/exchange-rate-log.sink.txt",
"format.include.keys": "true",
"source.auto.offset.reset": "earliest",
"tasks.max": "1",
"value.converter.schemas.enable": "true",
"name": "restored-exchange-rate-log",
"topic": "restored-exchange-rate-log",
"value.converter": "io.confluent.connect.avro.AvroConverter",
"key.converter": "org.apache.kafka.connect.storage.StringConverter"
},
"tasks": [
{
"connector": "restored-exchange-rate-log",
"task": 0
}
],
"type": "source"
}
以下是接收器连接器配置的输出:
{
"name": "restored-exchange-rate-log",
"connector": {
"state": "RUNNING",
"worker_id": "kafka-connect:8883"
},
"tasks": [
{
"state": "RUNNING",
"id": 0,
"worker_id": "kafka-connect:8883"
}
],
"type": "source"
}
以下是接收器连接器状态的输出:
{
"name": "bkp-exchange-rate-log",
"config": {
"connector.class": "org.apache.kafka.connect.file.FileStreamSinkConnector",
"source.auto.offset.reset": "earliest",
"tasks.max": "1",
"topics": "exchange-rate-log",
"value.converter.value.subject.name.strategy": "io.confluent.kafka.serializers.subject.RecordNameStrategy",
"value.converter.schema.registry.url": "http://kafka-schema:8881",
"file": "/tmp/exchange-rate-log.sink.txt",
"format.include.keys": "true",
"value.converter.schemas.enable": "true",
"name": "bkp-exchange-rate-log",
"value.converter": "io.confluent.connect.avro.AvroConverter",
"key.converter": "org.apache.kafka.connect.storage.StringConverter"
},
"tasks": [
{
"connector": "bkp-exchange-rate-log",
"task": 0
}
],
"type": "sink"
}
接收器文件正在工作,并且始终在增长,但是主题restore-exchange-rate-log完全为空。
添加更多详细信息。
我现在尝试使用“ Zalando”方式,但是我们不使用s3,而是使用FileStream连接器。
水槽在这里:
{
"name": "bkp-exchange-rate-log",
"connector": {
"state": "RUNNING",
"worker_id": "kafka-connect:8883"
},
"tasks": [
{
"state": "RUNNING",
"id": 0,
"worker_id": "kafka-connect:8883"
}
],
"type": "sink"
}
这里是来源:
{
"connector.class": "org.apache.kafka.connect.file.FileStreamSinkConnector",
"file": "/tmp/exchange-rate-log.bin",
"format.include.keys": "true",
"tasks.max": "1",
"topics": "exchange-rate-log",
"format": "binary",
"value.converter": "com.spredfast.kafka.connect.s3.AlreadyBytesConverter",
"key.converter": "com.spredfast.kafka.connect.s3.AlreadyBytesConverter",
"name": "bkp-exchange-rate-log"
}
接收器连接器看起来不错,接收器生成了这个文件/tmp/exchange-rate-log.bin并且正在增加,但是源(恢复)出现错误:
{
"connector.class": "org.apache.kafka.connect.file.FileStreamSourceConnector",
"file": "/tmp/exchange-rate-log.bin",
"format.include.keys": "true",
"tasks.max": "1",
"format": "binary",
"topic": "bin-test-exchange-rate-log",
"value.converter": "com.spredfast.kafka.connect.s3.AlreadyBytesConverter",
"key.converter": "com.spredfast.kafka.connect.s3.AlreadyBytesConverter",
"name": "restore-exchange-rate-log"
}
答案 0 :(得分:0)
我不能完全确定Connect File连接器是否是一个很好的用例。
此外,Avro转换器不会以可复制的格式转储文件。看起来像Struct{field=value}
如果您真的想转储到文件,只需执行kafka-avro-console-consumer
,包括密钥,将--key-deserializer
作为字符串1,然后使用> file.txt
要恢复,您可以尝试使用Avro控制台生产者,但是没有字符串序列化程序属性,因此密钥需要加引号,我相信应该传递给JSON解析器
您可以像这样测试
echo '"1"|{"data":value"}' > kafka-avro-console-producer...
(还需要设置key.separator
属性)
做一个文件看起来像
kafka-avro-console-producer... < file.txt
要使其在整个Kafka群集都消失的情况下仍然有效,并且只剩下此文件,那么您还需要对Avro模式进行备份(因为注册表{{1} }主题消失了)
答案 1 :(得分:0)
我能够使用kafka-avro-console-consumer生成主题的“转储”。我们正在使用SSL +架构注册表。
以下是能够生成主题转储的命令行:
tpc=exchange-rate-log
SCHEMA_REGISTRY_OPTS="-Djavax.net.ssl.keyStore=. -Djavax.net.ssl.trustStore=. -Djavax.net.ssl.keyStorePassword=. -Djavax.net.ssl.trustStorePassword=." \
kafka-avro-console-consumer \
--from-beginning --bootstrap-server $CONNECT_BOOTSTRAP_SERVERS \
--property schema.registry.url=$CONNECT_SCHEMA_REGISTRY_URL \
--topic $tpc --consumer-property security.protocol=SSL \
--consumer-property ssl.truststore.location=/etc/ssl/kafkaproducer.truststore.jks \
--consumer-property ssl.truststore.password=$MYPASS \
--consumer-property ssl.keystore.location=/etc/ssl/kafkaproducer.keystore.jks \
--consumer-property ssl.keystore.password=$MYPASS \
--consumer-property ssl.key.password=$MYPASS \
--property "key.separator=::-::" \
--property "schema.id.separator=::_::" \
--property print.schema.ids=true \
--timeout-ms 15000 \
--property "print.key=true" \
--key-deserializer "org.apache.kafka.common.serialization.StringDeserializer" > $tpc.dump
但是我没有找到使用kafka-avro-console-producer导入回去的方法,因为它不适用于非Avro键。 有了这个转储文件,我可以编写一个读取该文件并将其恢复回原状的python生产器。