Kafka-connect FileStreamSourceConnector没有产生主题

时间:2019-02-08 15:00:41

标签: apache-kafka apache-kafka-connect

我正在尝试创建一个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"
}

2 个答案:

答案 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生产器。