Flink四大基石_flink四大核心_今天好好洗头了嘛的博客-程序员ITS203

技术标签: flink  big data  Flink  大数据  

Checkpoint

  • 目的
    为了保证程序发生故障时状态不丢也不错,它是保证状态一致性而不是数据一致性。
  • 原理
    使用异步屏障快照Asynchronous Barrier Snapshotting(简称 ABS)算法(依赖于Chandy-Lamport算法的变种)实现分布式快照。
  • 流程
    1)JobManager周期性产生Barrier,并广播给所有Source算子。
    2)Source算子收到Barrier后,生成自己的状态快照(包含数据源对应的offset/partition等信息),然后把Barrier广播给下游所有非Source算子
    3)非Source算子收到某条上游算子的Barrier后,会阻塞此上游算子的输入流,把再Barrier之后流过来的数据先放到算子的缓冲区。等收到上游所有算子的Barrier后,此时才会进行生成自己的状态快照,然后把此算子的Barrier广播给下游所有非Source算子。(这里是Barrier对齐机制,保证数据不会被重复处理。当然,如果为了效率,也可以不进行对齐,此时数据会至少处理一次,可能导致数据被重复处理。对于数据的EXACTLY_ONCE来说,在1.11版本对于Barrier对齐机制进行了优化,因为对齐机制会导致checkpoint时间过长以及当作业出现反压时,从而加重作业的反压。此时引入了Unaligned Checkpoint机制,这个机制会导致接受到第一个Barrier时,不会阻塞此流后续数据的计算。这种方法也由坏处就是要持久化一部分缓存数据)
    4)当所有Sink算子完成checkpoint后,且向JobManager发送确认消息后,该次checkpoint完成。

State

  • 状态类型
    1)原生状态(Raw State)
    Raw State是开发者自己管理的,需要自己序列化。
    2)托管状态(Managed State)
    Managed State是由Flink管理的,Flink帮忙存储、恢复和优化。Managed State再进行细分,由两种类型:Keyed State和Operator State。
    Keyed State:一个SubTask有多个State,每一个Key对应一个State。有ValueState,ListState,MapState等
    Operator State:一个SubTask有一个State。有ListState,BroadcastState等
  • 状态后端
    Flink 内置了以下这些开箱即用的 state backends :
    ①HashMapStateBackend:状态数据以 Java 对象的形式存储在堆中。
    ②EmbeddedRocksDBStateBackend:状态数据保存在 RocksDB 数据库中,数据被以序列化字节数组的方式存储,RocksDB 数据库默认将数据存储在 TaskManager 的数据目录。
    如果不设置,默认使用 HashMapStateBackend。
    在Flink1.13版本对状态后端进行了改进,帮助用户更好理解本地状态存储和 checkpoint 存储的区分。
    1)MemoryStateBackend
    旧版本的 MemoryStateBackend 等价于使用 HashMapStateBackend 和 JobManagerCheckpointStorage。
    2)FsStateBackend
    旧版本的 FsStateBackend 等价于使用 HashMapStateBackend 和 FileSystemCheckpointStorage。
    3)RocksDBStateBackend
    旧版本的 RocksDBStateBackend 等价于使用 EmbeddedRocksDBStateBackend 和 FileSystemCheckpointStorage。使用RocksDB状态后端可以设置增量检查点,RocksDB是一个基于LSM树的KV存储。

Time

  • 时间语义
    Flink在1.12版本后默认使用Event Time
    1)处理时间(Process Time)数据进入Flink被处理的系统时间(Operator处理数据的系统时间)
    2)事件时间(Event Time)数据在数据源产生的时间,一般由事件中的时间戳描述,比如用户日志中的TimeStamp。
    3)摄取时间(Ingestion Time)数据进入Flink的时间,记录被Source节点观察到的系统时间。
  • 水位线
    flink1.11中对flink的水印生成接口进行了重构,创建watermark主要有以下三种方式
    1)使用createWatermarkGenerator 创建watermark。
    2)使用固定延时策略生成水印,调用WatermarkStrategy中的静态方法forBoundedOutOfOrderness。
    3)使用单调递增的方式生成水印,调用WatermarkStrategy中的静态方法forMonotonousTimestamps。

Window

  • 分类
    1)Keyed Windows
stream
       .keyBy(...)               <-  keyed versus non-keyed windows
       .window(...)              <-  required: "assigner"
      [.trigger(...)]            <-  optional: "trigger" (else default trigger)
      [.evictor(...)]            <-  optional: "evictor" (else no evictor)
      [.allowedLateness(...)]    <-  optional: "lateness" (else zero)
      [.sideOutputLateData(...)] <-  optional: "output tag" (else no side output for late data)
       .reduce/aggregate/apply()      <-  required: "function"
      [.getSideOutput(...)]      <-  optional: "output tag"

2)Non-Keyed Windows

stream
       .windowAll(...)           <-  required: "assigner"
      [.trigger(...)]            <-  optional: "trigger" (else default trigger)
      [.evictor(...)]            <-  optional: "evictor" (else no evictor)
      [.allowedLateness(...)]    <-  optional: "lateness" (else zero)
      [.sideOutputLateData(...)] <-  optional: "output tag" (else no side output for late data)
       .reduce/aggregate/apply()      <-  required: "function"
      [.getSideOutput(...)]      <-  optional: "output tag"
  • 生命周期
    开始:当应该属于该窗口的第一个元素到达时,就会创建一个窗口。
    结束:当时间超过其结束时间戳加上用户指定的允许延迟时,该窗口将被完全删除。
    每个窗口都有一个触发器和一个函数。函数是用于窗口内数据的计算,触发器是决定此窗口的函数多会进行计算的条件。
  • 类型
    1)Tumbling Windows(滚动窗口)
input
    .keyBy(<key selector>)
    .window(TumblingEventTimeWindows.of(Time.seconds(5)))
    .<windowed transformation>(<window function>);

2)Sliding Windows(滑动窗口)

input
    .keyBy(<key selector>)
    .window(SlidingEventTimeWindows.of(Time.seconds(10), Time.seconds(5)))
    .<windowed transformation>(<window function>);

3)Session Windows(会话窗口)

input
    .keyBy(<key selector>)
    .window(EventTimeSessionWindows.withGap(Time.minutes(10)))
    .<windowed transformation>(<window function>);

4)Global Windows(全局窗口)

input
    .keyBy(<key selector>)
    .window(GlobalWindows.create())
    .<windowed transformation>(<window function>);
  • 窗口函数
    1)增量窗口函数

①ReduceFunction

input
    .keyBy(<key selector>)
    .window(<window assigner>)
    .reduce(new ReduceFunction<Tuple2<String, Long>>() {
    
      public Tuple2<String, Long> reduce(Tuple2<String, Long> v1, Tuple2<String, Long> v2) {
    
        return new Tuple2<>(v1.f0, v1.f1 + v2.f1);
      }
    });

②AggregateFunction
可以统计窗口内数据的个数,进行求平均值等等。(局部计算,全局和并。)

/**
 * The accumulator is used to keep a running sum and a count. The {@code getResult} method
 * computes the average.
 */
private static class AverageAggregate
    implements AggregateFunction<Tuple2<String, Long>, Tuple2<Long, Long>, Double> {
    
  @Override
  public Tuple2<Long, Long> createAccumulator() {
    
    return new Tuple2<>(0L, 0L);
  }

  @Override
  public Tuple2<Long, Long> add(Tuple2<String, Long> value, Tuple2<Long, Long> accumulator) {
    
    return new Tuple2<>(accumulator.f0 + value.f1, accumulator.f1 + 1L);
  }

  @Override
  public Double getResult(Tuple2<Long, Long> accumulator) {
    
    return ((double) accumulator.f0) / accumulator.f1;
  }

  @Override
  public Tuple2<Long, Long> merge(Tuple2<Long, Long> a, Tuple2<Long, Long> b) {
    
    return new Tuple2<>(a.f0 + b.f0, a.f1 + b.f1);
  }
}

DataStream<Tuple2<String, Long>> input = ...;

input
    .keyBy(<key selector>)
    .window(<window assigner>)
    .aggregate(new AverageAggregate());

2)全量窗口函数
ProcessWindowFunction
这个函数更加灵活,但是延迟性更高,且牺牲一定存储空间。

public abstract class ProcessWindowFunction<IN, OUT, KEY, W extends Window> implements Function {
    

    /**
     * Evaluates the window and outputs none or several elements.
     *
     * @param key The key for which this window is evaluated.
     * @param context The context in which the window is being evaluated.
     * @param elements The elements in the window being evaluated.
     * @param out A collector for emitting elements.
     *
     * @throws Exception The function may throw exceptions to fail the program and trigger recovery.
     */
    public abstract void process(
            KEY key,
            Context context,
            Iterable<IN> elements,
            Collector<OUT> out) throws Exception;

   	/**
   	 * The context holding window metadata.
   	 */
   	public abstract class Context implements java.io.Serializable {
    
   	    /**
   	     * Returns the window that is being evaluated.
   	     */
   	    public abstract W window();

   	    /** Returns the current processing time. */
   	    public abstract long currentProcessingTime();

   	    /** Returns the current event-time watermark. */
   	    public abstract long currentWatermark();

   	    /**
   	     * State accessor for per-key and per-window state.
   	     *
   	     * <p><b>NOTE:</b>If you use per-window state you have to ensure that you clean it up
   	     * by implementing {@link ProcessWindowFunction#clear(Context)}.
   	     */
   	    public abstract KeyedStateStore windowState();

   	    /**
   	     * State accessor for per-key global state.
   	     */
   	    public abstract KeyedStateStore globalState();
   	}

}

3)增量和全量窗口函数混合使用
兼顾两者优点
ReduceFunction+ProcessWindowFunction

AggregateFunction+ProcessWindowFunction

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42009405/article/details/122836332

智能推荐

从键盘随机输入10个整数,然后输出最大值和最小值_从键盘上输入10个数,求其中的最大值及最小值并输出_志成student的博客-程序员ITS203

本题有两种解决方法:假设法和选择排序法1.假设法找最值#include &lt;stdio.h&gt;int main(){ int a[10], i, max, mini; for (i = 0; i &lt; 10; i++) scanf_s("%d", &amp;a[i]); max = a[0]; //首先假设a[0]为最大值 mini = a[0]; //首先假设a[0]为最小值 for (i = 1; i &lt; 10; i

微信小程序开发:关于data-key_员猿愿的博客-程序员ITS203

在wxml页面设置后台js中data中的值,可以用到data-*的方法:例子:wxml中代码:js中代码:通过event参数来获取前端data-*中的值在控制台输出:data中的值在event.target.dataset中...

sysfs接口函数的建立_DEVICE_ATTR_大吉机器人的博客-程序员ITS203_sysfs 接口

如 对设备的使用 DEVICE_ATTR ,对总线使用 BUS_ATTR ,对驱动使用 DRIVER_ATTR ,对类 别 (class) 使用 CLASS_ATTR, 这四个高级的宏来自于函数宏DEVICE_ATTR内封装的是__ATTR(_name,_mode,_show,_stroe)方法,_show表示的是读方法,_stroe表示的是写方法。如果你完成了DEVICE_ATTR函数宏的填充,下面就需要创建接口了。

执行计划不稳定的原因分析_cuiyi1934的博客-程序员ITS203

CBO主要的输入有3种:统计信息、环境变量和SQL语句。上面任何一种发生变化,执行计划都有可能发生变化。1. 统计信息的变化在10g和11g中,在默认情况下都有一个在晚上运行的后台job收集新的统计信息,如果...

SPRING BOOT+WEBMAGIC_panchen666的博客-程序员ITS203_springboot+webmagic

最近,想自己学习下hadoop,但又缺少点文本数据,所以需要爬取点数据~ 不会写py , 就直接找了个爬虫框架~ webmagic的原理图如下,很简单很好用: POM.xml <!-- mybatis start--> <dependency> <groupId>org.mybatis.spring.boot</groupId>

随便推点

uniapp+Echarts微信小程序实现中国地图_miracle_iu的博客-程序员ITS203_uniapp使用echarts地图

参考文章链接: https://www.jianshu.com/p/5537e5053dc1先在uni-app新建项目,然后在命令行管理中进入到该目录下,执行然后安装依赖将下载后的三个库从node_modules剪切到项目的根目录下。开始在项目中使用echarts。替换最新的 mpvue-echarts 组件echarts.vue 。源码地址:https://github.com/dcloudio/hello-uniapp/blob/master/components/mpvue-echarts/

github一直发邮件,如何屏蔽_一顿操作猛如虎,啥也不是!的博客-程序员ITS203_github别再发邮件

github一直发邮件,如何屏蔽我也被烦了很长一段时间!在设置里面的notification -&gt; participating/watching中把email改为web就好了。_1671465600

from用法 prepare_MySQL中prepare、execute与deallocate的用法详解_weixin_39577964的博客-程序员ITS203

prepare、execute与deallocate都是mysql中的预处理语句,本文主要介绍了MySQL中预处理语句prepare、execute与deallocate的使用教程,文中通过示例代码介绍的非常详细,对大家学习或者使用mysql具有一定的参考学习价值,需要的朋友们下面跟着小编一起来学习学习吧。相关mysql视频教程推荐:《mysql教程》前言MySQL官方将prepare、execu...

php引用 pkcs7encoder,在PHP中调用openssl_pkcs7_verify时指定输入格式类型_今天也是一只猪的博客-程序员ITS203

我有一个加密/ php问题,我希望有人可以帮助我.我的问题是我有一个签名的PKCS7块,我试图在PHP中验证.但是,当我运行以下PHP命令时:openssl_pkcs7_verify($myfile, PKCS7_BINARY | PKCS7_NOVERIFY, $signers_file);我收到以下错误:PKCS7 routines:SMIME_read_PKCS7:no content ty...

MySQL锁表查询不到进程,如何处理_Tomonkey的博客-程序员ITS203_mysql 锁表 没有进程

背景测试同事通过更新某个表的数据进行功能测试,突然说锁表了,也不知道原因为何,一直用的Navicat,然后用show OPEN TABLES where In_use &gt; 0;命令也查询不到具体的进程ID常规解决办法查询是否锁表show OPEN TABLES where In_use &gt; 0;查询进程show processlist;查询到相对应的进程,然后..._1671465600

前端Svelte框架初体验_xiangzhihong8的博客-程序员ITS203

Svelte是一个新兴的热门前端框架,作者是RichHarris,被称为前端界的【轮子哥】,有Ractive、Rollup和Buble开源作品。在官方的介绍中,Svelte即是一个前端UI框架,同时也是一个编译器。在《StateofJSsurveyof2020》报告中,它被预测为未来十年可能取代React和Vue等其他框架的新兴技术。在开源托管网站Github上,Svelte也获得了超过61k的关注,这仅次于明星框架React和Vue。...

推荐文章

热门文章

相关标签