Skip to content

Commit 0502fea

Browse files
committed
🚧 Flink
1 parent b1afd62 commit 0502fea

File tree

1 file changed

+152
-13
lines changed

1 file changed

+152
-13
lines changed

markdown-file/Flink-Install-And-Settings.md

Lines changed: 152 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -76,16 +76,16 @@ mvn archetype:generate \
7676

7777
- 四个基石:Checkpoint、State、Time、Window
7878
- 解决 exactly-once 的问题
79-
- 状态管理
8079
- 实现了 watermark 的机制,解决了基于事件时间处理时的数据乱序和数据迟到的问题
80+
- 状态管理
8181
- 提供了一套开箱即用的窗口操作,包括滚动窗口、滑动窗口、会话窗口
8282
- 我想说的,都被这篇文章说了:
8383
- <http://shiyanjun.cn/archives/1508.html>
8484
- <http://wuchong.me/blog/2018/11/09/flink-tech-evolution-introduction/>
8585
- 这里补充点其他的
8686

8787

88-
88+
```
8989
Client 用来提交任务给 JobManager,JobManager 分发任务给 TaskManager 去执行,然后 TaskManager 会心跳的汇报任务状态
9090
在 Flink 集群中,计算资源被定义为 Task Slot
9191
每个 TaskManager 会拥有一个或多个 Slots
@@ -103,14 +103,14 @@ Flink 中的计算资源通过 Task Slot 来定义。每个 task slot 代表了
103103
104104
每一个 TaskManager 会拥有一个或多个的 task slot,每个 slot 都能跑由多个连续 task 组成的一个 pipeline,比如 MapFunction 的第n个并行实例和 ReduceFunction 的第n个并行实例可以组成一个 pipeline。
105105
106-
107106
source(Streaming 进来)
108107
Transformations(Streaming 处理)
109108
sink(Streaming 出去)
110109
111110
Flink程序与生俱来的就是并行和分布式的。Streams被分割成stream patition, Operators被被分割成operator subtasks。这些subtasks在不同的机器(容器)上的不同的线程中运行,彼此独立,互不干扰。 一个操作的operator subtask的数目,被称为parallelism(并行度)。一个stream的并行度,总是等于生成它的(operator)操作的并行度。一个Flink程序中,不同的operator可能具有不同的并行度。
111+
```
112112

113-
113+
-------------------------------------------------------------------
114114

115115

116116
#### 为了容错的 Checkpoint 机制
@@ -120,8 +120,6 @@ Flink程序与生俱来的就是并行和分布式的。Streams被分割成strea
120120
- [A Deep Dive into Rescalable State in Apache Flink](https://flink.apache.org/features/2017/07/04/flink-rescalable-state.html)
121121
- [Flink 小贴士 (5): Savepoint 和 Checkpoint 的 3 个不同点](http://wuchong.me/blog/2018/11/25/flink-tips-differences-between-savepoints-and-checkpoints/)
122122
- [Flink 小贴士 (2):Flink 如何管理 Kafka 消费位点](http://wuchong.me/blog/2018/11/04/how-apache-flink-manages-kafka-consumer-offsets/)
123-
- []()
124-
- []()
125123
- Checkpoint 允许 Flink 恢复流中的状态和位置,使应用程序具有与无故障执行相同的语义
126124
- Checkpoint 是 Flink 用来从故障中恢复的机制,快照下了整个应用程序的状态,当然也包括输入源读取到的位点。如果发生故障,Flink 将通过从 Checkpoint 加载应用程序状态并从恢复的读取位点继续应用程序的处理,就像什么事情都没发生一样。
127125

@@ -144,11 +142,23 @@ Flink通过一个可配置的时间,周期性的生成checkpoint,将它写
144142
- 这里有一个核心:用到 Facebook 的 RocksDB 数据库(可嵌入式的支持持久化的 key-value 存储系统)
145143

146144

145+
-------------------------------------------------------------------
147146

148147
#### Exactly-Once
149148

150149
- 因为有了 Checkpoint,才有了 Exactly-Once
151150
- [Apache Flink 端到端(end-to-end)Exactly-Once特性概览 (翻译)](https://my.oschina.net/u/992559/blog/1819948)
151+
- 常见有这几种语义:
152+
153+
```
154+
at most once : 至多一次。可能导致消息丢失。
155+
at least once : 至少一次。可能导致消息重复。
156+
exactly once : 刚好一次。不丢失也不重复。
157+
```
158+
159+
160+
-------------------------------------------------------------------
161+
152162

153163
#### Watermark
154164

@@ -157,34 +167,163 @@ Flink通过一个可配置的时间,周期性的生成checkpoint,将它写
157167
- watermark 的作用,他们定义了何时不再等待更早的数据
158168
- WaterMark 只在时间特性 EventTime 和 IngestionTime 起作用,并且 IngestionTime 的时间等同于消息的 ingestion 时间
159169

170+
-------------------------------------------------------------------
171+
160172
#### 窗口
161173

162-
- 翻滚窗口(Tumble)
174+
- <http://wuchong.me/blog/2016/05/25/flink-internals-window-mechanism/>
163175
- [Flink 原理与实现:Window 机制](http://wuchong.me/blog/2016/05/25/flink-internals-window-mechanism/)
164176
- [Flink 原理与实现:Session Window](http://wuchong.me/blog/2016/06/06/flink-internals-session-window/)
165177

178+
##### 滚动窗口(Tumbling Windows)
166179

167-
#### 生产环境
180+
- 滚动窗口有一个固定的大小,并且不会出现重叠
168181

169-
- [Flink 小贴士 (7): 4个步骤,让 Flink 应用达到生产状态](http://wuchong.me/blog/2018/12/03/flink-tips-4-steps-flink-application-production-ready/)
182+
###### 滚动事件时间窗口
170183

184+
```
185+
input
186+
.keyBy(<key selector>)
187+
.window(TumblingEventTimeWindows.of(Time.seconds(5)))
188+
.<windowed transformation>(<window function>);
189+
```
171190

191+
- 每日偏移8小时的滚动事件时间窗口
192+
193+
```
194+
input
195+
.keyBy(<key selector>)
196+
.window(TumblingEventTimeWindows.of(Time.days(1), Time.hours(-8)))
197+
.<windowed transformation>(<window function>);
198+
```
199+
200+
###### 滚动处理时间窗口
201+
202+
```
203+
input
204+
.keyBy(<key selector>)
205+
.window(TumblingProcessingTimeWindows.of(Time.seconds(5)))
206+
.<windowed transformation>(<window function>);
207+
```
208+
209+
---------------------------------
210+
211+
##### 滑动窗口(Sliding Windows)
212+
213+
- 滑动窗口分配器将元素分配到固定长度的窗口中,与滚动窗口类似,窗口的大小由窗口大小参数来配置,另一个窗口滑动参数控制滑动窗口开始的频率。因此,滑动窗口如果滑动参数小于滚动参数的话,窗口是可以重叠的,在这种情况下元素会被分配到多个窗口中。
214+
- 例如,你有10分钟的窗口和5分钟的滑动,那么每个窗口中5分钟的窗口里包含着上个10分钟产生的数据
215+
216+
###### 滑动事件时间窗口
217+
218+
```
219+
input
220+
.keyBy(<key selector>)
221+
.window(SlidingEventTimeWindows.of(Time.seconds(10), Time.seconds(5)))
222+
.<windowed transformation>(<window function>);
223+
```
224+
225+
###### 滑动处理时间窗口
226+
227+
```
228+
input
229+
.keyBy(<key selector>)
230+
.window(SlidingProcessingTimeWindows.of(Time.seconds(10), Time.seconds(5)))
231+
.<windowed transformation>(<window function>);
232+
```
233+
234+
- 偏移8小时的滑动处理时间窗口
235+
236+
```
237+
input
238+
.keyBy(<key selector>)
239+
.window(SlidingProcessingTimeWindows.of(Time.hours(12), Time.hours(1), Time.hours(-8)))
240+
.<windowed transformation>(<window function>);
241+
```
242+
243+
---------------------------------
244+
245+
##### 计数窗口(Count Window)
246+
247+
- 根据元素个数对数据流进行分组的
248+
249+
###### 翻滚计数窗口
250+
251+
- 当我们想要每 100 个用户购买行为事件统计购买总数,那么每当窗口中填满 100 个元素了,就会对窗口进行计算,这种窗口我们称之为翻滚计数窗口(Tumbling Count Window)
252+
253+
```
254+
input
255+
.keyBy(<key selector>)
256+
.countWindow(100)
257+
.<windowed transformation>(<window function>);
258+
```
259+
260+
---------------------------------
261+
262+
263+
##### 会话窗口(Session Windows)
264+
265+
- session 窗口分配器通过 session 活动来对元素进行分组,session 窗口跟滚动窗口和滑动窗口相比,不会有重叠和固定的开始时间和结束时间的情况。相反,当它在一个固定的时间周期内不再收到元素,即非活动间隔产生,那个这个窗口就会关闭。一个 session 窗口通过一个 session 间隔来配置,这个 session 间隔定义了非活跃周期的长度。当这个非活跃周期产生,那么当前的 session 将关闭并且后续的元素将被分配到新的 session 窗口中去。
266+
267+
###### 事件时间会话窗口
268+
269+
```
270+
input
271+
.keyBy(<key selector>)
272+
.window(EventTimeSessionWindows.withGap(Time.minutes(10)))
273+
.<windowed transformation>(<window function>);
274+
```
275+
276+
###### 处理时间会话窗口
277+
278+
```
279+
input
280+
.keyBy(<key selector>)
281+
.window(ProcessingTimeSessionWindows.withGap(Time.minutes(10)))
282+
.<windowed transformation>(<window function>);
283+
```
284+
285+
---------------------------------
286+
287+
##### 全局窗口(Global Windows)
288+
289+
- 全局窗口分配器将所有具有相同 key 的元素分配到同一个全局窗口中,这个窗口模式仅适用于用户还需自定义触发器的情况。否则,由于全局窗口没有一个自然的结尾,无法执行元素的聚合,将不会有计算被执行。
290+
291+
```
292+
input
293+
.keyBy(<key selector>)
294+
.window(GlobalWindows.create())
295+
.<windowed transformation>(<window function>);
296+
```
297+
298+
-------------------------------------------------------------------
299+
300+
301+
#### 生产环境准备
302+
303+
- [Flink 小贴士 (7): 4个步骤,让 Flink 应用达到生产状态](http://wuchong.me/blog/2018/12/03/flink-tips-4-steps-flink-application-production-ready/)
304+
305+
-------------------------------------------------------------------
172306

173307

174308
#### 运行环境
175309

176310

177-
Flink 的部署
178-
Flink 有三种部署模式,分别是 Local、Standalone Cluster 和 Yarn Cluster。对于 Local 模式来说,JobManager 和 TaskManager 会公用一个 JVM 来完成 Workload。如果要验证一个简单的应用,Local 模式是最方便的。实际应用中大多使用 Standalone 或者 Yarn Cluster。下面我主要介绍下这两种模式。
311+
- Flink 的部署
312+
- Flink 有三种部署模式,分别是 Local、Standalone Cluster 和 Yarn Cluster。
313+
- 对于 Local 模式来说,JobManager 和 TaskManager 会公用一个 JVM 来完成 Workload。
314+
- 如果要验证一个简单的应用,Local 模式是最方便的。实际应用中大多使用 Standalone 或者 Yarn Cluster
179315

316+
-------------------------------------------------------------------
180317

181318
#### Flink 的 HA
182319

320+
-------------------------------------------------------------------
183321

184322
#### Monitoring REST API
185323

186324
https://ci.apache.org/projects/flink/flink-docs-stable/monitoring/rest_api.html#monitoring-rest-api
187325

326+
-------------------------------------------------------------------
188327

189328
#### 主要核心 API
190329

@@ -195,6 +334,7 @@ https://ci.apache.org/projects/flink/flink-docs-stable/monitoring/rest_api.html#
195334
- Kafka Connectors
196335
- Elasticsearch sink
197336

337+
-------------------------------------------------------------------
198338

199339
#### Table & SQL API(关系型 API)
200340

@@ -218,6 +358,5 @@ SQL API:支持标准SQL(自1.1.0版本开始)
218358
- [Flink学习笔记(4):基本概念](https://www.jianshu.com/p/0cd1db4282be)
219359
- [Apache Flink:特性、概念、组件栈、架构及原理分析](http://shiyanjun.cn/archives/1508.html)
220360
- [Flink 原理与实现:理解 Flink 中的计算资源](http://wuchong.me/blog/2016/05/09/flink-internals-understanding-execution-resources/)
221-
- []()
222-
- []()
361+
- [Flink实战教程](https://liguohua-bigdata.gitbooks.io/simple-flink/content/)
223362

0 commit comments

Comments
 (0)