数据接入的流程大致为:通过NiFi将数据传入kafka,再通过confluent的connector将数据从kafka传入influxdb。
由于NiFi传输数据很快,对于一些数据所产生的时间戳会出现相同的情况,类似如下:
time waveValue
---- ---------
2019-04-22T13:59:28.934Z 0.6229748725891113
2019-04-22T13:59:28.934Z 0.5437749028205872
2019-04-22T13:59:28.934Z 0.21141430735588074
2019-04-22T13:59:28.934Z 0.11528569459915161
在InfluxDB中,主键是由time和tag组成的。在这里我没有tag,因此如果time相同,后面的记录将会覆盖前面的,因此实际传到InfluxDB的数据只有一条:
time waveValue
---- ---------
2019-04-22T13:59:28.934Z 0.11528569459915161
一开始我以为将时间精度提高到ns级别,应该就能解决这个问题。
由于我用的connector是confluent自带的Kafka Connect InfluxDB ,因此我去翻了下confluent的influxDB sink文档,还真的找到了设置时间精度的选项。因此,我的InfluxDBSinkConnector的配置为:
name=InfluxDBSinkConnector
connector.class=io.confluent.influxdb.InfluxDBSinkConnector
topics=test
tasks.max=1
influxdb.url=myurl
influxdb.timeunit=NANOSECONDS
但是NiFi的传输速度实在太快,数据还是存在时间戳相同的情况:
time waveValue
---- ---------
2019-04-22T14:06:05.833993334Z 0.3754749000072479
2019-04-22T14:06:05.833993334Z 0.5437749028205872
2019-04-22T14:06:05.833993334Z 0.7219749093055725
因此现在只能考虑如何传入tag。但是confluent自带的InfluxDBSinkConnector功能太差劲,不能传入tag。因此找了半天,鬼使神差,找到了另外一个很强大的Influx Sink,完美的解决了问题。
在 Confluent安装这个connector,步骤就是直接将压缩包放到plugin.path下面,解压,然后重启Confluent。plugin.path在下面几个文件中都有出现,最好设置成相同的值:
#单机版
/path/to/confluent-5.1.0/etc/schema-registry/connect-avro-standalone.properties
/path/to/confluent-5.1.0/etc/kafka/connect-standalone.properties
#集群版
/path/to/confluent-5.1.0/etc/schema-registry/connect-avro-distributed.properties
/path/to/confluent-5.1.0/etc/kafka/connect-distributed.properties
plugin.path的值默认为share/java,那么就将下载的压缩包放到/path/to/confluent-5.1.0/share/java,解压,然后重启Confluent就安装完成了。
于是,我现在connector的配置为:
name=InfluxSinkConnector
connector.class=com.datamountaineer.streamreactor.connect.influx.InfluxSinkConnector
connect.influx.url=http://myurl
connect.influx.db=test
topics=test
tasks.max=1
connect.influx.kcql=INSERT INTO emwave SELECT * FROM emwave WITHTIMESTAMP sys_time() WITHTAG (tagnum)
在源数据那里加多一项tagnum数据,并且值进行递增取余。
在NiFi中这个递增的方法为:增加一个UpdateAttribute processor,然后设置如下图:
最终传到InfluxDB的数据如下:
time waveValue tagnum
---- --------- ------
2019-04-22T14:45:51.297156875Z 0.3033857047557831 1
2019-04-22T14:45:51.297156875Z 0.5409857034683228 2
2019-04-22T14:45:51.297156875Z 0.4122856855392456 3
问题解决。