【时间】2022.04.29 周五
【题目】【Flink入门(3)】Flink的流处理API
本专栏是尚硅谷Flink课程的笔记与思维导图。
目录
引言
flink流处理API主要分为4部分:Environment环境、Source数据源、Transform转换、Sink输出。
一、Environment环境
二、Source数据源
自定义Source例子
package com.atguigu.apitest.source;
import com.atguigu.apitest.beans.SensorReading;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.source.SourceFunction;
import java.util.HashMap;
import java.util.Random;
public class SourceTest4_UDF {
public static void main(String[] args) throws Exception{
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(1);
// 从文件读取数据
DataStream<SensorReading> dataStream = env.addSource( new MySensorSource() );
// 打印输出
dataStream.print();
env.execute();
}
// 实现自定义的SourceFunction
public static class MySensorSource implements SourceFunction<SensorReading>{
// 定义一个标识位,用来控制数据的产生
private boolean running = true;
// 定义一个随机数发生器
Random random = new Random();
//传感器数据map
private HashMap<String, Double> sensorTempMap = new HashMap<>();
{
// 设置10个传感器的初始温度
for(int i = 0; i <10; i++ ){
sensorTempMap.put("sensor_" + (i+1), 60 + random.nextGaussian() * 20);
}
}
@Override
public void run(SourceContext<SensorReading> ctx) throws Exception {
while (running){
for( String sensorId: sensorTempMap.keySet() ){
// 在当前温度基础上随机波动
Double newtemp = sensorTempMap.get(sensorId) + random.nextGaussian();
sensorTempMap.put(sensorId, newtemp);
ctx.collect(new SensorReading(sensorId, System.currentTimeMillis(), newtemp));
}
// 控制输出频率
Thread.sleep(10000L);
}
}
@Override
public void cancel() {
running = false;
}
}}