Flink流计算与时序数据库Influxdb+grafana

1、简介

关于Influxdb和grafana,可以参考:介绍或者influxdb官方文档,grafana官方文档。这里默认已经将influxdb和grafana安装完成。

influxdb不属于Flink内置的第三方connector,因此需要自定义addSink()方法:

txStream.addSink(new InfluxDBSink("transaction"))

而InfluxDBSink需要实现SinkFunction或RichSinkFunction,例如:

class InfluxDBSink(measurement : String) extends RichSinkFunction[TX]{

  private val dataBaseName = "influxDemo"
  var influxDB : InfluxDB = null

  override def open(parameters : Configuration) : Unit = {
    super.open(parameters)
    influxDB = InfluxDBFactory.connect("http://data1:8086", "admin", "admin")
    influxDB.createDatabase(dataBaseName)
    influxDB.enableBatch(2000, 100, TimeUnit.MILLISECONDS)
  }

  override def close() : Unit = {
    super.close()
  }

  override def invoke(in: TX): Unit = {
    val builder = Point.measurement(measurement)
      .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS)
      .tag("code", in.code)
      .addField("nIndex", in.nindex)
      .addField("price", in.price)
      .addField("volume", in.volume)
      .addField("value", in.value)

    val p = builder.build()

    influxDB.write(dataBaseName,"autogen",p)
  }

说明:
influxdb中,measurement相当于一个“表”;
一个记录被当做一个point,time()方法表示一个point的时间,这也是时间序列数据库必须的字段,可以用系统时间作为插入的时间,也可以用event time作为point的时间;
field是必须的字段,即一个列;
而tag是可选的,是要被索引的字段,当需要对某个字段进行索引时,需要设置为一个tag;
“autogen”代表默认的保留策略。
写入时,可以一条写入,也可以批量写入。此例中代表逐条写入。

结果可以通过influxdb提供的webUI以及grafana实时展示:
Flink流计算与时序数据库Influxdb+grafana_第1张图片

Flink流计算与时序数据库Influxdb+grafana_第2张图片

详细的代码见:这里

参考

https://github.com/influxdata/influxdb-java
http://data-artisans.com/robust-stream-processing-flink-walkthrough/
http://data-artisans.com/why-apache-flink/
Flink流计算与时序数据库Influxdb+grafana_第3张图片
https://github.com/dataArtisans/oscon

你可能感兴趣的:(Flink)