首页 > 其他分享 >聊聊Flink必知必会(二)

聊聊Flink必知必会(二)

时间:2023-06-13 11:47:56浏览次数:59  
标签:Barrier 必知 Flink Checkpoint 外部 Sink 聊聊 数据

Checkpoint与Barrier

Flink是一个有状态的流处理框架,因此需要对状态做持久化,Flink定期保存状态数据到存储空间上,故障发生后从之前的备份中恢复,这个过程被称为Checkpoint机制。而Checkpoint为Flink提供了Exactly-Once的投递保障。

流处理是一个数据不断输入的过程,为了更好更方便的快照,需要将数据进行分批分段;而Barrier(栅栏)就是做这个事情,它将数据流分段,在进行Checkpoint的时候Flink会在数据流源头处周期性地注入Barrier,这些Barrier会作为数据流的一部分,一起流向下游节点并且不影响正常的数据流。Barrier的作用是将无界数据流从时间上切分成多个窗口,每个窗口对应一系列连续的快照中的一个,每个Barrier都带有一个快照ID,一个Barrier生成之后,在这之前的数据都进入此快照,在这之后的数据则进入下一个快照。
如图所示,当ID为n的Checkpoint Barrier到达每个算子后,表示要对n-1和n之间状态更新做Snapshot。
image

Connector与端到端的Exactly-Once保障

一个完整的Flink作业包括Source和Sink两大模块,Source和Sink肩负着Flink与外部系统进行数据交互的重要功能,它们又被称为外部连接器(Connector)。
Flink的Checkpoint过程保证了一个作业内部的数据一致性,主要是因为Flink对如下两类数据做了备份。

  • 作业中每个算子的状态。
  • 输入数据的偏移量Offset。

端到端的Exactly-Once问题是分布式系统领域最具挑战性的问题之一,很多系统都在试图攻克这个问题。在这个问题上,Flink内部状态的一致性主要依赖Checkpoint机制,外部交互的一致性主要依赖Source和Sink提供的功能。Source需要支持重发功能,Sink需要采用一定的数据写入技术,比如幂等写或事务写。

Source重发

对于Source重发功能,如图7-1所示,只要我们记录了输入的偏移量Offset,作业重启后数据发送方根据该Offset重新开始发送数据即可。Kafka的Producer除了发送数据,还能将数据持久化写到日志文件中。如果下游作业重启,Kafka Producer根据下游作业提供的Offset,从持久化的日志文件中定位到数据,可以重新开始向下游作业发送数据。

image

Sink幂等写

幂等写(Idempotent Write)是指,任意多次向一个系统写入数据,只对目标系统产生一次结果影响。

事务(Transaction)是数据库系统所要解决的核心问题。Flink借鉴了数据库中的事务处理技术,同时结合自身的Checkpoint机制来保证Sink只对外部输出产生一次影响。

简单概括,Flink的事务写(Transaction Write)是指,Flink先将待输出的数据保存下来,暂时不向外部系统提交;等到Checkpoint结束,Flink上、下游所有算子的数据都一致时,将之前保存的数据全部提交到外部系统。换句话说,只有经过Checkpoint确认的数据才向外部系统写入。如图所示,在数据重发的例子中,如果使用事务写,那只把时间戳3之前的输出提交到外部系统,时间戳3以后的数据(例如时间戳5和8生成的数据)先被写入缓存,等得到确认后,再一起提交到外部系统。这就避免了时间戳5的数据多次产生输出,并多次提交到外部系统。

image

在事务写的具体实现上,Flink目前提供了两种方式:预写日志(Write-Ahead-Log,WAL)和两阶段提交(Two-Phase-Commit,2PC)。这两种方式也是很多数据库和分布式系统实现事务时经常采用的方式,Flink根据自身的条件对这两种方式做了适应性调整。这两种方式的主要区别在于:Write-Ahead-Log方式使用Operator State缓存待输出的数据;如果外部系统自身支持事务,比如Kafka,就可以使用Two-Phase-Commit方式,待输出数据被缓存在外部系统。

标签:Barrier,必知,Flink,Checkpoint,外部,Sink,聊聊,数据
From: https://www.cnblogs.com/zhiyong-ITNote/p/17477080.html

相关文章

  • flink 源代码启动
    Flink源码编译启动 背景纯小白新手入门flink,由于自身基础差底子薄,启动个源码各种查资料找资源,终于启动好了值得记录一下,本文源码启动是基于idea+jdk8+maven在windows上启动flink1.16源码。(1)下载源码源码地址:https://github.com/apache/flink/tree/release-1.16(2)项目编译首先......
  • MySql必知必会教程--数据过滤
    selectprod_id,prod_name,prod_pricefromproductswherevend_id=1003andprod_price<=10;输出结果:+---------+----------------+------------+|prod_id|prod_name|prod_price|+---------+----------------+------------+|FB|Birdseed......
  • DevOps落地实践点滴和踩坑记录-(2) -聊聊企业内部DevOps平台建设
    很久没有写文章记录了,上一篇文章像流水账一样,把所见所闻一个个记录下来。这次专门聊聊DevOps平台的建设吧,有些新的体会和思考,希望给正在做这个事情的同学们一些启发吧。DevOps落地实践点滴和踩坑记录-(1)企业落地DevOps该买商用还是自己研发呢?很多团队刚开始都会问这个问题,我的回......
  • 聊聊Flink的必知必会(一)
    概述Flink是一个框架和分布式处理引擎,用于在无边界和有边界数据流上进行有状态的计算。Flink能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算。使用官网的语句来介绍,Flink就是“StatefulComputationsoverDataStreams”。首先,Flink是一个纯流式的计算引擎,它......
  • 聊聊结合业务需求给出合理的技术解决方案,改进现有模块功能,提高系统的可扩展性,封装性,稳
    针对提高系统的可扩展性、封装性、稳定性,改进现有模块功能,以下是我给出的一些技术解决方案:使用面向对象编程的设计模式:可以采用一些设计模式如单例模式、工厂模式、观察者模式等,来提高系统的可扩展性和封装性。应用微服务架构:可以将系统拆分成多个独立的服务,使得每个服务都可......
  • Mysql必知必会教程--数据过滤
    关键字:where这里只说明不匹配的用法,其他的较为简单,不予叙述。selectvend_id,prod_namefromproductswherevend_id<>1003;输出结果:+---------+--------------+|vend_id|prod_name|+---------+--------------+|1001|.5tonanvil||1001|1tonan......
  • MySql必知必会教程--排序检索数据
    重点关键字:orderby排序单列数据:selectprod_namefromproductsorderbyprod_name;输出结果:+----------------+|prod_name|+----------------+|.5tonanvil||1tonanvil||2tonanvil||Birdseed||Carrots||Detonator......
  • 实例讲解Flink 流处理程序编程模型
    摘要:在深入了解Flink实时数据处理程序的开发之前,先通过一个简单示例来了解使用Flink的DataStreamAPI构建有状态流应用程序的过程。本文分享自华为云社区《Flink实例:Flink流处理程序编程模型》,作者:TiAmoZhang。在深入了解Flink实时数据处理程序的开发之前,先通过一个简单......
  • Mysql必知必会教程--【检索数据】
    首先给出本次教程需要用到的数据表的内容:products+---------+---------+----------------+------------+----------------------------------------------------------------+|prod_id|vend_id|prod_name|prod_price|prod_desc......
  • 聊聊读研究生应该怎么权衡offer的选择(适合选择恐惧症,哈哈)
    关注微信公众号“AI学习经历分享”,回复对应关键词,获取机器学习,深度学习,Python,Java的技术干货!今天突然有时间聊聊这个读研究生offer的选择,一方面是因为当初都答应了一位朋友,但是因为种种原因和因素,鸽了这个约定,并且最近一段时间比较忙,但是我从来没有忘记,答应别人的事情一定要做到。......