
Flink
文章平均质量分 91
Flink
LittleMagics
Flinker @ JD.com
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
浅谈Flink SQL代码生成与UDF重复调用的优化
前言之前讲解Flink SQL执行流程时留下了代码生成的坑,在百忙之中抽时间补一补。代码生成简介代码生成(code generation)是当今各种数据库和数据处理引擎广泛采用的物理执行层技术之一。通过代码生成,可以将原本需要解释执行的算子逻辑转为编译执行(二进制代码),充分利用JIT编译的优势,克服传统Volcano模型虚函数调用过多、对寄存器不友好的缺点,在CPU-bound场景下可以获得大幅的性能提升。在大数据领域,看官最为熟知的代码生成应用可能就是Spark 2.x的全阶段代码生成(whol原创 2021-12-13 14:35:04 · 1257 阅读 · 1 评论 -
Flink新特性之非对齐检查点(unaligned checkpoint)简介
前言在食用本文之前,建议看官先充分食用这两篇文章:《Chandy-Lamport分布式快照算法小记》与《深入理解Flink的轻量级异步屏障快照(ABS)算法》。屏障对齐的风险在Flink的检查点机制中,屏障(barrier)是划分快照(状态)的边界。在启用exactly once语义的条件下,当一个算子有多个输入流时,需要等待所有输入流中当前检查点N的屏障都到达其输入缓冲区,才能安全地触发检...原创 2020-08-11 21:05:00 · 8064 阅读 · 4 评论 -
Flink SQL FileSystem Connector分区提交与自定义小文件合并策略
Prologue之前笔者在介绍Flink 1.11 Hive Streaming新特性时提到过,Flink SQL的FileSystem Connector为了与Flink-Hive集成的大环境适配,做了很多改进,而其中最为明显的就是分区提交(partition commit)机制。本文先通过源码简单过一下分区提交机制的两个要素——即触发(trigger)和策略(policy)的实现,然后用合并...原创 2020-08-04 22:36:32 · 3751 阅读 · 4 评论 -
再谈双亲委派模型与Flink的类加载策略
类加载简书被请去喝了三天茶,笔者也度过了炒鸡忙乱的三天。今天事情终于少一点了,专栏再开,写篇基础的热热身吧。我们知道,在JVM中,一个类加载的过程大致分为加载、链接(验证、准备、解析)、初始化5个阶段。而我们通常提到类的加载,就是指利用类加载器(ClassLoader)通过类的全限定名来获取定义此类的二进制字节码流,进而构造出类的定义。Flink作为基于JVM的框架,在flink-conf.y...原创 2020-07-31 22:10:40 · 2264 阅读 · 4 评论 -
Flink广播流、广播状态原理简析
Prologue在很久之前的《Spark Streaming/Flink广播实现作业配置动态更新》一文中,笔者简单介绍了Flink Streaming API中广播流和广播状态的使用方法。前几天见到社区群内有童鞋询问与广播状态相关的事情,于是写一篇深入一点的文章说说它。Broadcast[Connected]Stream拿之前的示意图复习一下。其中Stream A是普通的数据流...原创 2020-07-16 22:57:20 · 7678 阅读 · 5 评论 -
Flink 1.11新特性之SQL Hive Streaming简单示例
前言今天本来想搞篇走读StreamingFileSink源码的文章,但是考虑到Flink 1.11版本发布已经有段时间了,于是就放松一下,体验新特性吧。与1.10版本相比,1.11版本最为显著的一个改进是Hive Integration显著增强,也就是真正意义上实现了基于Hive的流批一体。本文用简单的本地示例来体验Hive Streaming的便利性。添加相关依赖测试集群上的Hive版本...原创 2020-07-15 23:48:33 · 2079 阅读 · 3 评论 -
深入分析Flink的operator chain(算子链)机制
前言这篇是昨晚没写完的,今晚补全发出来。Flink算子链简介“为什么我的Flink作业Web UI中只显示出了一个框,并且Records Sent和Records Received指标都是0?是我的程序写得有问题吗?”笔者在Flink社区群里经常能看到类似这样的疑问。这种情况几乎都不是程序有问题,而是因为Flink的operator chain——即算子链机制导致的,即提交的作业的执行...原创 2020-07-01 20:28:25 · 5485 阅读 · 4 评论 -
利用InfluxDB+Grafana搭建Flink on YARN作业监控大屏
前言虽然笔者之前写过基于Prometheus PushGateway搭建Flink监控的过程,但是在我们的生产环境中,使用的是InfluxDB。InfluxDB是一个由Go语言写成的、由InfluxData部分开源的时序数据库,能够非常好地处理监控指标的存储和查询,配合Grafana即可简单地实现Flink作业metrics的收集与展示。本文简述配置过程及一些小问题。硬件参数新版Influx...原创 2020-06-17 23:42:04 · 1585 阅读 · 0 评论 -
谈谈Flink DataStream API中的三种双流join操作
前言本文是基础中的基础,看官可以放心食用。在数据库中的静态表上做OLAP分析时,两表join是非常常见的操作。同理,在流式处理作业中,有时也需要在两条流上做join以获得更丰富的信息。Flink DataStream API为用户提供了3个算子来实现双流join,分别是:join()coGroup()intervalJoin()本文举例说明它们的使用方法,顺便聊聊比较特殊的inte...原创 2020-06-15 22:07:19 · 6918 阅读 · 1 评论 -
Flink链路延迟监控的LatencyMarker机制实现
前言今天本应放一首适合高考气氛的歌的,但是既然受疫情影响推迟了,还是老老实实写点技术相关的吧。对于实时的流式处理系统来说,我们需要关注数据输入、计算和输出的及时性,所以处理延迟是一个比较重要的监控指标,特别是在数据量大或者软硬件条件不佳的环境下。Flink早在FLINK-3660就为用户提供了开箱即用的链路延迟监控功能,只需要配置好metrics.latency.interval参数,再观察T...原创 2020-06-07 17:16:02 · 4078 阅读 · 4 评论 -
深入理解Flink的轻量级异步屏障快照(ABS)算法
Prologue在很久之前,笔者曾简单介绍了Chandy-Lamport分布式快照算法,如果看官还未读过,建议作为前置知识补充一下。用过Flink的人都会知道检查点机制有多重要,而Flink做checkpoint的过程正是依赖于Chandy-Lamport算法的变种——异步屏障快照(asynchronous barrier snapshotting, ABS)算法。该算法由五位大佬通过论文《L...原创 2020-05-26 22:45:00 · 2127 阅读 · 1 评论 -
简析Flink状态生存时间(State TTL)机制的底层实现
前言很久没写过源码走读类型的文章了。最近在做业务需求时用Flink的State TTL非常多,今天就来探索一下吧。从Flink 1.6版本开始,社区为状态引入了TTL(time-to-live,生存时间)机制,支持Keyed State的自动过期,有效解决了状态数据在无干预情况下无限增长导致OOM的问题。State TTL的用法很简单,官方文档中给出的示例代码如下。StateTtlConfi...原创 2020-05-12 22:34:51 · 6859 阅读 · 3 评论 -
Flink+HyperLogLog实现海量实时去重计数
今天忙到飞起(到现在还没完),写一篇超短的小技巧吧。HyperLogLog是去重计数的利器,能够以很小的精确度误差作为trade-off大幅减少内存空间占用,在不要求100%准确的计数场景极为常用。关于它的数学原理,看官可参见之前写过的《再谈基数估计之HyperLogLog算法》,不再赘述了。在用Flink做实时计算的过程中,也短不了做去重计数,比如统计UV。我们当然可以直接借助Redis的H...原创 2020-05-06 22:59:48 · 3069 阅读 · 4 评论 -
Flink 1.10之改进的TaskManager内存模型与配置
前言Flink社区在FLIP-49提出了新版统一的TaskManager内存模型及配置,这也是Flink 1.10版本最主要的改进与优化点之一。根据社区的说法,该proposal致力于解决1.9版本及之前的TM内存配置的三个缺点:流处理与批处理作业的内存配置方法不同;流处理作业中RocksDB状态后端的内存配置过于复杂,需要小心控制堆外内存的消耗量;内存配置有隐藏细节,且...原创 2020-04-21 21:05:00 · 4041 阅读 · 0 评论 -
聊聊Flink DataStream的八种物理分区逻辑
这两天正在折腾ClickHouse,折腾完再写文章记录,今天就先弄一篇关于Flink的小知识吧。DataStream分区Spark的RDD有分区的概念,Flink的DataStream同样也有,只不过没有RDD那么显式而已。Flink通过流分区器StreamPartitioner来控制DataStream中的元素往下游的流向,以StreamPartitioner抽象类为中心的类...原创 2020-04-12 21:37:56 · 983 阅读 · 0 评论 -
Flink入门技术分享PPT之二
继续为小伙伴们做关于Flink的技术分享,这次主要是简单介绍事件时间、水印和窗口的相关知识。多图预警~...原创 2020-04-03 20:18:47 · 800 阅读 · 0 评论 -
Flink 1.10 SQL、HiveCatalog与事件时间整合示例
前言Flink 1.10与1.9相比又是个船新版本,在我们感兴趣的很多方面都有改进,特别是Flink SQL。本文用根据埋点日志计算PV、UV的简单示例来体验Flink 1.10的两个重要新特性,一是SQL DDL对事件时间的支持,二是Hive Metastore作为Flink的元数据存储(即HiveCatalog)。这两点将会为我们构建实时数仓提供很大的便利。添加依赖项示例...原创 2020-03-25 23:43:37 · 1157 阅读 · 1 评论 -
Flink常见异常和错误信息小结
周末了,不想搞长篇大论,就写写这样的流水账吧。Flink的常见异常众多,不可能面面俱到,所以想到哪儿写到哪儿,有漏掉的之后再补充。部署和资源问题(0) JDK版本过低这不是个显式错误,但是JDK版本过低很有可能会导致Flink作业出现各种莫名其妙的问题,因此在生产环境中建议采用JDK 8的较高update(我们使用的是181)。(1) Could not b...原创 2020-03-22 20:09:39 · 8164 阅读 · 2 评论 -
Flink入门技术分享PPT之一
今天为小伙伴们做了Flink入门的技术分享,把做的PPT贴在下面当做今日份吧。多图预警~...原创 2020-03-12 22:46:24 · 2223 阅读 · 1 评论 -
Flink Logback日志与邮件报警配置
短文模式继续。Flink官方推荐使用Logback替代默认的Log4j作为日志框架。我们之前一直用Log4j,最近切换成了更优秀的Logback,但是配置起来略有点麻烦,本文简述配置过程。在项目POM中加入Logback的依赖项:logback-core、logback-classic,以及log4j-over-slf4j(因为Flink依赖于Hadoop,Hadoop却直接...原创 2020-03-04 22:41:39 · 1609 阅读 · 0 评论 -
维度数据实时关联的实践(w/ Flink、Vert.x & Guava Cache)
Data Enrichment在流式处理作业(特别是实时数仓ETL作业)中,我们的数据流可以视为无界事实表,其中往往缺乏一些维度信息。例如,对于埋点日志流而言,为了减少传输冗余,可能只会带有城市ID、商品ID等,如果要映射到对应的名称,就需要与外部存储中的维度表进行关联。这里的外部存储一般是指适合OLTP场景的数据库,如MySQL、Redis、HBase等。英文语境里习惯将上述操作称为data...原创 2020-04-26 20:50:53 · 1904 阅读 · 3 评论 -
Flink状态的缩放(rescale)与键组(Key Group)设计
前言在之前那篇讲解Flink Timer的文章里,我曾经用三言两语简单解释了Key Group和KeyGroupRange的概念。实际上,Key Group是Flink状态机制中的一个重要设计,值得专门探究一下。本文先介绍Flink状态的理念,再经由状态——主要是Keyed State——的缩放(rescale)引出KeyGroup的细节。再认识Flink状态自从开始写关于F...原创 2020-02-02 22:41:54 · 8439 阅读 · 9 评论 -
Flink Timer(定时器)机制与其具体实现
Timer简介Timer(定时器)是Flink Streaming API提供的用于感知并利用处理时间/事件时间变化的机制。Ververica blog上给出的描述如下:Timers are what make Flink streaming applications reactive and adaptable to processing and event time ch...原创 2020-01-09 22:45:17 · 11532 阅读 · 6 评论 -
再谈Flink事件时间、水印和迟到数据处理
前言之前的文章中已经屡次提到过Flink的事件时间(event time)、水印(watermark)、乱序(out-of-order)、迟到数据(late element)这些概念,虽然它们都非常基础,但笔者还没有对它们做过像样的介绍,感觉不太合适。正好今天脑子比较累,又是Friday night,不适合写复杂的东西,就来谈谈简单的吧。事件时间与水印所谓事件时间,就是Fli...原创 2019-12-27 21:35:30 · 1647 阅读 · 0 评论 -
Flink Job重启与Task恢复策略简介
前言流式计算对稳定性敏感,所以我们在编写作业时一定会做好防御性编程,如各种判空、边界条件、安全的类型转换、格式判断、异常捕获等。但是墨菲定律说得好:Anything that can go wrong will go wrong.换言之,我们写再多的防御性代码,也无法覆盖所有非法数据的可能性,何况外部环境(网络、磁盘等)也会出现不可预知的波动,所以作业在遇到意外情况时最好...原创 2019-12-22 22:54:49 · 2256 阅读 · 1 评论 -
Flink滑动窗口原理与细粒度滑动窗口的性能问题
Flink的窗口机制是其底层核心之一,也是高效流处理的关键。Flink窗口分配的基类是WindowAssigner抽象类,下面的类图示出了Flink能够提供的所有窗口类型。Flink窗口分为滚动(tumbling)、滑动(sliding)和会话(session)窗口三大类,本文要说的是滑动窗口。下图示出一个典型的统计用户访问的滑动窗口,来自官方文档。...原创 2019-12-15 20:47:59 · 1546 阅读 · 1 评论 -
谈谈三种海量数据实时去重方案(w/ Flink)
Prologue数据去重(data deduplication)是我们大数据攻城狮司空见惯的问题了。除了统计UV等传统用法之外,去重的意义更在于消除不可靠数据源产生的脏数据——即重复上报数据或重复投递数据的影响,使流式计算产生的结果更加准确。本文以Flink处理日均亿级别及以上的日志数据为背景,讨论除了朴素方法(HashSet)之外的三种实时去重方案,即:布隆过滤器、RocksD...原创 2019-12-03 22:37:50 · 2008 阅读 · 2 评论 -
Spark Streaming/Flink广播实现作业配置动态更新
前言在实时计算作业中,往往需要动态改变一些配置,举几个栗子:实时日志ETL服务,需要在日志的格式、字段发生变化时保证正常解析;实时NLP服务,需要及时识别新添加的领域词与停用词;实时风控服务,需要根据业务情况调整触发警告的规则。那么问题来了:配置每次变化都得手动修改代码,再重启作业吗?答案显然是否定的,毕竟实时任务的终极目标就是7 x 24无间断运行。Spark St...原创 2019-11-27 21:33:52 · 724 阅读 · 0 评论 -
聊聊Flink异步I/O机制的原理
在不久前的这篇文章中,提出了一种用Flink做流处理时join外部维度数据的简单方法。但是它的适用情境毕竟有限,通用的方法则是从Flink 1.2版本引入的异步I/O(Async I/O)机制。异步I/O专门用来解决Flink计算过程中与外部系统的交互问题。在默认情况下,算子向外部系统发出请求后即阻塞,等待结果返回才能发送下一个请求,可能会造成较大的延迟,吞吐量下降。有了异步I/...原创 2019-11-22 21:39:23 · 677 阅读 · 0 评论 -
利用HanLP与Flink/Spark做实时中文分词
这两天又开始忙起来了,继续写小短文。最近刚刚接了一个实时舆情监控的任务,大体思路是实时接入并处理各微信群内用户的发言。一是从中发现规律,为各群用户生成画像,方便做推广;二是及时将用户的不满与抱怨及时上报给业务方。显然,千里之行的第一步就是将用户的发言做词法分析——通俗来讲就是“分词”。HanLP(主页见这里,项目repo见这里)是目前Java环境下非常流行的中文NLP工具集。要...原创 2019-11-14 22:39:28 · 1091 阅读 · 0 评论 -
基于Kafka+Flink+Redis的电商大屏实时计算案例
前言一年一度的双11又要到了,阿里的双11销量大屏可以说是一道特殊的风景线。实时大屏(real-time dashboard)正在被越来越多的企业采用,用来及时呈现关键的数据指标。并且在实际操作中,肯定也不会仅仅计算一两个维度。由于Flink的“真·流式计算”这一特点,它比Spark Streaming要更适合大屏应用。本文从笔者的实际工作经验抽象出简单的模型,并简要叙述计算流程...原创 2019-11-05 23:50:53 · 453 阅读 · 0 评论 -
聊聊Java泛型类型擦除及Flink类型暗示(type hint)机制
类型擦除的表现先通过以下两个例子认识类型擦除(type erasure)。例子一代码很简单,但无法通过编译,提示两个方法签名冲突,因为擦除类型相同。如果去掉其中一个方法,反编译之后的代码如下。public void foo(List list) { }例子二这段代码会返回true。并且Java中只有List.class的写法,没有L...原创 2019-11-03 23:38:22 · 4321 阅读 · 0 评论 -
Flink DataStream join小规模维度数据的简便方法
最近真的非常忙,所以只能写点这种类似工作总结的小短文了,看官勿怪。在编写基于Flink的ETL程序时,我们经常需要用维度数据丰富我们接入的流式数据,如通过商品ID获得商品名称、通过商品分类ID获得分类名称等等。而维度表基本都位于外部存储,换句话说,就是要解决一个无界的流式表与一个有界的码表或半静态表做join操作的问题。一般情况下的首选方案是Flink内置的异步I/O机制,必要...原创 2019-10-30 22:14:41 · 286 阅读 · 0 评论 -
用两阶段聚合法解决Flink keyBy()算子倾斜
这是上周出现的问题了,简单做个记录。有一个按平台类型实时统计用户活跃的程序,代码框架如下。 DataStream<String> sourceStream = env .addSource(new FlinkKafkaConsumer011<>( // ... )); DataStream<U...原创 2019-10-27 23:01:48 · 4027 阅读 · 1 评论 -
探究Flink on YARN模式下TaskManager的内存分配
一个问题我们使用如下的参数提交了Flink on YARN作业(per-job模式)。/opt/flink-1.9.0/bin/flink run \--detached \--jobmanager yarn-cluster \--yarnname "x.y.z" \--yarnjobManagerMemory 2048 \--yarntaskManagerMemor...原创 2019-10-22 23:43:22 · 1741 阅读 · 1 评论 -
Flink Redis Sink用法与支持过期时间的改进
Flink默认提供了很多开箱即用的连接器,比如与Kafka、RabbitMQ、HDFS、ElasticSearch等对接的连接器。还有一些不那么常用的连接器则由Apache Bahir项目(官网很简陋,见这里)来提供,其中就包含Redis Sink。这个项目的文档有点缺乏,本文先记录一下用法。引入如下Maven依赖。目前bahir-flink项目比较停滞,最新版本是1.1-SNA...原创 2019-10-12 22:05:51 · 3124 阅读 · 1 评论 -
浅谈Flink基于RocksDB的增量检查点机制
Flink之所以能够做到高效而准确的有状态流式处理,核心是依赖于检查点(checkpoint)机制。当流式程序运行出现异常时,能够从最近的一个检查点恢复,从而最大限度地保证数据不丢失也不重复。Flink检查点本质上是通过异步屏障快照(asychronous barrier snapshot, ABS)算法产生的全局状态快照,一般是存储在分布式文件系统(如HDFS)上。但是,如果状...原创 2019-10-07 22:17:06 · 3601 阅读 · 0 评论 -
使用Prometheus+Grafana监控Flink on YARN作业
实时作业要保证7 x 24运行,除了要在业务逻辑和编码上下功夫之外,好的监控系统也是必不可少的。Flink支持多种汇报监控指标(metrics)的reporter,如JMX、SLF4J、InfluxDB、Prometheus等。Prometheus+Grafana是目前相当流行的监控+可视化一体方案,容易上手。下图示出Prometheus及其周边组件组成的生态系统。...原创 2019-09-28 22:57:42 · 3771 阅读 · 3 评论 -
两阶段提交(2PC)与其在Flink exactly once中的应用
前言简书快正式从小黑屋里出来了,所以是时候重启更新了。这段时间积攒了不少要写的东西,逐个击破吧。两阶段提交(two-phase commit, 2PC)是最基础的分布式一致性协议,应用广泛。本文来介绍它的相关细节以及它在Flink中的典型应用场景。2PC简介先介绍两个前置概念。在分布式系统中,为了让每个节点都能够感知到其他节点的事务执行状况,需要引入一个中心节点来统一处理所...原创 2019-09-26 21:19:15 · 1408 阅读 · 2 评论 -
Flink on YARN时,如何确定TaskManager数
答案写在最前面:Job的最大并行度除以每个TaskManager分配的任务槽数。问题在Flink 1.5 Release Notes中,有这样一段话,直接上截图。这说明从1.5版本开始,Flink on YARN时的容器数量——亦即TaskManager数量——将由程序的并行度自动推算,也就是说flink run脚本的-yn/--yarncontainer参数不...原创 2019-08-25 23:40:18 · 2751 阅读 · 0 评论