配置使用Kafka Connect Cassandra Source时写入Kafka主题的内容

时间:2017-02-28 22:28:40

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

我正在做一个高峰,我们想要在Cassandra表中写入Kafka主题时发布数据。我们正在考虑使用Kafka Connect和Stream Reactor Connectors。

我正在使用Kafka 0.10.0.1

我正在使用DataMountaineer Stream Reactor 0.2.4

我将Stream Reactor的jar文件放入Kafka libs文件夹,并以分布式模式运行Kafka Connect

bin/connect-distributed.sh config/connect-distributed.properties

我添加了Cassandra Source连接器,如下所示:

curl -X POST -H "Content-Type: application/json" -d @config/connect-idoc-cassandra-source.json.txt localhost:8083/connectors

当我向Cassandra表添加数据时,我发现它使用Kafka命令行使用者添加到主题中

bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic idocs-topic --from-beginning

以下是目前正在写入主题的示例:

{
"schema": {
    "type": "struct",
    "fields": [{
        "type": "string",
        "optional": true,
        "field": "idoc_id"
    }, {
        "type": "string",
        "optional": true,
        "field": "idoc_event_ts"
    }, {
        "type": "string",
        "optional": true,
        "field": "json_doc"
    }],
    "optional": false,
    "name": "idoc.idocs_events"
},
"payload": {
    "idoc_id": "dc4ab8a0-fdf8-11e6-8285-1bce55915fdd",
    "idoc_event_ts": "dc4ab8a1-fdf8-11e6-8285-1bce55915fdd",
    "json_doc": "{\"foo\":\"bar\"}"
}}

我想写的主题是json_doc列的价值。

以下是我在Cassandra源代码配置中的内容

{
"name": "cassandra-idocs",
"config": {
    "tasks.max": "1",
    "connector.class": "com.datamountaineer.streamreactor.connect.cassandra.source.CassandraSourceConnector",
    "connect.cassandra.key.space": "idoc",
    "connect.cassandra.source.kcql": "INSERT INTO idocs-topic SELECT json_doc FROM idocs_events PK idoc_event_ts",
    "connect.cassandra.import.mode": "incremental",
    "connect.cassandra.contact.points": "localhost",
    "connect.cassandra.port": 9042,
    "connect.cassandra.import.poll.interval": 10000
}}

如何更改Kafka Connect Cassandra Source的配置方式,以便只将json_doc的值写入主题,所以它看起来像这样:

{"foo":"bar"}

Kassandra Connect Query Language似乎是要走的路,但它并不限制写入KCQL中指定列的内容。

更新

看到此answer on StackOverflow并将connect-distributed.properties文件中的转换器从JsonConverter更改为StringConverter

结果是现在写入主题:

Struct{idoc_id=74597cf0-fdf7-11e6-8285-1bce55915fdd,idoc_event_ts=74597cf1-fdf7-11e6-8285-1bce55915fdd,json_doc={"foo":"bar"}}

更新2

connect-distributed.properties文件中的转换器更改回JsonConverter。然后还禁用了模式。

key.converter.schemas.enable=false
value.converter.schemas.enable=false 

结果是现在写入主题:

{
    "idoc_id": "dc4ab8a0-fdf8-11e6-8285-1bce55915fdd",
    "idoc_event_ts": "dc4ab8a1-fdf8-11e6-8285-1bce55915fdd",
    "json_doc": "{\"foo\":\"bar\"}"
}

注意 使用快照发布中的代码并将KCQL更改为

INSERT INTO idocs-topic 
SELECT json_doc, idoc_event_ts
FROM idocs_events 
IGNORE idoc_event_ts
PK idoc_event_ts

在主题上产生此结果

{"json_doc": "{\"foo\":\"bar\"}"}

由于

1 个答案:

答案 0 :(得分:1)

在DataMountaineer Stream Reactor 0.2.4中的Cassandra Source中无法实现我试图做的事情。但是,快照发布(我假设将发布的版本为0.2.5)将支持这一点。

以下是它的工作原理:

1)将connect-distributed.properties文件中的转换器设置为StringConverter

2)将Cassandra Source连接器的JSON配置中的KCQL设置为

INSERT INTO idocs-topic 
SELECT json_doc, idoc_event_ts 
  FROM idocs_events 
IGNORE idoc_event_ts 
    PK idoc_event_ts 
WITHUNWRAP

这将导致json_doc列的值被发布到Kafka主题,而没有任何架构信息或列名称本身。

因此,如果列json_doc包含值{"foo":"bar"},那么这就是主题中显示的内容:

{"foo":"bar"}

以下是有关KCQL如何在快照发布中工作的一些背景信息。

SELECT现在只检索该表中KCQL中指定的列。最初它总是检索所有列。请务必注意,使用SELECT导入模式时,PK列必须是incremental语句的一部分。如果PK列的值不是应该包含在发布到Kafka主题的消息中的内容,则将其添加到IGNORE语句中(如上例所示)。

WITHUNWRAP是KCQL的新功能,它将告诉Cassandra Source连接器使用String SourceRecord类型(而不是Struct)创建Schema。在此模式下,只有SELECT语句中列的值将存储为SourceRecord的值。如果在应用SELECT语句后IGNORE语句中有多个列,则值将附加在一起并用逗号分隔。