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、并行计算和 DAG

图片1.png

对于计算密集型或者数据密集型需要计算量比较大的工作,并行计算或者分而治之的思想,是解决这一类问题非常有效的手段,手段中比较关键的一部分是如何对于已有任务的划分,或者对于已有计算资源的分配。假设有很多份试卷要交给几个同学协助批阅,卷子里面一共有 A、B、C 三个题,可以考虑合作的方式是将所有同学试卷的三个题分别交给不同的人来进行批阅,也是把原来的一份试卷批阅任务拆成对于题 A 、题 B 和题 C 三个子问题的分配,这种方式每一个同学在批完自己的题之后,可以把试卷想象成计算中的数据传递给下一个同学,下一个同学批完了之后还可以继续往下传,以此来达到类似于流水线的工作效果。随着同学们数量的增加,协作的困难也会越来越大,假设不同的题目有多个同学来共同的区域,比如第一个 A 题目有两个同学,题目 B 有三个同学,题目 C 只有一个同学,需要考虑怎样进一步对于计算任务做一个划分,可以把整体批卷子的同学分成三个组,第一个组负责 A ,第二个组负责 B,第三个组负责 C,第一个组的同学可以对于所有的卷子按照试卷进行划分,A 组里第一个同学批一半的卷子,第二个同学批剩下的另一份卷子,分别批完了之后再将自己手里的试卷传递给下一个组,这是对于试卷本身题目的一种划分,还有批阅的试卷本体的划分,是计算的并行性还有数据的并行性。同学互相协作如果把它表示成图的形式就是一个类似于有效无环图的样式,在这个图中假设第一组批阅 A 题目的同学还承担了一些额外的任务,需要把试卷从老师的办公室拿到批阅试卷的地点,最后 C 组的同学也有额外任务是等到所有的同学把试卷批完之后,进行总分的统计还有记录的一些工作。所以按照规则就可以把所有图中的节点,也是计算节点来划分为三个类别,第一个类别是 Source承担去获取试卷、获取数据的额外职责。中间的处理节点或者是图中的 B 不需要和外部的系统打交道,第三类的节点是 C 节点除了完成自己本身的工作,还要负责将整个计算逻辑的结果写出到某一个外部系统,把三类的节点分别称为 Source 节点, Transformation 节点还有 sink 节点,图中的节点表示计算,节点之间的边代表了计算之间的依赖关系。这是并行计算和 DAG 的相关背景知识。

2、命令式编程和声明式编程

List<Integer> data = Arrays.asList(1, 2,3,4,5,6,7,8,9,10);

问题:将 data 中的每条数据放大一倍并求和(∑10i,2i)

命令式

public static int imperative() {

List<Integer> templist = new ArrayList<>();

for (int v : data){

tempList.add(v *2);

}

int result = 0;

for (int v : templist) {

result += v;

}

return result;

}

声明式

public static int declarative() {

return data.stream().mapToInt(v -> v * 2).sum();

}

SELECT SUM(2 * value) FROM data

假设有一个简单的问题给大家一个数据集,数据集里面有从一到十,十个数字,任务是把所有的数字放大一倍,乘以二,对它们进行累积求和的操作,就像题目当中公式所表示的。拿到这个题之后可以想很多种解决办法,在编程来解决问题的时候有两类的大思想,第一类是采取命令式编程的方式,一步一步告诉机器去怎样生成一些数据结构,怎样用这些数据结构去存储一些临时的中间结果,怎样把中间结果转换成为最终的结果,相当于一步一步告诉机器如何去做。另一种思路是一种声明式的方式,和命令是最大的不同是声明式编程里面,通常只需要告诉机器去完成怎样的任务,不需要向命令式详细的去传递如何一步一步的去完成任务,像代码示例里面写的,只需要把原有的数据集转换成一个 stream, Java 代码转换成 stream,然后再把 stream 转化成一个数字类型的 stream ,并且在中间的转换的时候把每个数字乘二,最后再直接调用 sum 方法获得所有数字的和。假设是一个老板,让底下的员工机器去干活,如果机器是一个新手,需要一步一步的指导它去完成工作,第一步要怎样,第二步要怎么样,可以保证底下的员工完全按照我的意志去完成任务。但是不足之处是非常的繁琐相当于事必躬亲,需要去详细的介绍每一步需要怎样去做,第二类声明式像对于一个比较有经验的员工,去干一项工作的时候不需要说得很详细,只要告诉他去完成一件事情,就会去办。如果是更有经验一点的员工,甚至会在出现一些特殊的情况,比如某一个相关的工作人员今天不上班,可以第二天自动的去从事这个任务,最终去完成分配的目标。

(1)详细的代码示例

/**

*1.Naive

*/

public static int imoerative1(){

List<Integers templist = new ArrayListe(10);

for (int v : data) {

tempList,add(v *2);

}

int result = 0;

for (int v :templist) {

result += v;

}

return result;

}

/**

*2.In-place

*/

public static int imoerative2(){

for (int im 0; i= date.size();++i) {

data.setl1, data.get(i) * 2);

}

int result = 0;

for (int v : data){

result += v;

}

return result;

}

/**

*3.Optimized

*/

public static int imoeractive3() {

int result =8;

for (int v:data) {

result += v* 2;

}

return result;

}

/**

*4. Functional

*/

pubtic static int declarative(){ return data.stream().mapToInt(v =v*2).sum();}

//—————————————————————————————

/**

* 5. Basic DataStream API

命令式的编程方式需要每一步都详细的去指定做什么,所以有很多种办法,所谓条条大路通罗马,除了第一种方法之外还可以在原始的数据集上进行操作,不再新建一个临时的数据去存储翻倍之后的结果,直接在原始的数据集上对于每一个数据都乘以二,再进行一个累加,甚至还可以对于这个问题进行更加进一步的优化,就是直接累加而不生成任何的中间结果像3里面提示的一样,所有的方法达到的效果一样,都难计算出来题干中要求的公式效果。

对于声明式编程也一样,相对于命令式编程写起来代码量非常少,非常的容易,对于开发人员而言会更加的高效。

(2) 运行

/**

* Lesson 2 5treaning Processing with Apache Flink

*

* Cawthor xccuf

*/

public class Training2 {

private static List<Integers date - Arrays.asList(1,2,3,4,5,6,7,8, 9,10);

public static void main(string!l args) throws Exception {

System.out.println(declarative()); System.out.println(imperative1()); System.out.printn(imperative3(); I System.out.printLn(imperative2());

// data5tream();

//state()

// processingTinewindow();

}

//—————————————————————————————

运行结果

/Library/Java/JavaVirtualMachines/jdk1.8.0_101.jdk/Contents/Hone/bin/java...

110

110

110

110

Process finished with exit code 0

得到的结果完全一样,因为命令式的2会改变原始数据集的结果,所以把它放在最后来跑,以免对于其他的方法运行产生影响。

声明式编程除了写的样式之外,还有一类更常见的在操作数据库的时候 SQL 语言, SQL 语言是一个非常典型的声明式编程方式,甚至比上面给出的例子的声明程度要更高,写起代码来更加的简洁。简洁的开发方式是引擎所追求的一种效果,所以在 Flink 里的所有开发相关的 API 都比较偏向于声明式的方式。

相关实践学习
基于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日以线上峰会的形式与大家见面。
相关文章
|
2月前
|
人工智能 数据处理 API
阿里云、Ververica、Confluent 与 LinkedIn 携手推进流式创新,共筑基于 Apache Flink Agents 的智能体 AI 未来
Apache Flink Agents 是由阿里云、Ververica、Confluent 与 LinkedIn 联合推出的开源子项目,旨在基于 Flink 构建可扩展、事件驱动的生产级 AI 智能体框架,实现数据与智能的实时融合。
442 6
阿里云、Ververica、Confluent 与 LinkedIn 携手推进流式创新,共筑基于 Apache Flink Agents 的智能体 AI 未来
|
存储 Cloud Native 数据处理
从嵌入式状态管理到云原生架构:Apache Flink 的演进与下一代增量计算范式
本文整理自阿里云资深技术专家、Apache Flink PMC 成员梅源在 Flink Forward Asia 新加坡 2025上的分享,深入解析 Flink 状态管理系统的发展历程,从核心设计到 Flink 2.0 存算分离架构,并展望未来基于流批一体的通用增量计算方向。
343 0
从嵌入式状态管理到云原生架构:Apache Flink 的演进与下一代增量计算范式
|
4月前
|
SQL 人工智能 数据挖掘
Apache Flink:从实时数据分析到实时AI
Apache Flink 是实时数据处理领域的核心技术,历经十年发展,已从学术项目成长为实时计算的事实标准。它在现代数据架构中发挥着关键作用,支持实时数据分析、湖仓集成及实时 AI 应用。随着 Flink 2.0 的发布,其在流式湖仓、AI 驱动决策等方面展现出强大潜力,正推动企业迈向智能化、实时化的新阶段。
597 9
Apache Flink:从实时数据分析到实时AI
|
4月前
|
SQL 人工智能 API
Apache Flink 2.1.0: 面向实时 Data + AI 全面升级,开启智能流处理新纪元
Apache Flink 2.1.0 正式发布,标志着实时数据处理引擎向统一 Data + AI 平台迈进。新版本强化了实时 AI 能力,支持通过 Flink SQL 和 Table API 创建及调用 AI 模型,新增 Model DDL、ML_PREDICT 表值函数等功能,实现端到端的实时 AI 工作流。同时增强了 Flink SQL 的流处理能力,引入 Process Table Functions(PTFs)、Variant 数据类型,优化流式 Join 及状态管理,显著提升作业稳定性与资源利用率。
539 0
|
3月前
|
人工智能 运维 Java
Flink Agents:基于Apache Flink的事件驱动AI智能体框架
本文基于Apache Flink PMC成员宋辛童在Community Over Code Asia 2025的演讲,深入解析Flink Agents项目的技术背景、架构设计与应用场景。该项目聚焦事件驱动型AI智能体,结合Flink的实时处理能力,推动AI在工业场景中的工程化落地,涵盖智能运维、直播分析等典型应用,展现其在AI发展第四层次——智能体AI中的重要意义。
1315 27
Flink Agents:基于Apache Flink的事件驱动AI智能体框架
|
4月前
|
存储 人工智能 数据处理
对话王峰:Apache Flink 在 AI 时代的“剑锋”所向
Flink 2.0 架构升级实现存算分离,迈向彻底云原生化,支持更大规模状态管理、提升资源效率、增强容灾能力。通过流批一体与 AI 场景融合,推动实时计算向智能化演进。生态项目如 Paimon、Fluss 和 Flink CDC 构建湖流一体架构,实现分钟级时效性与低成本平衡。未来,Flink 将深化 AI Agents 框架,引领事件驱动的智能数据处理新方向。
500 6
|
4月前
|
消息中间件 存储 Kafka
Apache Flink错误处理实战手册:2年生产环境调试经验总结
本文由 Ververica 客户成功经理 Naci Simsek 撰写,基于其在多个行业 Flink 项目中的实战经验,总结了 Apache Flink 生产环境中常见的三大典型问题及其解决方案。内容涵盖 Kafka 连接器迁移导致的状态管理问题、任务槽负载不均问题以及 Kryo 序列化引发的性能陷阱,旨在帮助企业开发者避免常见误区,提升实时流处理系统的稳定性与性能。
435 0
Apache Flink错误处理实战手册:2年生产环境调试经验总结
|
SQL 大数据 Apache
Apache Flink 2021 最新入门课程 | 图谱精选课程
轻松收获 Flink 生产环境开发技能
Apache Flink 2021 最新入门课程 | 图谱精选课程
|
存储 人工智能 大数据
The Past, Present and Future of Apache Flink
本文整理自阿里云开源大数据负责人王峰(莫问)在 Flink Forward Asia 2024 上海站主论坛开场的分享,今年正值 Flink 开源项目诞生的第 10 周年,借此时机,王峰回顾了 Flink 在过去 10 年的发展历程以及 Flink社区当前最新的技术成果,最后展望下一个十年 Flink 路向何方。
795 33
The Past, Present and Future of Apache Flink

热门文章

最新文章

推荐镜像

更多