我可以编写自定义kafka连接转换来将JSON转换为AVRO吗?

时间:2017-09-05 07:25:42

标签: apache-kafka apache-kafka-connect

我想使用kafka-connect-hdfs将无模式json记录从kafka写入hdfs文件。 如果我使用JsonConvertor作为键/值转换器,那么它不起作用。但是,如果我使用StringConvertor,那么它将json写为转义字符串。

例如:

实际的json -

{"name":"test"}

写入hdfs文件的数据 -

"{\"name\":\"test\"}"

预期输出到hdfs文件 -

{"name":"test"}

有没有办法或替代方法我可以实现这一点,或者我只能在架构中使用它?

以下是我尝试使用JSONConvertor时遇到的异常:

[2017-09-06 14:40:19,344] ERROR Task hdfs-sink-0 threw an uncaught and unrecoverable exception (org.apache.kafka.connect.runtime.WorkerTask:148)
org.apache.kafka.connect.errors.DataException: JsonConverter with schemas.enable requires "schema" and "payload" fields and may not contain additional fields. If you are trying to deserialize plain JSON data, set schemas.enable=false in your converter configuration.
    at org.apache.kafka.connect.json.JsonConverter.toConnectData(JsonConverter.java:308)
    at org.apache.kafka.connect.runtime.WorkerSinkTask.convertMessages(WorkerSinkTask.java:406)
    at org.apache.kafka.connect.runtime.WorkerSinkTask.poll(WorkerSinkTask.java:250)
    at org.apache.kafka.connect.runtime.WorkerSinkTask.iteration(WorkerSinkTask.java:180)
    at org.apache.kafka.connect.runtime.WorkerSinkTask.execute(WorkerSinkTask.java:148)
    at org.apache.kafka.connect.runtime.WorkerTask.doRun(WorkerTask.java:146)
    at org.apache.kafka.connect.runtime.WorkerTask.run(WorkerTask.java:190)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

配置 quickstart-hdfs.properties

name=hdfs-sink
connector.class=io.confluent.connect.hdfs.HdfsSinkConnector
tasks.max=1
topics=test_hdfs_avro
hdfs.url=hdfs://localhost:9000
flush.size=1
key.converter=org.apache.kafka.connect.storage.StringConverter
value.converter=org.apache.kafka.connect.json.JsonConverter

配置 connect-avro-standalone.properties

bootstrap.servers=localhost:9092
schemas.enable=false
key.converter.schemas.enable=false
value.converter.schemas.enable=false

1 个答案:

答案 0 :(得分:1)

在连接器的配置属性中指定转换器时,您需要包含与此转换器相关的所有属性,无论这些属性是否也包含在工作器的配置中。

在上面的示例中,您需要同时指定:

value.converter=org.apache.kafka.connect.json.JsonConverter
value.converter.schemas.enable=false
quickstart-hdfs.properties 中的

仅供参考,JSON导出很快就会出现在HDFS连接器中。在此跟踪相关的提款请求:https://github.com/confluentinc/kafka-connect-hdfs/pull/196

更新:JsonFormat已合并到主分支。