我正在做一个高峰,我们想要在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\"}"}
由于
答案 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
语句中有多个列,则值将附加在一起并用逗号分隔。