Flink学习
文章平均质量分 90
flink相关知识学习与应用
午后的红茶meton
这个作者很懒,什么都没留下…
展开
-
Flink CheckPoint的状态保存及恢复
检查点状态的保存 在上文中已经提到过barrier算子的流动,其是从上游算子向下游算子流动,在下游的Task任务算子中,针对barrier的接收是委托给CheckpointBarrierHandler.getNextNonBlocked()来获取的,因而在CheckpointBarrierHandler获得CheckpointBarrier后可以及时地进行checkpoint相关的操作。其最终会调用StreamTask#performCheckpoint()方法来触发该barrier的向下游...原创 2021-01-07 16:33:28 · 3292 阅读 · 0 评论 -
Flink CheckPoint的触发过程
CheckpointCoordinator的转换及调度1、转换过程在Flink JobMaster中有用于协调和触发checkpoint机制的协调管理器CheckpointCoordinator,其是Flink分布式快照的核心管理控制组件,其主要维护的功能如下:发起checkpoint触发的消息,并接收不同task对checkpoint的响应信息(Ack) 维护Ack中附带的状态句柄(state-handle)的全局视图其针对checkpoint的配置及最终触发调度主要集中在两个转换过程中:原创 2021-01-07 16:23:05 · 2274 阅读 · 0 评论 -
Flink CheckPoint机制简介
FlinkCheckPoint是程序故障恢复以及数据一致性的效果的基础,checkpoint是一种分布式快照:对一个Flink作业的所有task做一个快照且将快照保存在memory/file system等存储系统中。这样,在任务进行故障恢复的时候,就可以还原到任务故障前最近一次检查点的状态,从而保证数据的一致性。当然,为了保证exactly-once/at-least-once的特性,还需要数据源支持数据回放。概述flink的checkpoint 机制基于 chandy-lamda ...原创 2020-12-09 16:02:27 · 1237 阅读 · 0 评论 -
Flink 双流Join
支持的join类型 Apache Flink目前支持INNER JOIN和LEFT OUTER JOIN(SELF 可以转换为普通的INNER和OUTER)。在语义上面Apache Flink严格遵守标准SQL的语义 CROSS INNER OUTER SELF ON WHERE Apache Flink N Y Y Y 必选 可选 双流Join的分类:Join大体分类只有两种:Window ...转载 2020-11-13 09:12:25 · 1469 阅读 · 0 评论 -
Flink Task的生命周期
一个FlinkJob提交到集群中运行时,会被调度为不同的Task。在前面的文章中,已经介绍了Flink如何根据用户的编写的程序生成调度用的执行图,如何为Task分配计算资源,以及Task之间如何进行数据交换。在这篇文章中,将跟踪一个Task的完整的生命周期,进一步加深对Flink执行过程的理解。Task和OperatorChain 在前面介绍如何生成JobGraph的文章中,已经了解到Flink会尽可能把能够chaining到一起的算子串联在一起,形成Operat...原创 2020-11-04 20:02:04 · 1228 阅读 · 0 评论 -
Flink 流量控制及反压
流量控制 Flink在两个Task之间建立Netty连接进行数据传输,每一个Task会分配两个缓冲池,一个用于输出数据,一个用于接收数据。当一个Task的缓冲池用尽之后,网络连接就处于阻塞状态,上游Task无法产出数据,下游Task无法接收数据,也就是我们所说的“反压”状态。这是一种非常自然的“反压”的机制,但是过程也相对比较粗暴。由于TaskManager之间的网络连接是由不同Task复用的,一旦网络处于阻塞状态,所有Task都无法向TCP连接中写入数据或者从中读取数据,即便其它Tas...原创 2020-11-03 23:28:09 · 1656 阅读 · 0 评论 -
Flink Task的数据交换分析
本地数据交换 如果一个InputChannel和其消费的上游ResultPartition所属Task都在同一个TaskManager中运行,那么它们之间的数据交换就在同一个JVM进程内不同线程之间进行,无需通过网络交换。我们已经了解到,ResultSubpartition中的buffer可以通过ResultSubpartitionView进行消费。LocalInputChannel正是用来进行同一JVM进程中不同线程之间的数据交换:public class LocalInputCh...原创 2020-11-03 21:21:43 · 514 阅读 · 0 评论 -
Flink Task的输入和输出源码分析
Task的输入和输出Task的输出 Task产出的每一个ResultPartition都有一个关联的ResultPartitionWriter,同时也都有一个独立的LocalBufferPool负责提供写入数据所需的buffer。ResultPartion实现了ResultPartitionWriter接口:public class ResultPartition implements ResultPartitionWriter, BufferPoolOwner { /** T...原创 2020-11-03 20:32:24 · 630 阅读 · 0 评论 -
Flink Task的数据交换机制概述
Flink的数据交换机制在设计时遵循两个基本原则:数据交换的控制流(例如,为初始化数据交换而发出的消息)是由接收端发起的 数据交换的数据流(例如,在网络中实际传输的数据被抽象为IntermediateResult的概念)是可插拔的数据交换也涉及到了一些角色,包括:JobManager:master节点,负责任务调度,异常恢复,任务协调,并且通过ExecutionGraph这样的数据结构来保存一个作业的全景图。 TaskManagers:工作节点,负责将多个任务并行的在线程中执行,每个TM中包含原创 2020-11-03 17:30:10 · 1232 阅读 · 1 评论 -
Flink State状态管理
State概述Keyed State和Operator StateFlink中的状态分为两类,Keyed State和Operator State。Keyed State是和具体的Key相绑定的,只能在KeyedStream上的函数和算子中使用。Opeartor State则是和Operator的一个特定的并行实例相绑定的,例如Kafka Connector中,每一个并行的Kafka Consumer都在Operator State中维护当前Consumer订阅的partiton和offset。由于原创 2020-11-02 21:43:05 · 1275 阅读 · 0 评论 -
Flink 内存管理
TaskManager的内存布局 Flink内部并非直接将对象存储在堆上,而是将对象序列化到一个个预先分配的MemorySegment中。MemorySegment是一段固定长度的内存(默认32KB);也是Flink中最小的内存分配单元。MemorySegment提供了高效的读写方法,它的底层可以是堆上的byte[],也可以是堆外(off-heap)ByteBuffer。可以把MemorySegment看作Java NIO中的ByteBuffer,Flink还实现了Java的java.io...原创 2020-11-01 23:38:57 · 1696 阅读 · 0 评论 -
Flink JobManager中Slot的计算资源管理
JobManager中Slot的管理 相比于TaskExecutor和ResourceManager,JobManager中资源管理的部分可能要相对更为复杂一下,这主要是由于Flink允许通过SlotSharingGroup和CoLocationGroup约束使得多个子任务在相同的的slot中运行。在JobMaster中,主要通过SlotPool和ResourceManager及TaskExecutor进行通信,并管理分配给当前JobMaster的slot;而具体到当前Job的所有子任务的...原创 2020-11-01 20:57:04 · 1701 阅读 · 0 评论 -
Flink ResourceManage中Slot的计算资源管理
ResourceManage中Slot的管理ResourceManager资源管理器其继承了FencedRpcEndpoint实现了RPC服务,其内部组件主要包含管理所有TaskExecutor上报的slot资源、申请(SlotManager) 为每个job任务选择出对应ha可用的JobMaster,并将该job任务分配该JobMaster服务(JobLeaderIdService)、高可用leader选举服务leaderElectionService等 心跳管理器taskManagerHear原创 2020-11-01 20:04:33 · 1002 阅读 · 0 评论 -
Flink TaskExecutor中Slot的计算资源管理
Task Slot的基本概念 在Flink启动模式中,以集群模式开启而非MiniCluster模式开启的话,每个TaskManager都是独立运行的一个单独的JVM进程,并且在一个TaskManager中可能运行多个子任务,这些子任务都在各自独立的线程中运行。为了描述控制一个TaskManager中可以运行的任务的数量,引入了Task Slot的概念。 每一个Task Slot代表了TaskManager所拥有的计算资源的一个固定的子集。其可以共享对应的TaskManag...原创 2020-11-01 18:52:13 · 3435 阅读 · 0 评论 -
Flink 源码解析--Async IO的实现
在使用Flink处理实时数据流时,经常需要和外部系统进行交互。例如,在构建实时数据仓库的时候,通常需要将消息和外部维表进行关联,以获得额外的维度数据。由于外部系统的响应时间和网络延迟可能会很高,如果采用同步调用的方式,那么外部调用的高延迟势必会影响到系统的吞吐量,进而成为系统的瓶颈。这种情况下,我们需要采用异步调用的方式。异步调用相比于同步调用,不同请求的等待时间可以重叠,从而提升了吞吐率。Async I/O的使用方式 在Flink中使用Async I/O的话,需要有一...原创 2020-10-12 22:40:27 · 530 阅读 · 0 评论 -
Flink 心跳服务机制
心跳机制是用于检测客户端或者服务端是否存活的一种机制,通过定期向对方发送请求方法,常见的心跳检测有两种:socket 套接字SO_KEEPALIVE本身带有的心跳机制,定期向对方发送心跳包,对方在收到心跳包后会自动回复; 应用自身实现心跳机制,同样也是使用定期发送请求的方式; Flink对各组件服务状态的监控统一使用心跳服务来管理,如同其上诉2实现机制一样,其主要也是调用方通过周期性定时发送心跳请求,接收方接收到心跳请求后作出对应的心跳响应;其内部实现是通过RPC相互调用的方式,并重置...原创 2020-10-08 15:53:51 · 3606 阅读 · 0 评论 -
Flink 集群启动流程
MiniCluster的启动流程: 首先来看最简单的本地模式MiniCluster的启动流程,以此来分析Flink的具体启动流程以及内部各组件之间的交互形式。MiniCluster可以看做是内嵌的Flink运行时环境,所有的组件都在独立的本地线程中运行。MiniCluster的启动入口在LocalStreamEnvironment#execute(jobName)中。其基本的相关的主要类图和actor模型如下:在MiniCluster#start启动源码中,启动流程大...原创 2020-10-07 00:11:30 · 3514 阅读 · 0 评论 -
Flink rpc实践
Flink的RPC服务是基于Akka Remote实现的一个简单的Akka Remoting ActorSystem的配置如下(基于akka 2.6.0版本):服务端配置及代码:application_server.confakka { actor { provider = remote allow-java-serialization = on serializers { jackson-json = "akka.serialization.jackson原创 2020-10-06 14:06:31 · 998 阅读 · 0 评论 -
Flink 源码解析--Stream、Job、ExecutionGraph的生成示例
应用程序示例2:public class SocketTextStreamWordCount { public static void main(String[] args) throws Exception { if (args.length != 2){ System.err.println("USAGE:\nSocketTextStreamWordCount <hostname> <port>");原创 2020-09-27 22:23:02 · 801 阅读 · 0 评论 -
Flink 源码解析3--ExecutionGraph的生成
针对前面程序的transformation操作转化分析过程,能够得到StreamGraph、JobGraph的划分、具体生成过程以及链路形式,这两个执行图的转化生成都是在client本地客户端。而最终flink Job运行时调度层核心的执行图-ExecutionGraph是在服务端(JobManager)中生成的。Client向JobManager提交JobGraph后,JobManage就会根据JobGraph来创建对应的ExecutionGraph,并以最终生成的ExecutionGr...原创 2020-09-27 21:13:07 · 581 阅读 · 0 评论 -
Flink 源码解析2--JobGraph的生成
上一节介绍了StreamGraph的生成,这个实际上只对应 Flink 作业在逻辑上的执行计划图。Flink 会进一步对 StreamGraph 进行转换,得到另一个执行计划图,即JobGraph。然后将JobGraph发送到server端进行ExecutionGraph的解析。主要的JobGraph的源码对象如下(其最主要的是Map<JobVertexID, JobVertex> taskVertices任务对象):public class JobGraph impl...原创 2020-09-27 20:52:35 · 430 阅读 · 0 评论 -
Flink 源码解析1--StreamGraph的生成
1. 先来简单看一下入门的WordCount程序1、首先数据源会产生随机的数字数据流(0-10内的数字)形式,然后通过flink的transformation将数据进行单词计数,再print输出// wordcount 计数demo代码public class WordCountDemo { public static void main(String[] args) throws Exception { // conf设置,避免调试的时候心跳超时 Co原创 2020-09-26 22:52:32 · 496 阅读 · 0 评论 -
Flink parallelism和Slot介绍
什么是parallelism? 一个Flink程序是由多个任务组成(source、transformation和sink)。一个任务由多个并行的实例(线程)来执行,一个任务的并行实例(线程)数目就被称为该任务的并行度。 并行的意思,在Flink中代表每个任务的并行度,适当的提高并行度可以大大提高job的执行效率,比如当你的job消费kafka的速度过慢,适当调大就消费正常了。在flink配置文件中可以看到其默认并行度是1。如何设置并行度?命令行:./bin/fli...原创 2020-09-11 00:35:09 · 1370 阅读 · 0 评论 -
Flink time概念
Flink time概念 Flink在流程序中支持不同的Time概念,就比如有Processing Time、Event Time和Ingestion Time。Event Time:数据源产生的事件时间 Event Time 是事件发生的时间,一般就是数据本身携带的时间。这个时间通常是在事件到达 Flink 之前就确定的,并且可以从每个事件中获取到事件时间戳。在 Event Time 中,时间取决于数据,而跟其他没什么关系。Event Time 程序必须指定如何生成 Event Time ..原创 2020-09-10 23:56:26 · 263 阅读 · 0 评论 -
Flink框架和工作流程简介
概述 Apache Flink是一个面向数据流处理和批量数据处理的可分布式的开源计算框架,它基于同一个Flink流式执行模型(streaming execution model),能够支持流处理和批处理两种应用类型。由于流处理和批处理所提供的SLA(服务等级协议)是完全不相同, 流处理一般需要支持低延迟、Exactly-once保证,而批处理需要支持高吞吐、高效处理,所以在实现的时候通常是分别给出两套实现方法,或者通过一个独立的开源框架来实现其中每一种处理方案。比较典型的有:实现批处理的开...转载 2020-09-10 23:42:55 · 2687 阅读 · 1 评论