env=StreamExecutionEnvironment.getExecutionEnvironment()
lineDSS=env.socketTextStream("hadoop102",9999)
env.fromCollection(java集合)
env.readTextFile("hdfs://...")
env.addSource(new FlinkKafkaConsumer<>("",new SimpleStringSchema(),prop)) prop=new Properties,prop.setProperty()
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Session:
bin/yarn-session.sh -d
bin/flink run -c 代码全类名 ./flink-prepare-1.0-SNAPSHOT.jar
Application: -t type -c class
bin/flink run-application -t yarn-application -c 代码全类名 ./flink-prepare-1.0-SNAPSHOT.jar
以后凡是用到斜体方法就要注意是不是泛型方法 不要忘记加泛型!!!!!!!!!!!
以后凡是用到匿名类,都要有大括号 才会保留泛型!!!!!!!!!
-----------------------------------------算子-------------------------------------------------------------------------------
Environment->Source->Transform->Sink
所有flink函数都有其Rich版本,可以获取运行环境的上下文,并拥有一些生命周期方法 ,open/close每个
并行度只会被调用一次、open中可调用getRuntimeContext()方法,它提供了函数的RuntimeContext函数执行的并行度,任务的名字,以及state状态.
map
flatMap
filter
keyBy:DateStream->KeyedStream
shuffle
connect: DS[A],DS[B]->ConnectedStreams[A,B] ,只能两个,数据类型可以不同
union: 两个或以上混合,数据类型要一样
滚动聚合算子:sum,min,max,minBy,maxBy KeyedStream->SingleOutputStreamOperator
reduce: KeyedStream->SingleOutputStreamOperator 返回每一次聚合结果,出入元素类型必须一致
process: key前用每个并行度有一个,并行度内数据一视同仁;key后每个key有一个
ProcessFunction
KeyedProcessFunction : keyby后使用
CoProcessFunction :connect后
ProcessJoinFunction :join后
BroadcastProcessFunction :广播变量后
KeyedBroadcastProcessFunction
ProcessWindowFunction :添加窗口后
ProcessAllWindowFunction
对流重新分区的算子:
keyBy:按key将数据分发
shuffle:元素随机分区
rebalance:将数据平均分布到每个区
rescale:不走网络比rebalance更高效
-----------------------------------------Sink--------------------------------------------------------------------------------
lineDSS.addSink(new FlinkKafkaProducer<String>("hadoop102:9092","topic_sensor",new SimpleStringSchema()))
.addSink(new RedisSink<>(redisConf,new RedisMapper<>(){...})) redisConf=new FlinkJedisPoolConfig.Builder().setHost().setPort().setMaxTotal().setTimeout().build()
(自定义) .addSink(new RichSinkFunction<>{
private PreparedStatement ps;
private Connection conn;
open(){conn,ps}
close(){conn,ps}
invoke(){ps.setxxx(),ps.execute}
})
-----------------------------------------Window--------------------------------------------------------------------------------
开窗一定要有watermark !
基于时间:
Tumbling ( time )
Sliding ( time,time )
Session ( gap ) 每到一个新元素创建一个新会话,超过gap无交互就自动关闭
基于数量:
countWindow(num) countWindow(num,num)
增量聚合函数:ReduceFunction(value1,value2),AggregateFunction(累加器)
全量聚合函数:ProcessWindowFunction 可以得到一个包含窗口内所有元素的迭代器,以及窗口的元数据信息;
reduce+proces 或 aggregate+process时,其中的迭代器就是上面聚合的结果,所有只有一个值,增量聚合可以通过这样同样获取到窗口元数据信息
windowAll 所有窗口逻辑都在一个单独的task上执行,并行度必须是1,
-----------------------------------------WaterMark--------------------------------------------------------------------------------
WatermarkStrategy.<>forMonotonousTimestamps();
WatermarkStrategy.<>forBoundedOutOfOrderness(Duration.ofSeconds(3))
.withTimestampAssigner(
事件时间