通过自定义Flink的Sink类,实现将数据写入vm时序数据库。
Flink代码
主函数入口
package example;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import java.util.ArrayList;
import java.util.List;
/**
* @author admin
* <p>
* using flink,write to vm use influxdb protocol
*/
public class Write2VMByFlink {
public static List<String> dataSource() {
List<String> list = new ArrayList();
for (int i = 1; i < 10; i++) {
list.add("" + i);
}
return list;
}
public static void main(String[] args) throws Exception {
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStream<String> dataStreamSource = env.fromCollection(dataSource());
dataStreamSource.addSink(new VmSink()).name("vmSink");
env.execute();
}
}
Sink类
package example;
import com.influxdb.client.InfluxDBClient;
import com.influxdb.client.InfluxDBClientFactory;
import com.influxdb.client.WriteApi;
import com.influxdb.client.domain.WritePrecision;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.functions.sink.RichSinkFunction;
import com.influxdb.client.write.Point;
import java.time.Instant;
/**
* @author admin
*/
public class VmSink extends RichSinkFunction<String> {
private String bucket = "flink";
private String org = "galaxy";
private WriteApi writeApi;
@Override
public void open(Configuration parameters) throws Exception {
if(null==writeApi){
InfluxDBClient client = InfluxDBClientFactory.create("http://localhost:8428");
writeApi = client.getWriteApi();
}
}
@Override
public void invoke(String value,Context context) throws Exception{
Point point = Point
.measurement("sun")
.addTag("writeWay", "flinkSink")
.addField("percent"+value, Integer.parseInt(value)*2)
.time(Instant.now(), WritePrecision.MS);
writeApi.writePoint(bucket, org, point);
}
@Override
public void close() throws Exception {
if(null==writeApi){
InfluxDBClient client = InfluxDBClientFactory.create("http://localhost:8428");
writeApi = client.getWriteApi();
}
writeApi.flush();
}
}
注意点:
需要flush才真正将数据写入vm,本示范例子只是一个初步的尝试。
maven依赖
<flink.version>1.14.0</flink.version>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-java</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java_2.11</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-clients_2.11</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>com.influxdb</groupId>
<artifactId>influxdb-client-java</artifactId>
<version>2.0.0</version>
</dependency>
Grafana页面
创建变量,sun为metric,percent1为字段,writeWay为tag字段,在代码中的值为flinkSink。
在页面即可选择“写入方式”