主要内容来自zhisheng大佬的课程,作为学习记录
一、实时计算的相关背景
实时计算应用
实时计算场景
离线计算 vs 实时计算
- 离线计算
- 数据量大且时间周期长(一天、一星期、一个月、半年、一年)
- 在大量数据上进行复杂的批量运算
- 数据在计算之前已经固定,不再会发生变化
- 能够方便的查询批量计算的结果
- 实时计算
- 数据实时到达
- 数据到达次序独立,不受应用系统所控制
- 数据规模大且无法预知容量
- 原始数据一经处理,除非特意保存,否则不能被再次取出处理,或者再次提取数据代价昂贵
实时计算中的流处理 vs 批处理
二、Flink基本概念
Apache Flink 是一个框架和分布式处理引擎,用于在无边界和有边界数据流上进行有状态的计算。Flink 能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算。
1. 数据集类型
任何类型的数据都可以形成一种事件流。信用卡交易、传感器测量、机器日志、网站或移动应用程序上的用户交互记录,所有这些数据都形成一种流(无界或者有界流)。
无界数据流
无界数据流就是指有始无终的数据,数据一旦开始生成就会持续不断的产生新的数据,即数据没有时间边界。无界数据流需要持续不断地处理。处理无界数据流通常要求以特定顺序摄取事件,例如事件发生的顺序,以便能够推断结果的完整性。有界数据流
有界数据流就是指输入的数据有始有终,有界数据流可以在摄取所有数据后再进行计算。有界数据流所有数据可以被排序,所以并不需要有序摄取。处理这种有界数据流的方式也被称之为批处理。
Flink中定义了两个特殊类DataSet和DataStream来表示上述两种数据,DataSet数据是有界数据流,而DataStream是无界数据流。
2. Flink数据处理方式
Apache Flink是一个面向数据流处理和批量数据处理的可分布式的开源计算框架,它基于同一个Flink流式执行模型(streaming execution model)。Flink进行流处理时认为输入数据流是无界的,批处理则被作为一种特殊的流处理,输入数据流被定义为有界。
3. Flink作业提交架构流程
Flink的架构总体来说分为以下几个部分:
Job Client
Job Manager
Task Manager
Job Client:Job Client 不是 Flink 程序执行的内部部分,但它是任务执行的起点。Job Client 负责接受用户的程序代码,然后创建数据流,将数据流提交给 Job Manager 以便进一步执行。执行完成后,Job Client 将结果返回给用户
Job Manager:主进程(也称为作业管理器)协调和管理程序的执行。它的主要职责包括安排任务、管理 checkpoint 、故障恢复等。机器集群中至少要有一个 master,master 负责调度 task、协调 checkpoints 和容灾,高可用设置的话可以有多个 master,但要保证一个是 leader,其他是 standby。Job Manager 包含 Actor system、Scheduler、Check pointing 三个重要的组件。
Task Manager:从 Job Manager 处接收需要部署的 Task。Task Manager 是在 JVM 中的一个或多个线程中执行任务的工作节点。任务执行的并行性由每个 Task Manager 上可用的任务槽(Slot 个数)决定。每个任务代表分配给任务槽的一组资源。例如,如果 Task Manager 有四个插槽,那么它将为每个插槽分配 25% 的内存。可以在任务槽中运行一个或多个线程。同一插槽中的线程共享相同的 JVM。
4. Flink API
ProcessFunctions
Process Function允许用户可以自由地处理来自一个或多个流数据的事件,并使用一致性、容错的状态。除此之外,用户可以注册事件时间和处理事件回调,从而使程序可以实现复杂的计算。DataStream/DataSet API
DataStream API为很多常用的流式计算操作提供了基元,比如窗口、记录的转换,并且通过查询外部存储来丰富event。DataSet 处理有界的数据集,DataStream 处理有界或者无界的数据流。用户可以通过各种方法将数据进行转换或者计算。Table API
Table API 是以表为中心的声明式 DSL,其中表可能会动态变化(在表达流数据时)。Table API 提供了例如 select、project、join、group-by、aggregate 等操作,使用起来却更加简洁(代码量更少)。 你可以在表与 DataStream/DataSet 之间无缝切换,也允许程序将 Table API 与 DataStream 以及 DataSet 混合使用SQL API
SQL API在语法与表达能力上与 Table API 类似,但是是以 SQL查询表达式的形式表现程序。SQL 抽象与 Table API 交互密切,同时 SQL 查询可以直接在 Table API 定义的表上执行。
5. Flink 代码逻辑
-
Source
数据输入,Flink 在流处理和批处理上的 source 大概有 4 类:基于本地集合的 source
基于文件的 source
基于网络套接字的 source
自定义的 source( 常见的有 Apache kafka、Amazon Kinesis Streams、RabbitMQ、Twitter Streaming API、Apache NiFi 等)
Transformation
数据转换的各种操作,有 Map/FlatMap/Filter/KeyBy/Reduce/Fold/ Aggregations/Window/WindowAll/Union/Window join/Split/Select/Project 等,操作很多,可以将数据转换计算成你想要的数据。Sink
数据输出,Flink 将转换计算后的数据发送的地点,Flink 常见的 Sink 大概有如下几类:写入文件、打印出来、写入 socket、自定义的 sink 。自定义的 Sink 常见的有 Apache kafka、RabbitMQ、MySQL、ElasticSearch、Apache Cassandra、Hadoop FileSystem 等。
6. Flink 部署
Flink 是支持以 Standalone、YARN、Kubernetes、Mesos、AWS、MapR、Aliyun OSS 等形式部署的。