从kafka传入influxdb的数据时间戳相同,导致数据缺失问题的解决

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Waves___/article/details/89474291

数据接入的流程大致为:通过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

问题解决。

猜你喜欢

转载自blog.csdn.net/Waves___/article/details/89474291
今日推荐