zoukankan      html  css  js  c++  java
  • flink个人基础笔记

    flink代码开发基础随记

    1.常用设置

    设置共享组:slotsharingGroup(“a”)

    关闭合并任务链操作,每个任务独享solt:env.disableOperatorChaining()

    设置并行度:    env.setParallelism(1)

    Flatmap用法:

    FlatMap(List(1,2,3))(i=List(i,i)) = List(1,1,2,2,3,3)

    List(“a”,”b”,”c d”).flatMap(line=>line.split(“ “))=List(a,b,c,d)

    2.Flink算子:

    简单流算子;map() ,flatmap(),Filter()

    键控流算子:keyBy(),reduce()

    滚动流算子:sum(),min(),max(),minBy(),maxBy()

    多流转换算子:split(),select(),connect(),coMap(),union()

    3.flink支持数据类型:java和scala中所有的数据类型都支持

    4.Flink窗口(window):

    滚动窗口(tumbling window)

    滚动时间窗口:.timeWindow(time.Seconds(15))

    滑动窗口(sliding window)

    滑动时间窗口: .timeWindow(Time.Seconds(15),Time.Second(3))

    会话窗口(session window)

    会话窗口:.window(EventTimeSessionWindows.withGap(Time.minutes(10))

    全局窗口(global window)

    滚动计数窗口:(tmbling count window .countWindow(5)

    滑动计数窗口:(sliding count window) .countWindow(10,2)

    增量聚合函数:ReduceFunction,AggregateFunctions

    全窗口函数:ProcessWindowFunction

    其他api

    .trigger()  触发器  //定义window什么时候关闭,触发计算并输出结构

    .evictor() 移除器  //定义移除某些数据的逻辑

    .allowedLateness() 允许迟到的数据

    .sideOutputLateData()  将迟到的数据放入侧输出流

    .getSideOutput  获取侧输出流

    5.时间(Time)语义

    Event Time:事件创建的时间

    Ingestion Time :数据进入Flink的时间

    Processing Time :执行操作算子的本地系统时间,与机器相关

    代码:

    Env.setStreamTimeCharacteristic(TimeCharacteristic.EvenTime)

    6.Flink中的状态:

    6.1算子状态:(Operatiior)

      列表状态(List state:将状态表示为一组数据的列表

      联合列表状态(Union list state:将状态表示为数据的列表,它与常规列表状态的去表在于,再发生故障时,或者从保存点(savepoint)启动应用程序时如何恢复

      广播状态(Broadcast state):如果一个算子有多项任务,而他的每项任务状态又都相同,那么这种特殊情况最适合广播状态

    6.2键控状态:(Keyed State)

      值状态(Value state):将状态表示为单个的值

      列表状态(List state):将状态表示为一组数据的列表

      映射状态(Map state):将状态表示一组key-Value对

      聚合状态(Reducing state & Aggregating State):将状态表示为一个用于聚合操作的列表

     6.2.1键控状态的使用

       声明一个键控状态

       Lazy val lastTemp:ValueState[Double] = getRuntimeContext.getState[Double](

         New ValueStateDescriptor[Double](“lastTemp”,classof[Double])

    )

    读取状态: val preTemp = lastTemp.v

    alue()

    对状态赋值:lastTemp.update(value.temperature)

    6.3状态后端 :(State Backends)

    7.Process Function

     简单转换算子无法完成的功能,processfunction都可以完成,Flink SQL就是使用 ProcessFunction实现 的

     ProcessFunction

     KeyedProcessFunction

     CoProcessFunction

     ProcessJoinFunction

     BroadcastProcessFunction

     KeyedBroadcaseProcessFunction

     ProcessWindowFunciton

    8.状态后端:

    8.1MemoryStateBackend

    内存级的状态后端,会将键控状态作为内存中的对象进行管理,将Checkpoint存储在TaskManager的JVM堆上,而将JobManager的内存中

    特点:快速、低延迟、但不稳定

    8.2FsStateBackend

       checkpoint存到远程的持久化文件系统(FileSystem)上,而对于本地状态,跟MemoryStateBackend一样,也会存在Task Manager的JVM堆上

    特点:同时拥有内存级的本地访问速度,和更好的容错保证

    8.3RocksDBStateBackend

       将所有状态序列化后,存入本地的RocksDB中存储。

    Flink不直接提供,需要引入包flink-statebackend-rocksdb_2.12

    9.容错机制:

    9.1 一致性检查点(checkpoint)

    Flink故障恢复机制的核心,就是应用状态的一致性检查点

    有状态流应用的一致检查点,其实就是所有任务的状态,在某个时间点的一份拷贝(一份快照)‘这个时间点,应该是所有任务都恰到好处理完一个相同的出入数据的时候

    9.2 从检查点恢复状态

    9.3 flink检查点算法

      一种简单的想法——暂停应用,保存状态到检查点,再重新恢复应用

      Flink的改进实现——基于Chandy-Lamport算法的分布式快照,将检查点的保存和数据处理分离开,不暂停整个应用

    9.4 保存点

    env.enableCheckpointing(1000L)   //开启检查点,默认是关闭的,各个checkpoint是并行的
    env.getCheckpointConfig.setCheckpointingMode(CheckpointingMode.AT_LEAST_ONCE)
    env.getCheckpointConfig.setCheckpointTimeout(60000L)  //设置超时时间
    env.getCheckpointConfig.setMaxConcurrentCheckpoints(2) //最多允许几个checkpoint
    env.getCheckpointConfig.setMinPauseBetweenCheckpoints(500) //两个checkpoint之间最小间隔时间

    9.5重启策略

    env.setRestartStrategy(RestartStrategies.fixedDelayRestart(3,10000L))  //设置重启3,每次时间间隔为10
    env.setRestartStrategy(RestartStrategies.failureRateRestart(3,Time.of(5,TimeUnit.MINUTES),Time.of(10,TimeUnit.SECONDS))) //最多重启3次,每次故障重启时间间隔为5分钟,尝试重启之间延迟为10

    10.保存点

    使用算法与检查点完全相同,但是flink不会自动创建保存点,因此用户(或者外部调度程序)必须明确地触发创建操作。

    保存点是一个强大的功能。除了故障恢复外,保存点可以用于:有计划的手动备份,更新应用程序,版本迁移,暂停和重启应用,等等。

    使用时,最好添加对应的uid

    11.状态一致性

    AT-MOST-ONCE (最多一次)

    当任务故障时,最简单的做法是什么都不干,即不恢复丢失状态,也不重播丢失的数据,At-most-once语义的含义是最多处理一次事件

    AT-LAST-ONCE(至少一次)

    在大多数的真是应用场景,我们希望不丢失事件。这种类型的保障称为at-least-once,意思是所有的事件都得到了处理,而一些事情还可能被处理多次。

    EXACTLY-ONCE(精确一次)

    恰好处理一次最严格的保证,也是最难实现的。恰好处理一次语义不仅仅意味着没有事件丢失,还意味针对每一个数据,内部状态仅仅更新一次

    一致性检查点(Checkpoints)

    Flink使用了一种轻量级快照机制-检查点(checkpoint)来保证exactly=once语义

    有状态流应用的一致检查点,其实就是:所有任务的状态,在某个时间点的一份拷贝(一份快照)。而这个时间点,应该是所有任务都恰号处理完一个相同的输入数据时候

    端到端exactly-once

    内部保证——checkpoint
    source端——可重设数据的读取位置

    Sink端——从故障恢复时,数据不会重复写入外部系统

    幂等写入(idempotent Writes)

    一个操作可以重复执行很多次,但只导致一次结果更改,也就是说,后面再重复执行就不起作用(ex)(n)=ex

    事务写入(预写日志GenericWriteAheadSink,两阶段提交TwoPhaseCommitSinkFunction )

    具有原子性:一个事务中的一系列操作要么全部成功,要不一个都不做

    author@nohert
  • 相关阅读:
    spring
    Hibernate中一级缓存和二级缓存使用详解
    myeclipse 配置weblogic
    小程序animation动画效果综合应用案例(交流QQ群:604788754)
    PHP:第二章——PHP中的equire与incude语句
    PHP:第二章——PHP中的break一continue一return语句
    PHP:第二章——PHP中的for语句
    PHP:第二章——PHP中的while语句
    PHP:第二章——PHP中的流程控制语句
    小程序animation动画效果(小程序组件案例)
  • 原文地址:https://www.cnblogs.com/gzgBlog/p/14928141.html
Copyright © 2011-2022 走看看