Stream Processing with Apache Flink | 学习笔记(二)

简介: 快速学习 Stream Processing with Apache Flink

开发者学堂课程【开源 Flink 极客训练营Stream Processing with Apache Flink】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/760/detail/13338


Stream Processing with Apache Flink


二、DataStream API 概览

1、Flink API 逻辑层次

图片2.png

在旧版本的 Flink 里开发的 API 层次是遵循四层的关系,最上层可以用一种相对而言比较高级的 API 或者是声名程度更高的 Table API 、SQL 来编写逻辑,所有的 SQL、Table、 API 编写的内容都会被内部的翻译,还有优化成一个用 DataStream API 编写的程序,再进一步 Streaming API 的程序会被表示成为一系列transformations,最终 transformations 会被翻译成 JobGraph 可以理解成 DAG 形式,在较新版本 Flink 中发生了一些改变,主要的改变是体现在 Table 、API、SQL,不再会被翻译成DataStream API 的程序,而是直接到达底层 transformations 的形式,DataStream API 和 Table、API、SQL从下层和上层的关系变为平级的关系,流程上的简化也相应地带来一些好处,如果在阅读源码的时候可以关注一下。重点是 Streaming API 。

2、DataStream API 示例

public static void datastream() throws Exception {

//1、获取运行环境

StreamExecutionEnvironment e=StreamExecutionEnvironment. getExecutionEnvironment());

//2、设置source读取数据

Datastream source=e.addsource(

newFromElementsFunction<>(Types.INT.createSerializer(e.getConfig()),data),Types.INT);

//3、对数据进行一系列转换

DataStream ds=source.map(v->v*2).keyBy(value-> 1).sum(0);

//4、将数据写入Sink

ds.addsink(new PrintsinkFunction<>());

//5、提交执行

e.execute();

}

图片3.png

 

数字乘以二累加的工作,如果把它放到 flash 里面,它的基本的代码就是这样子,可以看出来相对而言要稍微的复杂,比起单机的示例而言要稍微的复杂一点,一步一步的进行讲解,首先第一步要用 Flink 在上面去做开发,一定要获取一个相应的运行环境,比如 Stream Environment,获取环境之后可以调用环境的 Source 方法来为整个的逻辑添加最初始数据源的输入。设置完数据源之后可以拿到数据源的引用,也是 Source 对象可以调用一系列的转化方法来对 Source 中的数据进行一系列的转化,转化是把所有的数字都乘以二,乘以二之后为了求和需要进行一个分组,分组相当于后面返回的一个常数,表示的含义是把所有的数据都分到一组里,最后再对组里所有的数据,按照第一个字段,因为数据里就一个字段是一个类型的一组数进行累加,最终得到结果。得到结果之后不能简单的像单机程序拿到最后的结果把它输出,而是需要在整个的逻辑里面加一个相当于输出一个 Sink 然后把所有的数据写到目标当中,在这些工作进行完之后一定要显示的去调用 environment 里面 SQ 的方法,然后把所有上边编写的逻辑统一提交到远程或者本地的集群上执行。用Flink 的 DataStream API 编写程序和单机程序最大的不同在于前几步的过程都不会触发2、3、4,都不会实际的去触发数据的计算,而是只有在最后一步才可以提交,前面其实是在绘制 DAG 图,前面所有的步骤可以想象成为不停绘图的过程,整个逻辑的 DAG 图绘制完成之后,可以调用 SQ 的方法,整个图作为整体提交上执行。可以把前面介绍的编程风格的 API 还有 DAG 图联系在一起。

3、Flink 作业产生过程

图片4.png

 

具体的产生过程比较复杂,要经过一步一步的转换还有优化等等措施,Flink 作业产生过程的图现在不用看懂里边的每一步代表了什么,只是对于感兴趣的同学可以把图当成一个脉络梳理,对阅读源码有帮助,比如想看任务是怎么产生的可以对照图里每一块,去源码中找对应的类来观察整个作业的生成过程。

4、DataStream 转换操作

图片5.png

DataStream API 里提供的一些转换操作,像在示例代码中所看到每一个 DataStream 的对象,在调用相应方法的时候相当于都会产生一个新的转化,新的转换对应的某一个新的算子,然后把算子添加到已有的逻辑 DAG 图中,相当于添加一条边来指向现有最后的一个节点,采取不停的去扩展图的方式,所有的 API 调动它的时候,都会产生一个新的对象,可以在新的对象上继续调用它的转换方法链式的方式,一步一步的去把图画出来,涉及到高阶函数的思想,每调用一个 DataStream 上的转换的时候都需要给它传递的一个参数,它里边的 function ,转换决定对于数据进行怎样的操作,实际传递的函数包在算子里面,函数实际上决定了转换操作具体要去怎样完成。除了左边列出来这些 API , Flink、 DataStream 、API里面还有两个非常重要的点是 ProcessFunction 和 CoProcessFunction ,作为最底层的处理逻辑提供给用户使用,所有左侧蓝色涉及的转换,理论上来都可以用底层的 ProcessFunction 还有CoProcess Function 去完成,可以对照着图去梳理中间的转换,主要是理解一下每一个转化实际上都是对数据进行怎样的操作。然后可以去官网上查阅 DataStream、API、Operator 相关文档,看一下每一个转换的具体说明。

5、数据分区(Shuffle)

图片6.png

数据分区在传统的批处理当中对于数据 Shuffle 的操作,传统的批处理里的 Shuffle 操作相当于理牌的过程,在打牌时,拿到牌的时候基本的是把牌给理顺好,按照3、4一直到  J、Q、K 、A 的方式排列好相同的数字要放在一起,最大的好处是在出牌的时候,可以一下去找到你要出的,比如十一下就知道有三个十,可以一下都出出去,也有三个十从三个地方抽出来,这种是少数或者抽牌的方式的效率不如开始把牌分好进行统一的处理,一次性的去拿出来高效是传统的批处理的方式。流处理所有的数据全都是动态到来的,理牌的过程或者对于数据把它按照不同的数字或者花色进行分组分区的过程是动态完成,给出了一个上游,两个 A 的处理实例,下游三个 B 处理的实例,流处理当中的 Shuffle 是数据的分区, A 处理完所发出去的一条数据要把它发送到下游的哪一个处理的实例上,流处理当中 Shuffle 是数据分区的介绍。

6、分区策略

类型                          描述

dataStream.keyBy()          按照 Key 值分区

dataStream.global()         全部发往第1个实例

dataStream.broadcast()      广播

dataStream.forward()        上下游并行度一样时一对一发送

dataStream.shuffle()         随机均匀分配

dataStream.rebalance()      Round-Robin(轮流分配)

dataStream.rescale()        Local Round-Robin(本地轮流分配)

dataStream.partitionCustom() 自定义单播

DataStream 点调用 keyBy 方法之后可以把整个的数据按照一个 K 值进行分区,注意严格上来讲 keyBy 并不算是一种底层的物理分区策略,更多的可以把它想象成转换的操作,因为从 API 的角度上来看会把 DataStream 转化成一个 kid DataStream 的类型,两者所支持的操作也有所不同,可以自己去在代码里面实际的操作一下来感受区别。所有的分区策略里边,可能稍微难理解是 rescale,它涉及到上下游数据的本地性问题,和传统的 balance 是 Round-Robin 轮流分配不同的是,它会尽量的避免数据跨网络的传输。如果所有上述的这些给定的分区策略都不适用,还可以自己调用 partitionCustom 方法去自定义数据。PartitionCustom 只是一种自定义的单播,比如对于每一个数据只能指定一个下游所要发送的实例,没有办法把它复制多份发送到下游的多个实例当中。

相关实践学习
基于Hologres+Flink搭建GitHub实时数据大屏
通过使用Flink、Hologres构建实时数仓,并通过Hologres对接BI分析工具(以DataV为例),实现海量数据实时分析.
实时计算 Flink 实战课程
如何使用实时计算 Flink 搞定数据处理难题?实时计算 Flink 极客训练营产品、技术专家齐上阵,从开源 Flink功能介绍到实时计算 Flink 优势详解,现场实操,5天即可上手! 欢迎开通实时计算 Flink 版: https://cn.aliyun.com/product/bigdata/sc Flink Forward Asia 介绍: Flink Forward 是由 Apache 官方授权,Apache Flink Community China 支持的会议,通过参会不仅可以了解到 Flink 社区的最新动态和发展计划,还可以了解到国内外一线大厂围绕 Flink 生态的生产实践经验,是 Flink 开发者和使用者不可错过的盛会。 去年经过品牌升级后的 Flink Forward Asia 吸引了超过2000人线下参与,一举成为国内最大的 Apache 顶级项目会议。结合2020年的特殊情况,Flink Forward Asia 2020 将在12月26日以线上峰会的形式与大家见面。
相关文章
|
网络协议 Java
【工具】Mermaid + 大模型画流程图
最近看面试文章关于TCP三次握手和四次挥手的文章,时常会看到有类似的图去描述这样的过程。当然觉得这样的图还是蛮规范的,属于流程图的一种,是否有工具可以自动生成呢?但没有细想,昨天刷V2EX看到也有老哥发出了这样的问题。于是顺着评论区大佬的回答,我GET到了一个工具Mermaid 这里三次握手的图取自小林coding的文章
1688 0
|
传感器 Android开发 开发者
构建高效Android应用:Kotlin的协程与Flow
【4月更文挑战第26天】随着移动应用开发的不断进步,开发者寻求更简洁高效的编码方式以应对复杂多变的业务需求。在众多技术方案中,Kotlin语言凭借其简洁性和强大的功能库逐渐成为Android开发的主流选择。特别是Kotlin的协程和Flow这两个特性,它们为处理异步任务和数据流提供了强大而灵活的工具。本文将深入探讨如何通过Kotlin协程和Flow来优化Android应用性能,实现更加流畅的用户体验,并展示在实际开发中的应用实例。
Activiti7 驳回任务
Activiti7 驳回任务
1889 0
|
存储 Java 关系型数据库
Springboot AOP实现指定敏感字段数据加密 (数据加密篇 二)
Springboot AOP实现指定敏感字段数据加密 (数据加密篇 二)
2202 0
Springboot AOP实现指定敏感字段数据加密 (数据加密篇 二)
|
8月前
|
存储 人工智能 JSON
传统OCR集体阵亡!Versatile-OCR-Program:开源多语言OCR工具,精准解析表格和数学公式等复杂结构
本文解析开源OCR工具Versatile-OCR-Program的技术实现,其基于多模态融合架构实现90%以上识别准确率,支持数学公式与图表的结构化输出,为教育资料数字化提供高效解决方案。
1088 5
传统OCR集体阵亡!Versatile-OCR-Program:开源多语言OCR工具,精准解析表格和数学公式等复杂结构
|
存储 SQL 人工智能
Apache Flink 2.0:Streaming into the Future
本文整理自阿里云智能高级技术专家宋辛童、资深技术专家梅源和高级技术专家李麟在 Flink Forward Asia 2024 主会场的分享。三位专家详细介绍了 Flink 2.0 的四大技术方向:Streaming、Stream-Batch Unification、Streaming Lakehouse 和 AI。主要内容包括 Flink 2.0 的存算分离云原生化、流批一体的 Materialized Table、Flink 与 Paimon 的深度集成,以及 Flink 在 AI 领域的应用。
1480 13
Apache Flink 2.0:Streaming into the Future
|
消息中间件 SQL JSON
flink-sql(table api 编程)
table api 基本使用 tableEnvironment 和 streamTableEnvironment 注册表,临时表,持久表 Table api 和 table sql 混用 table api 和 datastream 混用 table api 的输入和输出(kafka) kafka的高级特性option
flink-sql(table api 编程)
|
数据库
数据库三层架构审计解密【数据库审计】
所谓三层体系结构,是在客户端与数据库之间加入了一个“中间层”,也叫组件层。三层架构隔离出两块区域,客户端到组件层之间称为应用层区域,组件层到数据库之间称为数据库层区域。
1851 0
|
缓存 监控 算法
Google Aviator——轻量级 Java 表达式引擎实战
Drools(JBoss Rules )是一个开源业务规则引擎,符合业内标准,速度快、效率高。业务分析师或审核人员可以利用它轻松查看业务规则,从而检验是否已编码的规则执行了所需的业务规则。
1488 0
Google Aviator——轻量级 Java 表达式引擎实战