摘要: 昨天在社区群看到有人问,为什么水印取最小的一条?这里分享一下自己的理解 首先水印一般是设置为:(事件时间 - 指定的值) 这里的作用是解决迟到数据的问题,从源码来看一下它如何解决的 先来看下windowOperator.java接收到数据以后做了什么 在processElement方法中,会遍历这条 阅读全文
posted @ 2019-08-22 10:42 ljygz 阅读(1598) 评论(2) 推荐(1) 编辑
摘要: Flink通过全局快照能保证内部处理的Exactly-once语义 但是端到端的Exactly-once还需要下游数据源配合,常见的通过幂等或者二阶段提交这两种方式保证 这里就来分析一下Sink二阶段提交的Flink源码是如何实现的 本文源码基于Flink1.14 老版本的话看TwoPhaseCom 阅读全文
posted @ 2022-01-26 18:31 ljygz 阅读(870) 评论(0) 推荐(0) 编辑
摘要: 本文源码基于flink1.14 在帮助用户排查任务的时候,经常会发现部分task处理的慢,在Exactly once语义时需要等待快照的对齐而白白柱塞的情况 在flink1.11版本引入了非对齐的checkpoint,来解决这种柱塞问题,所以来看看这个新特性的源码是如何实现的 先看下官网的图来总的说 阅读全文
posted @ 2022-01-12 18:29 ljygz 阅读(1666) 评论(0) 推荐(1) 编辑
摘要: 本文源码基于flink1.14 上一篇文章分析了《flink的minibatch微批处理》的源码 乘热打铁分析一下两阶段聚合的源码,因为使用两阶段要先开启minibatch,至于为什么后面会分析到 两阶段聚合的原理,还是简单提一下 如下图,当聚合发生热点的时候,可以在聚合前,先进行一个本地的聚合,先 阅读全文
posted @ 2022-01-06 16:56 ljygz 阅读(1104) 评论(0) 推荐(0) 编辑
摘要: 本文源码基于flink1.14 平台用户在使用我们的flinkSql时经常会开启minaBatch来优化状态读写 所以从源码的角度具体解读一下miniBatch的原理 先看一下flinksql是如何触发miniBatch的优化的 主要就是这个Calcite的rule了,来具体看一下 在对应的matc 阅读全文
posted @ 2022-01-02 19:37 ljygz 阅读(1471) 评论(0) 推荐(0) 编辑
摘要: 本文源码基于flink 1.14 被同事问到几个关于AsyncIO和lookUp维表的问题所以翻了下源码,从源码的角度解惑这几个问题 对于AsyncIO不了解的可以看看之前写的这篇 《Flink中异步AsyncIO的实现 (源码分析)》 问题一:AsyncIO 有(排序 / 非排序) 模式,非排序模 阅读全文
posted @ 2021-11-11 10:39 ljygz 阅读(1543) 评论(0) 推荐(1) 编辑
摘要: 源码分析基于flink1.14 Join是flink中最常用的操作之一,但是如果滥用的话会有很多的性能问题,了解一下Flink源码的实现原理是非常有必要的 本文的join主要是指flink sql的Regular join 也就是平时我们的双流join中普通的full join ,left join 阅读全文
posted @ 2021-10-26 18:00 ljygz 阅读(1434) 评论(0) 推荐(0) 编辑
摘要: 基于flink1.14的源码做解析 公司内有很多业务方都在使用我们Flink sql平台做TopN的计算,今天同事突然问到我,Flink sql 是怎么实现topN的 ? 蒙圈了,这块源码没看过啊 ,业务要问起来怎么办,赶快打开源码补一下 拿到这个问题先冷静分析一下范围 首先肯定属于Flink sq 阅读全文
posted @ 2021-10-20 17:52 ljygz 阅读(753) 评论(1) 推荐(0) 编辑
摘要: Calcite作为大数据领域最常用的SQL解析引擎,支持Flink , hive, kylin , druid等大型项目的sql解析 同时想要深入研究Flink sql源码的话calcite也是必备技能之一,非常值得学习 我们内部也通过它在做自研的sql引擎,通过一套sql支持关联查询任意多个异构数 阅读全文
posted @ 2021-10-19 16:59 ljygz 阅读(1977) 评论(2) 推荐(0) 编辑
摘要: 这篇文章主要介绍从命令行到任务在Driver端运行的过程 通过flink run 命令提交jar包运行程序 以yarn 模式提交任务命令类似于: flink run -m yarn-cluster XXX.jar 先来看一下脚本中的调用类 在flink.sh脚本中可以看到提交的命令走到了这样一个外观 阅读全文
posted @ 2020-02-29 10:51 ljygz 阅读(4575) 评论(0) 推荐(0) 编辑
摘要: 流式计算中处理延迟是一个非常重要的监控metric flink中通过开启配置 metrics.latency.interval 来开启latency后就可以在metric中看到askManagerJobMetricGroup/operator_id/operator_subtask_index/la 阅读全文
posted @ 2019-12-13 17:19 ljygz 阅读(2160) 评论(0) 推荐(1) 编辑
摘要: 其实CEP复杂事件处理,简单来说你可以用通过类似正则表达式的方式去表示你的逻辑,表现能力非常的强,用过的人都知道 开篇先偷一张图,整体了解FlinkCEP中的 一种重要的图 NFA FlinkCEP在运行时会将用户的逻辑转化成这样的一个NFA Graph (nfa对象) graph 中包含状态(Fl 阅读全文
posted @ 2019-12-04 11:45 ljygz 阅读(2981) 评论(0) 推荐(1) 编辑
摘要: 先上张图整体了解Flink中的异步io 阿里贡献给flink的,优点就不说了嘛,官网上都有,就是写库不会柱塞性能更好 然后来看一下, Flink 中异步io主要分为两种 一种是有序Ordered 一种是无序UNordered 主要区别是往下游output的顺序(注意这里顺序不是写库的顺序既然都异步了 阅读全文
posted @ 2019-11-15 08:50 ljygz 阅读(1768) 评论(0) 推荐(1) 编辑
摘要: 上一篇《Flink接收端反压机制》说到因为Flink每个Task的接收端和发送端是共享一个bufferPool的,形成了天然的反压机制,当Task接收数据的时候,接收端会根据积压的数据量以及可用的buffer数量(可用的memorySegment数)来决定是否向上游发送Credit(简而言之就是当我 阅读全文
posted @ 2019-11-12 09:25 ljygz 阅读(966) 评论(0) 推荐(0) 编辑
摘要: 先上一张图整体了解Flink中的反压 可以看到每个task都会有自己对应的IG(inputgate)对接上游发送过来的数据和RS(resultPatation)对接往下游发送数据, 整个反压机制通过inputgate,resultPatation公用一个一定大小的memorySegmentPool来 阅读全文
posted @ 2019-11-06 18:14 ljygz 阅读(2301) 评论(0) 推荐(0) 编辑
摘要: 最近这段时间一直在忙新集群迁移,上了最新的cdh6.3.0 于是Flink 提交遇到了许多的问题 还好有cloudera License 有了原厂的帮助和社区的伙伴,问题解决起来快了不少,手动滑稽 集群具体情况是,cdh6.3.0+Flink1.8.1,整个数据平台全部组件都上了kerberos和l 阅读全文
posted @ 2019-10-23 17:52 ljygz 阅读(1945) 评论(2) 推荐(0) 编辑
摘要: TaskManager接收到来自JobManager的jobGraph转换得到的TDD对象,启动了任务,在StreamInputProcessor类的processInput()方法中 通过一个while(true)中不停的拉取上游的数据,然后调用streamOperator.processElem 阅读全文
posted @ 2019-09-11 08:37 ljygz 阅读(1213) 评论(0) 推荐(0) 编辑
摘要: 前面说到了 Flink的TaskManager启动(源码分析) 启动了TaskManager 然后 Flink的Job启动JobManager端(源码分析) 说到JobManager会将转化得到的TDD发送到TaskManager的RPC 这篇主要就讲一下,Job在TaskManager端是如何启动 阅读全文
posted @ 2019-09-03 18:09 ljygz 阅读(1525) 评论(0) 推荐(2) 编辑
摘要: 前几天在社区群上,有人问了一个问题 既然上游最小水印会决定窗口触发,那如果我上游其中一条流突然没有了数据,我的窗口还会继续触发吗? 看到这个问题,我蒙了???? 对哈,因为我是选择上游所有流中水印最小的一条作为当前水印时间,那万一最小水印的那条流突然里面没有数据了 那我的最小水印不就一直不往前走了, 阅读全文
posted @ 2019-08-30 17:05 ljygz 阅读(1871) 评论(2) 推荐(0) 编辑
摘要: 在用户代码中,我们设置生成水印和事件时间的方法assignTimestampsAndWatermarks()中这里有个方法的重载 我们传入的对象分为两种 AssignerWithPunctuatedWatermarks(可以理解为每条数据都会产生水印,如果不想产生水印,返回一个null的水印) As 阅读全文
posted @ 2019-08-30 15:34 ljygz 阅读(2678) 评论(0) 推荐(0) 编辑
摘要: 通过前面的文章了解到 Driver将用户代码转换成streamGraph再转换成Jobgraph后向Jobmanager端提交 JobManager启动以后会在Dispatcher.java起来RPC方法submitJob(jobGraph),用于接收来自Driver转化得到的JobGraph来启动 阅读全文
posted @ 2019-08-29 15:01 ljygz 阅读(3134) 评论(0) 推荐(0) 编辑
摘要: 整个Flink的Job启动是通过在Driver端通过用户的Envirement的execute()方法将用户的算子转化成StreamGraph 然后得到JobGraph通过远程RPC将这个JobGraph提交到JobManager对应的接口 JobManager转化成executionGraph.d 阅读全文
posted @ 2019-08-27 18:04 ljygz 阅读(1181) 评论(0) 推荐(1) 编辑
摘要: 通过启动脚本已经找到了TaskManager 的启动类org.apache.flink.runtime.taskexecutor.TaskManagerRunner 来看一下它的main方法中 最后被start了起来 start其实是将taskManager 端的RPC服务起起来了 看一下TaskM 阅读全文
posted @ 2019-08-26 18:40 ljygz 阅读(2758) 评论(0) 推荐(0) 编辑
摘要: 都知道Flink中的角色分为Jobmanager,TaskManger 在启动脚本里面已经找到了jobmanager的启动类org.apache.flink.runtime.entrypoint.StandaloneSessionClusterEntrypoint(local模式更简单直接在Driv 阅读全文
posted @ 2019-08-24 18:22 ljygz 阅读(1594) 评论(0) 推荐(0) 编辑
摘要: 整个Flink集群的角色分为Jobmanager和TaskManager 以Standalone为例来看一下脚本里面是怎样启动集群的 找到源码的dist这里面包含了启动的脚本文件 standalone模式下我们通过start-cluster.sh这个脚本启动 来看下里面具体做了什么 在最后调用了jo 阅读全文
posted @ 2019-08-23 11:01 ljygz 阅读(1255) 评论(0) 推荐(0) 编辑