@@ -76,16 +76,16 @@ mvn archetype:generate \
76
76
77
77
- 四个基石:Checkpoint、State、Time、Window
78
78
- 解决 exactly-once 的问题
79
- - 状态管理
80
79
- 实现了 watermark 的机制,解决了基于事件时间处理时的数据乱序和数据迟到的问题
80
+ - 状态管理
81
81
- 提供了一套开箱即用的窗口操作,包括滚动窗口、滑动窗口、会话窗口
82
82
- 我想说的,都被这篇文章说了:
83
83
- <http://shiyanjun.cn/archives/1508.html>
84
84
- <http://wuchong.me/blog/2018/11/09/flink-tech-evolution-introduction/>
85
85
- 这里补充点其他的
86
86
87
87
88
-
88
+ ```
89
89
Client 用来提交任务给 JobManager,JobManager 分发任务给 TaskManager 去执行,然后 TaskManager 会心跳的汇报任务状态
90
90
在 Flink 集群中,计算资源被定义为 Task Slot
91
91
每个 TaskManager 会拥有一个或多个 Slots
@@ -103,14 +103,14 @@ Flink 中的计算资源通过 Task Slot 来定义。每个 task slot 代表了
103
103
104
104
每一个 TaskManager 会拥有一个或多个的 task slot,每个 slot 都能跑由多个连续 task 组成的一个 pipeline,比如 MapFunction 的第n个并行实例和 ReduceFunction 的第n个并行实例可以组成一个 pipeline。
105
105
106
-
107
106
source(Streaming 进来)
108
107
Transformations(Streaming 处理)
109
108
sink(Streaming 出去)
110
109
111
110
Flink程序与生俱来的就是并行和分布式的。Streams被分割成stream patition, Operators被被分割成operator subtasks。这些subtasks在不同的机器(容器)上的不同的线程中运行,彼此独立,互不干扰。 一个操作的operator subtask的数目,被称为parallelism(并行度)。一个stream的并行度,总是等于生成它的(operator)操作的并行度。一个Flink程序中,不同的operator可能具有不同的并行度。
111
+ ```
112
112
113
-
113
+ -------------------------------------------------------------------
114
114
115
115
116
116
#### 为了容错的 Checkpoint 机制
@@ -120,8 +120,6 @@ Flink程序与生俱来的就是并行和分布式的。Streams被分割成strea
120
120
- [A Deep Dive into Rescalable State in Apache Flink](https://flink.apache.org/features/2017/07/04/flink-rescalable-state.html)
121
121
- [Flink 小贴士 (5): Savepoint 和 Checkpoint 的 3 个不同点](http://wuchong.me/blog/2018/11/25/flink-tips-differences-between-savepoints-and-checkpoints/)
122
122
- [Flink 小贴士 (2):Flink 如何管理 Kafka 消费位点](http://wuchong.me/blog/2018/11/04/how-apache-flink-manages-kafka-consumer-offsets/)
123
- - []()
124
- - []()
125
123
- Checkpoint 允许 Flink 恢复流中的状态和位置,使应用程序具有与无故障执行相同的语义
126
124
- Checkpoint 是 Flink 用来从故障中恢复的机制,快照下了整个应用程序的状态,当然也包括输入源读取到的位点。如果发生故障,Flink 将通过从 Checkpoint 加载应用程序状态并从恢复的读取位点继续应用程序的处理,就像什么事情都没发生一样。
127
125
@@ -144,11 +142,23 @@ Flink通过一个可配置的时间,周期性的生成checkpoint,将它写
144
142
- 这里有一个核心:用到 Facebook 的 RocksDB 数据库(可嵌入式的支持持久化的 key-value 存储系统)
145
143
146
144
145
+ -------------------------------------------------------------------
147
146
148
147
#### Exactly-Once
149
148
150
149
- 因为有了 Checkpoint,才有了 Exactly-Once
151
150
- [ 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
+
152
162
153
163
#### Watermark
154
164
@@ -157,34 +167,163 @@ Flink通过一个可配置的时间,周期性的生成checkpoint,将它写
157
167
- watermark 的作用,他们定义了何时不再等待更早的数据
158
168
- WaterMark 只在时间特性 EventTime 和 IngestionTime 起作用,并且 IngestionTime 的时间等同于消息的 ingestion 时间
159
169
170
+ -------------------------------------------------------------------
171
+
160
172
#### 窗口
161
173
162
- - 翻滚窗口(Tumble)
174
+ - < http://wuchong.me/blog/2016/05/25/flink-internals-window-mechanism/ >
163
175
- [ Flink 原理与实现:Window 机制] ( http://wuchong.me/blog/2016/05/25/flink-internals-window-mechanism/ )
164
176
- [ Flink 原理与实现:Session Window] ( http://wuchong.me/blog/2016/06/06/flink-internals-session-window/ )
165
177
178
+ ##### 滚动窗口(Tumbling Windows)
166
179
167
- #### 生产环境
180
+ - 滚动窗口有一个固定的大小,并且不会出现重叠
168
181
169
- - [ Flink 小贴士 (7): 4个步骤,让 Flink 应用达到生产状态 ] ( http://wuchong.me/blog/2018/12/03/flink-tips-4-steps-flink-application-production-ready/ )
182
+ ###### 滚动事件时间窗口
170
183
184
+ ```
185
+ input
186
+ .keyBy(<key selector>)
187
+ .window(TumblingEventTimeWindows.of(Time.seconds(5)))
188
+ .<windowed transformation>(<window function>);
189
+ ```
171
190
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
+ -------------------------------------------------------------------
172
306
173
307
174
308
#### 运行环境
175
309
176
310
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
179
315
316
+ -------------------------------------------------------------------
180
317
181
318
#### Flink 的 HA
182
319
320
+ -------------------------------------------------------------------
183
321
184
322
#### Monitoring REST API
185
323
186
324
https://ci.apache.org/projects/flink/flink-docs-stable/monitoring/rest_api.html#monitoring-rest-api
187
325
326
+ -------------------------------------------------------------------
188
327
189
328
#### 主要核心 API
190
329
@@ -195,6 +334,7 @@ https://ci.apache.org/projects/flink/flink-docs-stable/monitoring/rest_api.html#
195
334
- Kafka Connectors
196
335
- Elasticsearch sink
197
336
337
+ -------------------------------------------------------------------
198
338
199
339
#### Table & SQL API(关系型 API)
200
340
@@ -218,6 +358,5 @@ SQL API:支持标准SQL(自1.1.0版本开始)
218
358
- [ Flink学习笔记(4):基本概念] ( https://www.jianshu.com/p/0cd1db4282be )
219
359
- [ Apache Flink:特性、概念、组件栈、架构及原理分析] ( http://shiyanjun.cn/archives/1508.html )
220
360
- [ 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/ )
223
362
0 commit comments