Stream Processing with Apache Flink | 学习笔记

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
简介: 快速学习 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轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
Linux入门到精通
本套课程是从入门开始的Linux学习课程,适合初学者阅读。由浅入深案例丰富,通俗易懂。主要涉及基础的系统操作以及工作中常用的各种服务软件的应用、部署和优化。即使是零基础的学员,只要能够坚持把所有章节都学完,也一定会受益匪浅。
相关文章
|
10天前
|
监控 大数据 Java
使用Apache Flink进行大数据实时流处理
Apache Flink是开源流处理框架,擅长低延迟、高吞吐量实时数据流处理。本文深入解析Flink的核心概念、架构(包括客户端、作业管理器、任务管理器和数据源/接收器)和事件时间、窗口、状态管理等特性。通过实战代码展示Flink在词频统计中的应用,讨论其实战挑战与优化。Flink作为大数据处理的关键组件,将持续影响实时处理领域。
68 5
|
11天前
|
数据采集 关系型数据库 MySQL
使用Apache Flink实现MySQL数据读取和写入的完整指南
使用Apache Flink实现MySQL数据读取和写入的完整指南
使用Apache Flink实现MySQL数据读取和写入的完整指南
|
15天前
|
消息中间件 Kafka 数据处理
Apache Flink:流式数据处理的强大引擎
【6月更文挑战第8天】Apache Flink是开源的流处理框架,专注于高效、低延迟的无界和有界数据流处理。它提供统一编程模型,支持实时与批量数据。核心概念包括DataStreams、DataSets、时间语义和窗口操作。使用Flink涉及环境设置、数据源配置(如Kafka)、数据转换(如map、filter)、窗口聚合及数据输出。通过丰富API和灵活时间语义,Flink适于构建复杂流处理应用,在实时数据处理领域具有广阔前景。
|
6天前
|
消息中间件 Oracle 关系型数据库
实时计算 Flink版操作报错合集之连接RabbitMQ时遇到Could not find any factory for identifier 'rabbitmq' that implements 'org.apache.flink.table.factories.DynamicTableFactory'错误,该怎么办
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
259 0
|
6天前
|
Kubernetes Oracle 关系型数据库
实时计算 Flink版操作报错合集之用dinky在k8s上提交作业,会报错:Caused by: org.apache.flink.table.api.ValidationException:,是什么原因
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
6天前
|
消息中间件 Java Kafka
实时计算 Flink版操作报错合集之从hudi读数据,报错NoSuchMethodError:org.apache.hudi.format.cow.vector.reader.PaequetColumnarRowSplit.getRecord(),该怎么办
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
6天前
|
Oracle 关系型数据库 Shell
实时计算 Flink版操作报错合集之遇到报错:Error: Could not find or load main class org.apache.flink.cdc.cli.CliFrontend,是什么导致的
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
SQL 架构师 API
《Apache Flink 知其然,知其所以然》系列视频课程
# 课程简介 目前在我的公众号新推出了《Apache Flink 知其然,知其所以然》的系列视频课程。在内容上会先对Flink整体架构和所适用的场景做一个基础介绍,让你对Flink有一个整体的认识!然后对核心概念进行详细介绍,让你深入了解流计算中一些核心术语的含义,然后对Flink 各个层面的API,如 SQL/Table&DataStreamAPI/PythonAPI 进行详细的介绍,以及
1312 0
《Apache Flink 知其然,知其所以然》系列视频课程
|
1月前
|
消息中间件 Java Kafka
实时计算 Flink版操作报错之Apache Flink中的SplitFetcher线程在读取数据时遇到了未预期的情况,该怎么解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
24天前
|
数据处理 Apache 流计算

推荐镜像

更多