add Flink

This commit is contained in:
罗祥
2019-11-05 21:55:01 +08:00
parent ad59022c08
commit b8b1b02be5
10 changed files with 206 additions and 41 deletions

View File

@ -110,7 +110,15 @@
## 五、Flink
TODO
1. [Flink 核心概念综述](https://github.com/heibaiying/BigData-Notes/blob/master/notes/Flink核心概念综述.md)
2. [Flink 开发环境搭建](https://github.com/heibaiying/BigData-Notes/blob/master/notes/Flink开发环境搭建.md)
3. [Flink Data Source](https://github.com/heibaiying/BigData-Notes/blob/master/notes/Flink_Data_Source.md)
4. [Flink Data Transformation](https://github.com/heibaiying/BigData-Notes/blob/master/notes/Flink_Data_Transformation.md)
4. [Flink Data Sink](https://github.com/heibaiying/BigData-Notes/blob/master/notes/Flink_Data_Sink.md)
6. [Flink 窗口模型](https://github.com/heibaiying/BigData-Notes/blob/master/notes/Flink_Windows.md)
7. [Flink 状态管理与检查点机制](https://github.com/heibaiying/BigData-Notes/blob/master/notes/Flink状态管理与检查点机制.md)
8. [Flink Standalone 集群部署](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/Flink_Standalone_Cluster.md)
## 六、HBase

View File

@ -1,11 +1,26 @@
# Flink Sink
<nav>
<a href="#一Data-Sinks">一、Data Sinks</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#11-writeAsText">1.1 writeAsText</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#12-writeAsCsv">1.2 writeAsCsv</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#13-print--printToErr">1.3 print printToErr</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#14-writeUsingOutputFormat">1.4 writeUsingOutputFormat</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#15-writeToSocket">1.5 writeToSocket</a><br/>
<a href="#二Streaming-Connectors">二、Streaming Connectors</a><br/>
<a href="#三整合-Kafka-Sink">三、整合 Kafka Sink</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#31-addSink">3.1 addSink</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#32-创建输出主题">3.2 创建输出主题</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#33-启动消费者">3.3 启动消费者</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#34-测试结果">3.4 测试结果</a><br/>
<a href="#四自定义-Sink">四、自定义 Sink</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#41-导入依赖">4.1 导入依赖</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#42-自定义-Sink">4.2 自定义 Sink</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#43-使用自定义-Sink">4.3 使用自定义 Sink</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#44-测试结果">4.4 测试结果</a><br/>
</nav>
## 一、Data Sinks
在使用 Flink 进行数据处理时,数据经 Data Source 流入,然后通过系列 Transformations 的转化,最终可以通过 Sink 将计算结果进行输出Flink Data Sinks 就是用于定义数据流最终的输出位置。Flink 提供了几个较为简单的 Sink API 用于日常的开发,具体如下:

View File

@ -5,12 +5,16 @@
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#12-基于集合构建">1.2 基于集合构建</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#13--基于-Socket-构建">1.3 基于 Socket 构建</a><br/>
<a href="#二自定义-Data-Source">二、自定义 Data Source</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#21-SourceFunction">2.1 SourceFunction</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#22-ParallelSourceFunction-和-RichParallelSourceFunction">2.2 ParallelSourceFunction 和 RichParallelSourceFunction</a><br/>
<a href="#三Streaming-Connectors">三、Streaming Connectors</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#31-内置连接器">3.1 内置连接器</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#32-整合-Kakfa">3.2 整合 Kakfa</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#33-整合测试">3.3 整合测试</a><br/>
</nav>
## 一、内置 Data Source
Flink Data Source 用于定义 Flink 程序的数据来源Flink 官方提供了多种数据获取方法,用于帮助开发者简单快速地构建输入流,具体如下:

View File

@ -2,13 +2,29 @@
<nav>
<a href="#一Transformations-分类">一、Transformations 分类</a><br/>
<a href="#二DataStream-Transformations">二、DataStream Transformations</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#21-Map-[DataStream-→-DataStream]">2.1 Map [DataStream → DataStream] </a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#22-FlatMap-[DataStream-→-DataStream]">2.2 FlatMap [DataStream → DataStream]</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#23-Filter-[DataStream-→-DataStream]">2.3 Filter [DataStream → DataStream]</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#24-KeyBy-和-Reduce">2.4 KeyBy 和 Reduce</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#25-Aggregations-[KeyedStream-→-DataStream]">2.5 Aggregations [KeyedStream → DataStream]</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#26-Union-[DataStream*-→-DataStream]">2.6 Union [DataStream* → DataStream]</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#27-Connect-[DataStreamDataStream-→-ConnectedStreams]">2.7 Connect [DataStream,DataStream → ConnectedStreams]</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#28-Split-和-Select">2.8 Split 和 Select</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#29-project-[DataStream-→-DataStream]">2.9 project [DataStream → DataStream]</a><br/>
<a href="#三物理分区">三、物理分区</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#31-Random-partitioning-[DataStream-→-DataStream]">3.1 Random partitioning [DataStream → DataStream]</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#32-Rebalancing-[DataStream-→-DataStream]">3.2 Rebalancing [DataStream → DataStream]</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#33-Rescaling-[DataStream-→-DataStream]">3.3 Rescaling [DataStream → DataStream]</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#34-Broadcasting-[DataStream-→-DataStream]">3.4 Broadcasting [DataStream → DataStream]</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#35-Custom-partitioning-[DataStream-→-DataStream]">3.5 Custom partitioning [DataStream → DataStream]</a><br/>
<a href="#四任务链和资源组">四、任务链和资源组</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#41-startNewChain">4.1 startNewChain</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#42-disableChaining">4.2 disableChaining</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#43-slotSharingGroup">4.3 slotSharingGroup</a><br/>
</nav>
## 一、Transformations 分类
Flink 的 Transformations 操作主要用于将一个和多个 DataStream 按需转换成新的 DataStream。它主要分为以下三类

View File

@ -9,6 +9,8 @@
<a href="#三Count-Windows">三、Count Windows</a><br/>
</nav>
## 一、窗口概念
在大多数场景下我们需要统计的数据流都是无界的因此我们无法等待整个数据流终止后才进行统计。通常情况下我们只需要对某个时间范围或者数量范围内的数据进行统计分析如每隔五分钟统计一次过去一小时内所有商品的点击量或者每发生1000次点击后都去统计一下每个商品点击率的占比。在 Flink 中,我们使用窗口 (Window) 来实现这类功能。按照统计维度的不同Flink 中的窗口可以分为 时间窗口 (Time Windows) 和 计数窗口 (Count Windows) 。

View File

@ -3,6 +3,8 @@
<nav>
<a href="#一安装-Scala-插件">一、安装 Scala 插件</a><br/>
<a href="#二Flink-项目初始化">二、Flink 项目初始化</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#21-使用官方脚本构建">2.1 使用官方脚本构建</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#22-使用-IDEA-构建">2.2 使用 IDEA 构建</a><br/>
<a href="#三项目结构">三、项目结构</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#31-项目结构">3.1 项目结构</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#32-主要依赖">3.2 主要依赖</a><br/>
@ -12,6 +14,8 @@
<a href="#五使用-Scala-Shell">五、使用 Scala Shell</a><br/>
</nav>
## 一、安装 Scala 插件
Flink 分别提供了基于 Java 语言和 Scala 语言的 API ,如果想要使用 Scala 语言来开发 Flink 程序,可以通过在 IDEA 中安装 Scala 插件来提供语法提示,代码高亮等功能。打开 IDEA , 依次点击 `File => settings => plugins` 打开插件安装页面,搜索 Scala 插件并进行安装,安装完成后,重启 IDEA 即可生效。

View File

@ -1,4 +1,22 @@
# Flink 核心概念综述
<nav>
<a href="#一Flink-简介">一、Flink 简介</a><br/>
<a href="#二Flink-核心架构">二、Flink 核心架构</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#21-API--Libraries-层">2.1 API & Libraries 层</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#22-Runtime-核心层">2.2 Runtime 核心层</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#23-物理部署层">2.3 物理部署层</a><br/>
<a href="#三Flink-分层-API">三、Flink 分层 API</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#31-SQL--Table-API">3.1 SQL & Table API</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#32-DataStream--DataSet-API">3.2 DataStream & DataSet API</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#33-Stateful-Stream-Processing">3.3 Stateful Stream Processing</a><br/>
<a href="#四Flink-集群架构">四、Flink 集群架构</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#41--核心组件">4.1 核心组件</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#42--Task--SubTask">4.2 Task & SubTask</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#43--资源管理">4.3 资源管理</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#44-组件通讯">4.4 组件通讯</a><br/>
<a href="#五Flink-的优点">五、Flink 的优点</a><br/>
</nav>
## 一、Flink 简介
@ -8,17 +26,26 @@ Apache Flink 诞生于柏林工业大学的一个研究性项目,原名 Strato
Flink 有界数据流和无界数据流:
![flink-bounded-unbounded](D:\BigData-Notes\pictures\flink-bounded-unbounded.png)
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/flink-bounded-unbounded.png"/> </div>
Spark Streaming 数据流的拆分:
![streaming-flow](D:\BigData-Notes\pictures\streaming-flow.png)
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/streaming-flow.png"/> </div>
## 二、Flink 核心架构
Flink 采用分层的架构设计,从而保证各层在功能和职责上的清晰。如下图所示,由上而下分别是 API & Libraries 层、Runtime 核心层以及物理部署层:
![flink-stack](D:\BigData-Notes\pictures\flink-stack.png)
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/flink-stack.png"/> </div>
### 2.1 API & Libraries 层
@ -39,7 +66,10 @@ Flink 的物理部署层,用于支持在不同平台上部署运行 Flink 应
在上面介绍的 API & Libraries 这一层Flink 又进行了更为具体的划分。具体如下:
![flink-api-stack](D:\BigData-Notes\pictures\flink-api-stack.png)
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/flink-api-stack.png"/> </div>
按照如上的层次结构API 的一致性由下至上依次递增,接口的表现能力由下至上依次递减,各层的核心功能如下:
@ -66,7 +96,10 @@ Stateful Stream Processing 是最低级别的抽象,它通过 Process Function
- **Dispatcher**:负责接收客户端提交的执行程序,并传递给 JobManager 。除此之外,它还提供了一个 WEB UI 界面,用于监控作业的执行情况。
- **ResourceManager** :负责管理 slots 并协调集群资源。ResourceManager 接收来自 JobManager 的资源请求,并将存在空闲 slots 的 TaskManagers 分配给 JobManager 执行任务。Flink 基于不同的部署平台,如 YARN , MesosK8s 等提供了不同的资源管理器,当 TaskManagers 没有足够的 slots 来执行任务时,它会向第三方平台发起会话来请求额外的资源。
![flink-application-submission](D:\BigData-Notes\pictures\flink-application-submission.png)染病
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/flink-application-submission.png"/> </div>
染病
@ -76,7 +109,10 @@ Stateful Stream Processing 是最低级别的抽象,它通过 Process Function
在执行分布式计算时Flink 将可以链接的操作 (operators) 链接到一起,这就是 Task。之所以这样做 是为了减少线程间切换和缓冲而导致的开销,在降低延迟的同时可以提高整体的吞吐量。 但不是所有的 operator 都可以被链接,如下 keyBy 等操作会导致网络 shuffle 和重分区,因此其就不能被链接,只能被单独作为一个 Task。 简单来说,一个 Task 就是一个可以链接的最小的操作链 (Operator Chains) 。如下图source 和 map 算子被链接到一块,因此整个作业就只有三个 Task
![flink-task-subtask](D:\BigData-Notes\pictures\flink-task-subtask.png)
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/flink-task-subtask.png"/> </div>
解释完 Task ,我们在解释一下什么是 SubTask其准确的翻译是 *A subtask is one parallel slice of a task*,即一个 Task 可以按照其并行度拆分为多个 SubTask。如上图source & map 具有两个并行度KeyBy 具有两个并行度Sink 具有一个并行度,因此整个虽然只有 3 个 Task但是却有 5 个 SubTask。Jobmanager 负责定义和拆分这些 SubTask并将其交给 Taskmanagers 来执行,每个 SubTask 都是一个单独的线程。
@ -84,17 +120,26 @@ Stateful Stream Processing 是最低级别的抽象,它通过 Process Function
理解了 SubTasks ,我们再来看看其与 Slots 的对应情况。一种可能的分配情况如下:
![flink-tasks-slots](D:\BigData-Notes\pictures\flink-tasks-slots.png)
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/flink-tasks-slots.png"/> </div>
这时每个 SubTask 线程运行在一个独立的 TaskSlot 它们共享所属的 TaskManager 进程的TCP 连接(通过多路复用技术)和心跳信息 (heartbeat messages),从而可以降低整体的性能开销。此时看似是最好的情况,但是每个操作需要的资源都是不尽相同的,这里假设该作业 keyBy 操作所需资源的数量比 Sink 多很多 ,那么此时 Sink 所在 Slot 的资源就没有得到有效的利用。
基于这个原因Flink 允许多个 subtasks 共享 slots即使它们是不同 tasks 的 subtasks但只要它们来自同一个 Job 就可以。假设上面 souce & map 和 keyBy 的并行度调整为 6而 Slot 的数量不变,此时情况如下:
![flink-subtask-slots](D:\BigData-Notes\pictures\flink-subtask-slots.png)
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/flink-subtask-slots.png"/> </div>
可以看到一个 Task Slot 中运行了多个 SubTask 子任务,此时每个子任务仍然在一个独立的线程中执行,只不过共享一组 Sot 资源而已。那么 Flink 到底如何确定一个 Job 至少需要多少个 Slot 呢Flink 对于这个问题的处理很简单,默认情况一个 Job 所需要的 Slot 的数量就等于其 Operation 操作的最高并行度。如下, ABD 操作的并行度为 4而 CE 操作的并行度为 2那么此时整个 Job 就需要至少四个 Slots 来完成。通过这个机制Flink 就可以不必去关心一个 Job 到底会被拆分为多少个 Tasks 和 SubTasks。
![flink-task-parallelism](D:\BigData-Notes\pictures\flink-task-parallelism.png)
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/flink-task-parallelism.png"/> </div>
@ -102,7 +147,10 @@ Stateful Stream Processing 是最低级别的抽象,它通过 Process Function
Flink 的所有组件都基于 Actor System 来进行通讯。Actor system是多种角色的 actor 的容器,它提供调度,配置,日志记录等多种服务,并包含一个可以启动所有 actor 的线程池,如果 actor 是本地的,则消息通过共享内存进行共享,但如果 actor 是远程的,则通过 RPC 的调用来传递消息。
![flink-process](D:\BigData-Notes\pictures\flink-process.png)
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/flink-process.png"/> </div>
## 五、Flink 的优点

View File

@ -1,10 +1,29 @@
# Flink 状态管理
<nav>
<a href="#一状态分类">一、状态分类</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#21-算子状态">2.1 算子状态</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#22-键控状态">2.2 键控状态</a><br/>
<a href="#二状态编程">二、状态编程</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#21-键控状态">2.1 键控状态</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#22-状态有效期">2.2 状态有效期</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#23-算子状态">2.3 算子状态</a><br/>
<a href="#三检查点机制">三、检查点机制</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#31-CheckPoints">3.1 CheckPoints</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#32-开启检查点">3.2 开启检查点</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#33-保存点机制">3.3 保存点机制</a><br/>
<a href="#四状态后端">四、状态后端</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#41-状态管理器分类">4.1 状态管理器分类</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#42-配置方式">4.2 配置方式</a><br/>
</nav>
## 一、状态分类
相对于其他流计算框架Flink 一个比较重要的特性就是其支持有状态计算。即你可以将中间的计算结果进行保存,并提供给后续的计算使用:
![flink-stateful-stream](D:\BigData-Notes\pictures\flink-stateful-stream.png)
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/flink-stateful-stream.png"/> </div>
具体而言Flink 又将状态 (State) 分为 Keyed State 与 Operator State
@ -12,13 +31,17 @@
算子状态 (Operator State):顾名思义,状态是和算子进行绑定的,一个算子的状态不能被其他算子所访问到。官方文档上对 Operator State 的解释是:*each operator state is bound to one parallel operator instance*,所以更为确切的说一个算子状态是与一个并发的算子实例所绑定的,即假设算子的并行度是 2那么其应有两个对应的算子状态
![flink-operator-state](D:\BigData-Notes\pictures\flink-operator-state.png)
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/flink-operator-state.png"/> </div>
### 2.2 键控状态
键控状态 (Keyed State) :是一种特殊的算子状态,即状态是根据 key 值进行区分的Flink 会为每类键值维护一个状态实例。如下图所示,每个颜色代表不同 key 值,对应四个不同的状态实例。需要注意的是键控状态只能在 `KeyedStream` 上进行使用,我们可以通过 `stream.keyBy(...)` 来得到 `KeyedStream`
![flink-keyed-state](D:\BigData-Notes\pictures\flink-keyed-state.png)
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/flink-keyed-state.png"/> </div>
## 二、状态编程
@ -95,7 +118,9 @@ env.execute("Managed Keyed State");
输出如下结果如下:
![flink-state-management](D:\BigData-Notes\pictures\flink-state-management.png)
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/flink-state-management.png"/> </div>
### 2.2 状态有效期
@ -207,11 +232,15 @@ env.execute("Managed Keyed State");
此时输出如下:
![flink-operator-state-para1](D:\BigData-Notes\pictures\flink-operator-state-para1.png)
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/flink-operator-state-para1.png"/> </div>
在上面的调用代码中,我们将程序的并行度设置为 1可以看到三次输出中状态实例的 hashcode 全是一致的,证明它们都同一个状态实例。假设将并行度设置为 2此时输出如下
![flink-operator-state-para2](D:\BigData-Notes\pictures\flink-operator-state-para2.png)
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/flink-operator-state-para2.png"/> </div>
可以看到此时两次输出中状态实例的 hashcode 是不一致的,代表它们不是同一个状态实例,这也就是上文提到的,一个算子状态是与一个并发的算子实例所绑定的。同时这里只输出两次,是因为在并发处理的情况下,线程 1 可能拿到 5 个非正常值,线程 2 可能拿到 4 个非正常值,因为要大于 3 次才能输出,所以在这种情况下就会出现只输出两条记录的情况,所以需要将程序的并行度设置为 1。
@ -221,7 +250,9 @@ env.execute("Managed Keyed State");
为了使 Flink 的状态具有良好的容错性Flink 提供了检查点机制 (CheckPoints) 。通过检查点机制Flink 定期在数据流上生成 checkpoint barrier ,当某个算子收到 barrier 时,即会基于当前状态生成一份快照,然后再将该 barrier 传递到下游算子,下游算子接收到该 barrier 后,也基于当前状态生成一份快照,依次传递直至到最后的 Sink 算子上。当出现异常后Flink 就可以根据最近的一次的快照数据将所有算子恢复到先前的状态。
![flink-stream-barriers](D:\BigData-Notes\pictures\flink-stream-barriers.png)
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/flink-stream-barriers.png"/> </div>
@ -266,7 +297,9 @@ bin/flink savepoint :jobId [:targetDirectory]
默认情况下,所有的状态都存储在 JVM 的堆内存中,在状态数据过多的情况下,这种方式很有可能导致内存溢出,因此 Flink 该提供了其它方式来存储状态数据,这些存储方式统一称为状态后端 (或状态管理器)
![flink-checkpoints-backend](D:\BigData-Notes\pictures\flink-checkpoints-backend.png)
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/flink-checkpoints-backend.png"/> </div>
主要有以下三种:

View File

@ -1,4 +1,21 @@
# Flink Standalone Cluster
<nav>
<a href="#一部署模式">一、部署模式</a><br/>
<a href="#二单机模式">二、单机模式</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#21-安装部署">2.1 安装部署</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#22-作业提交">2.2 作业提交</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#23-停止作业">2.3 停止作业</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#24-停止-Flink">2.4 停止 Flink </a><br/>
<a href="#三Standalone-Cluster">三、Standalone Cluster</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#31-前置条件">3.1 前置条件</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#32-搭建步骤">3.2 搭建步骤</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#33-可选配置">3.3 可选配置</a><br/>
<a href="#四Standalone-Cluster-HA">四、Standalone Cluster HA</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#41-前置条件">4.1 前置条件</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#42-搭建步骤">4.2 搭建步骤</a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#43-常见异常">4.3 常见异常</a><br/>
</nav>
## 一、部署模式
@ -32,7 +49,9 @@ bin/start-cluster.sh
Flink 提供了 WEB 界面用于直观的管理 Flink 集群,访问端口为 `8081`
![flink-dashboard](D:\BigData-Notes\pictures\flink-dashboard.png)
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/flink-dashboard.png"/> </div>
Flink 的 WEB UI 界面支持大多数常用功能,如提交作业,取消作业,查看各个节点运行情况,查看作业执行情况等,大家可以在部署完成后,进入该页面进行详细的浏览。
@ -64,11 +83,15 @@ a a b b c c c a e
可以通过 WEB UI 的控制台查看作业统运行情况:
![flink-socket-wordcount](D:\BigData-Notes\pictures\flink-socket-wordcount.png)
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/flink-socket-wordcount.png"/> </div>
也可以通过 WEB 控制台查看到统计结果:
![flink-socket-wordcount-stdout](D:\BigData-Notes\pictures\flink-socket-wordcount-stdout.png)
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/flink-socket-wordcount-stdout.png"/> </div>
### 2.3 停止作业
@ -99,15 +122,15 @@ bin/stop-cluster.sh
## 、Standalone Cluster
## 、Standalone Cluster
Standalone Cluster 模式是 Flink 自带的一种集群模式,具体配置步骤如下:
### 2.1 前置条件
### 3.1 前置条件
使用该模式前,需要确保所有服务器间都已经配置好 SSH 免密登录服务。这里我以三台服务器为例,主机名分别为 hadoop001hadoop002hadoop003 , 其中 hadoop001 为 master 节点,其余两台为 slave 节点,搭建步骤如下:
### 2.2 搭建步骤
### 3.2 搭建步骤
修改 `conf/flink-conf.yaml` 中 jobmanager 节点的通讯地址为 hadoop001:
@ -137,11 +160,13 @@ bin/start-cluster.sh
此时控制台输出如下:
![flink-start-cluster-shell](D:\BigData-Notes\pictures\flink-start-cluster-shell.png)
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/flink-start-cluster-shell.png"/> </div>
启动完成后可以使用 `Jps` 命令或者通过 WEB 界面来查看是否启动成功。
### 2.3 可选配置
### 3.3 可选配置
除了上面介绍的 *jobmanager.rpc.address* 是必选配置外Flink h还支持使用其他可选参数来优化集群性能主要如下
@ -153,11 +178,11 @@ bin/start-cluster.sh
更多配置可以参考 Flink 的官方手册:[Configuration](https://ci.apache.org/projects/flink/flink-docs-release-1.9/ops/config.html)
## 、Standalone Cluster HA
## 、Standalone Cluster HA
上面我们配置的 Standalone 集群实际上只有一个 JobManager此时是存在单点故障的所以官方提供了 Standalone Cluster HA 模式来实现集群高可用。
### 3.1 前置条件
### 4.1 前置条件
在 Standalone Cluster HA 模式下,集群可以由多个 JobManager但只有一个处于 active 状态其余的则处于备用状态Flink 使用 ZooKeeper 来选举出 Active JobManager并依赖其来提供一致性协调服务所以需要预先安装 ZooKeeper 。
@ -166,7 +191,7 @@ bin/start-cluster.sh
+ [Hadoop 集群环境搭建](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/Hadoop集群环境搭建.md)
+ [Zookeeper 单机环境和集群环境搭建](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/Zookeeper单机环境和集群环境搭建.md)
### 3.2 搭建步骤
### 4.2 搭建步骤
修改 `conf/flink-conf.yaml` 文件,增加如下配置:
@ -198,15 +223,19 @@ bin/start-cluster.sh
此时输出如下:
![flink-standalone-cluster-ha](D:\BigData-Notes\pictures\flink-standalone-cluster-ha.png)
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/flink-standalone-cluster-ha.png"/> </div>
可以看到集群已经以 HA 的模式启动,此时还需要在各个节点上使用 `jps` 命令来查看进程是否启动成功,正常情况如下:
![flink-standalone-cluster-jps](D:\BigData-Notes\pictures\flink-standalone-cluster-jps.png)
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/flink-standalone-cluster-jps.png"/> </div>
只有 hadoop001 和 hadoop002 的 JobManager 进程hadoop002 和 hadoop003 上的 TaskManager 进程都已经完全启动,才表示 Standalone Cluster HA 模式搭建成功。
### 3.3 常见异常
### 4.3 常见异常
如果进程没有启动,可以通过查看 `log` 目录下的日志来定位错误,常见的一个错误如下:
@ -226,7 +255,9 @@ the classpath/dependencies.
可以看到是因为在 classpath 目录下找不到 Hadoop 的相关依赖,此时需要检查是否在环境变量中配置了 Hadoop 的安装路径,如果路径已经配置但仍然存在上面的问题,可以从 [Flink 官网](https://flink.apache.org/downloads.html)下载对应版本的 Hadoop 组件包:
![flink-optional-components](D:\BigData-Notes\pictures\flink-optional-components.png)
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/flink-optional-components.png"/> </div>
下载完成后,将该 JAR 包上传至**所有** Flink 安装目录的 `lib` 目录即可。

View File

@ -19,33 +19,37 @@
1. [Spark 开发环境搭建](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/Spark开发环境搭建.md)
2. [基于 Zookeeper 搭建 Spark 高可用集群](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/Spark集群环境搭建.md)
### 四、Storm
### 四、Flink
1. [Flink Standalone 集群部署](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/Flink_Standalone_Cluster.md)
### 五、Storm
1. [Storm 单机环境搭建](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/Storm单机环境搭建.md)
2. [Storm 集群环境搭建](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/Storm集群环境搭建.md)
### 、HBase
### 、HBase
1. [HBase 单机环境搭建](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/HBase单机环境搭建.md)
2. [HBase 集群环境搭建](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/HBase集群环境搭建.md)
### 、Flume
### 、Flume
1. [Linux 环境下 Flume 的安装部署](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/Linux下Flume的安装.md)
### 、Azkaban
### 、Azkaban
1. [Azkaban3.x 编译及部署](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/Azkaban_3.x_编译及部署.md)
### 、Hive
### 、Hive
1. [Linux 环境下 Hive 的安装部署](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/Linux环境下Hive的安装部署.md)
### 、Zookeeper
### 、Zookeeper
1. [Zookeeper 单机环境和集群环境搭建](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/Zookeeper单机环境和集群环境搭建.md)
### 十、Kafka
### 十、Kafka
1. [基于 Zookeeper 搭建 Kafka 高可用集群](https://github.com/heibaiying/BigData-Notes/blob/master/notes/installation/基于Zookeeper搭建Kafka高可用集群.md)