-
Notifications
You must be signed in to change notification settings - Fork 5
/
flink.txt
13111 lines (10371 loc) · 526 KB
/
flink.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1.1 大数据处理架构演进历程 1
1.2 案例分析 8
1.2.1 SK 电信驾驶安全性评分 8
1.2.2 流式机器学习应用 12
1.3 流式数据架构基本概念 17
1.3.1 流 17
1.3.2 时间 18
1.3.3 窗口 21
1.3.4 水印 23
1.3.5 触发器 23
1.3.6 数据处理模式 23
1.3.7 如何理解流式数据架构的内在机制 27
1.4 根据事件时间开滚动窗口 28
1.4.1 what:转换/where:窗口 29
1.4.2 when:水印 29
1.4.3 when:触发器 32
1.4.4 when:迟到生存期 34
1.4.5 how:累加模式 35
1.5 一致性 37
1.5.1 有状态计算 37
1.5.2 exactly-once 语义 38
1.5.3 异步屏障快照 39
1.5.4 保存点 44
1.6 思考题 45
第2 章 编程基础 46
2.1 Flink 概述 46
2.2 让轮子转起来 47
2.2.1 本书约定 47
2.2.2 搭建单机版环境 48
2.2.3 配置IDEA 51
2.3 编程模型 53
2.3.1 分层组件栈 53
2.3.2 流式计算模型 54
2.3.3 流处理编程 57
2.4 运行时 62
2.4.1 运行时结构 62
2.4.2 任务调度 66
2.4.3 物理执行计划 69
2.5 思考题 70
第3 章 流处理API 71
3.1 流处理API 概述 71
3.2 时间处理 73
3.2.1 时间 73
3.2.2 水印 74
3.2.3 周期性水印生成器 75
3.2.4 间歇性水印生成器 77
3.2.5 递增式水印生成器 78
3.3 算子 79
3.3.1 算子函数 80
3.3.2 数据分区 83
3.3.3 资源共享 85
3.3.4 RichFunction 85
3.3.5 输出带外数据 86
3.4 窗口 86
3.4.1 窗口分类 87
3.4.2 窗口函数 90
3.4.3 触发器 94
3.4.4 清除器 96
3.4.5 迟到生存期 96
3.5 连接器 97
3.5.1 HDFS 连接器 98
3.5.2 Kafka 99
3.5.3 异步I/O 102
3.6 状态管理 104
3.6.1 状态分类 104
3.6.2 托管的Keyed State 104
3.6.3 状态后端配置 106
3.7 检查点 107
3.8 思考题 108
第4 章 批处理API 109
4.1 批处理API 概述. 109
4.1.1 程序结构 110
4.1.2 Source 111
4.1.3 Sink 112
4.1.4 连接器 112
4.2 算子 113
4.2.1 算子函数 113
4.2.2 广播变量 121
4.2.3 文件缓存 122
4.2.4 容错 123
4.3 迭代 123
4.3.1 深度神经网络训练 123
4.3.2 网络社团发现算法 125
4.3.3 Bulk Iteration 127
4.3.4 Delta Iteration 的迭代形式 128
4.4 注解 130
4.4.1 直接转发 130
4.4.2 非直接转发 131
4.4.3 触达 132
4.5 思考题 132
第5 章 机器学习引擎架构与应用编程 133
5.1 概述 133
5.1.1 数据加载 134
5.1.2 多项式曲线拟合的例子 135
5.2 流水线 137
5.2.1 机器学习面临的架构问题 137
5.2.2 Scikit-learn 架构实践总结 138
5.2.3 FlinkML 实现 140
5.3 深入分析多项式曲线拟合 170
5.3.1 数值计算的底层框架 170
5.3.2 向量 172
5.3.3 数据预处理 178
5.3.4 特征变换 184
5.3.5 线性拟合 188
5.4 分类算法 190
5.4.1 最优超平面 190
5.4.2 凸优化理论 193
5.4.3 求解最优超平面 198
5.4.4 核方法 200
5.4.5 软间隔 205
5.4.6 优化解法 208
5.4.7 SVM 的FlinkML 实现 211
5.4.8 SVM 的应用 220
5.5 推荐算法 221
5.5.1 推荐系统的分类 221
5.5.2 ALS-WR 算法 223
5.5.3 FlinkML 实现 225
5.5.4 ALS-WR 的应用 230
5.6 思考题 230
第6 章 关系型API 234
6.1 为什么需要关系型API 234
6.2 Calcite 235
6.3 关系型API 概述. 236
6.3.1 程序结构 236
6.3.2 Table 运行时 239
6.3.3 表注册 241
6.3.4 TableSource 与TableSink 242
6.3.5 查询 244
6.3.6 相互转换 244
6.4 动态表概述 247
6.4.1 流式关系代数 247
6.4.2 动态表 248
6.4.3 持续查询 250
6.5 思考题 255
第7 章 复杂事件处理 256
7.1 什么是复杂事件处理 256
7.1.1 股票异常交易检测 256
7.1.2 重新审视DataStream 与Table API 258
7.2 复杂事件处理的自动机理论 259
7.2.1 有穷自动机模型NFA 259
7.2.2 NFAb 模型 261
7.2.3 带版本号的共享缓存 263
7.3 FlinkCEP API 265
7.3.1 基本模式 266
7.3.2 模式拼合 267
7.3.3 模式分组 268
7.3.4 匹配输出 269
7.4 基于FlinkCEP 的股票异常交易检测的实现 270
7.5 思考题 274
第8 章 监控与部署 275
8.1 监控 275
8.1.1 度量指标 275
8.1.2 指标的作用域 279
8.1.3 监控配置 279
8.2 集群部署模式 281
8.2.1 Standalone 281
8.2.2 YARN 281
8.2.3 高可用 284
8.3 访问安全 284
第 1章 为何选择Flink 1
1.1 流处理欠佳的后果 2
1.1.1 零售业和市场营销 2
1.1.2 物联网 3
1.1.3 电信业 5
1.1.4 银行和金融业 5
1.2 连续事件处理的目标 6
1.3 流处理技术的演变 6
1.4 初探Flink 9
1.5 生产环境中的Flink 12
1.5.1 布衣格电信 13
1.5.2 其他案例 14
1.6 Flink的适用场景 15
第 2章 流处理架构 17
2.1 传统架构与流处理架构 17
2.2 消息传输层和流处理层 18
2.3 消息传输层的理想功能 19
2.3.1 兼具高性能和持久性 20
2.3.2 将生产者和消费者解耦 20
2.4 支持微服务架构的流数据 21
2.4.1 数据流作为中心数据源 22
2.4.2 欺诈检测:流处理架构用例 22
2.4.3 给开发人员带来的灵活性 24
2.5 不限于实时应用程序 24
2.6 流的跨地域复制 26
第3章 Flink 的用途 29
3.1 不同类型的正确性 29
3.1.1 符合产生数据的自然规律 29
3.1.2 事件时间 31
3.1.3 发生故障后仍保持准确 32
3.1.4 及时给出所需结果 33
3.1.5 使开发和运维更轻松 33
3.2 分阶段采用Flink 34
第4章 对时间的处理 35
4.1 采用批处理架构和Lambda 架构计数 35
4.2 采用流处理架构计数 38
4.3 时间概念 40
4.4 窗口 41
4.4.1 时间窗口 41
4.4.2 计数窗口 43
4.4.3 会话窗口 43
4.4.4 触发器 44
4.4.5 窗口的实现 44
4.5 时空穿梭 44
4.6 水印 45
4.7 真实案例:爱立信公司的Kappa 架构 47
第5章 有状态的计算 49
5.1 一致性 50
5.2 检查点:保证exactly-once 51
5.3 保存点:状态版本控制 59
5.4 端到端的一致性和作为数据库的流处理器 62
5.5 Flink 的性能 65
5.5.1 Yahoo! Streaming Benchmark 65
5.5.2 变化1:使用Flink 状态 66
5.5.3 变化2:改进数据生成器并增加吞吐量 67
5.5.4 变化3:消除网络瓶颈 68
5.5.5 变化4:使用MapR Streams 69
5.5.6 变化5:增加key 基数 69
5.6 结论 71
第6章 批处理:一种特殊的流处理 73
6.1 批处理技术 75
6.2 案例研究:Flink 作为批处理器 76
附录 其他资源 79
About the Author
About the Reviewers
www.PacktPub.com
Why subscribe?
Customer Feedback
Preface
What this book covers
What you need for this book
Who this book is for
Conventions
Reader feedback
Customer support
Downloading the example code
Downloading the color images of this book
Errata
Piracy
Questions
1. Introduction to Apache Flink
History
Architecture
Distributed execution
Job Manager
Actor system
Scheduler
Check pointing
Task manager
Job client
Features
High performance
Exactly-once stateful computation
Flexible streaming windows
Fault tolerance
Memory management
Optimizer
Stream and batch in one platform
Libraries
Event time semantics
Quick start setup
Pre-requisite
Installing on Windows
Installing on Linux
Cluster setup
SSH configurations
Java installation
Flink installation
Configurations
Starting daemons
Adding additional Job/Task Managers
Stopping daemons and cluster
Running sample application
Summary
2. Data Processing Using the DataStream API
Execution environment
Data sources
Socket-based
File-based
Transformations
Map
FlatMap
Filter
KeyBy
Reduce
Fold
Aggregations
Window
Global windows
Tumbling windows
Sliding windows
Session windows
WindowAll
Union
Window join
Split
Select
Project
Physical partitioning
Custom partitioning
Random partitioning
Rebalancing partitioning
Rescaling
Broadcasting
Data sinks
Event time and watermarks
Event time
Processing time
Ingestion time
Connectors
Kafka connector
Twitter connector
RabbitMQ connector
ElasticSearch connector
Embedded node mode
Transport client mode
Cassandra connector
Use case - sensor data analytics
Summary
3. Data Processing Using the Batch Processing API
Data sources
File-based
Collection-based
Generic sources
Compressed files
Transformations
Map
Flat map
Filter
Project
Reduce on grouped datasets
Reduce on grouped datasets by field position key
Group combine
Aggregate on a grouped tuple dataset
MinBy on a grouped tuple dataset
MaxBy on a grouped tuple dataset
Reduce on full dataset
Group reduce on a full dataset
Aggregate on a full tuple dataset
MinBy on a full tuple dataset
MaxBy on a full tuple dataset
Distinct
Join
Cross
Union
Rebalance
Hash partition
Range partition
Sort partition
First-n
Broadcast variables
Data sinks
Connectors
Filesystems
HDFS
Amazon S3
Alluxio
Avro
Microsoft Azure storage
MongoDB
Iterations
Iterator operator
Delta iterator
Use case - Athletes data insights using Flink batch API
Summary
4. Data Processing Using the Table API
Registering tables
Registering a dataset
Registering a datastream
Registering a table
Registering external table sources
CSV table source
Kafka JSON table source
Accessing the registered table
Operators
The select operator
The where operator
The filter operator
The as operator
The groupBy operator
The join operator
The leftOuterJoin operator
The rightOuterJoin operator
The fullOuterJoin operator
The union operator
The unionAll operator
The intersect operator
The intersectAll operator
The minus operator
The minusAll operator
The distinct operator
The orderBy operator
The limit operator
Data types
SQL
SQL on datastream
Supported SQL syntax
Scalar functions
Scalar functions in the table API
Scala functions in SQL
Use case - Athletes data insights using Flink Table API
Summary
5. Complex Event Processing
What is complex event processing?
Flink CEP
Event streams
Pattern API
Begin
Filter
Subtype
OR
Continuity
Strict continuity
Non-strict continuity
Within
Detecting patterns
Selecting from patterns
Select
flatSelect
Handling timed-out partial patterns
Use case - complex event processing on a temperature sensor
Summary
6. Machine Learning Using FlinkML
What is machine learning?
Supervised learning
Regression
Classification
Unsupervised learning
Clustering
Association
Semi-supervised learning
FlinkML
Supported algorithms
Supervised learning
Support Vector Machine
Multiple Linear Regression
Optimization framework
Recommendations
Alternating Least Squares
Unsupervised learning
k Nearest Neighbour join
Utilities
Data pre processing and pipelines
Polynomial features
Standard scaler
MinMax scaler
Summary
7. Flink Graph API - Gelly
What is a graph?
Flink graph API - Gelly
Graph representation
Graph nodes
Graph edges
Graph creation
From dataset of edges and vertices
From dataset of tuples representing edges
From CSV files
From collection lists
Graph properties
Graph transformations
Map
Translate
Filter
Join
Reverse
Undirected
Union
Intersect
Graph mutations
Neighborhood methods
Graph validation
Iterative graph processing
Vertex-Centric iterations
Scatter-Gather iterations
Gather-Sum-Apply iterations
Use case - Airport Travel Optimization
Summary
8. Distributed Data Processing with Flink and Hadoop
Quick overview of Hadoop
HDFS
YARN
Flink on YARN
Configurations
Starting a Flink YARN session
Submitting a job to Flink
Stopping Flink YARN session
Running a single Flink job on YARN
Recovery behavior for Flink on YARN
Working details
Summary
9. Deploying Flink on Cloud
Flink on Google Cloud
Installing Google Cloud SDK
Installing BDUtil
Launching a Flink cluster
Executing a sample job
Shutting down the cluster
Flink on AWS
Launching an EMR cluster
Installing Flink on EMR
Executing Flink on EMR-YARN
Starting a Flink YARN session
Executing Flink job on YARN session
Shutting down the cluster
Flink on EMR 5.3+
Using S3 in Flink applications
Summary
10. Best Practices
Logging best practices
Configuring Log4j
Configuring Logback
Logging in applications
Using ParameterTool
From system properties
From command line arguments
From .properties file
Naming large TupleX types
Registering a custom serializer
Metrics
Registering metrics
Counters
Gauges
Histograms
Meters
Reporters
Monitoring REST API
Config API
Overview API
Overview of the jobs
Details of a specific job
User defined job configuration
Back pressure monitoring
Summary
第一部分(第1~2章)
主要介绍了Flink的核心概念、特性、应用场景、基本架构,开发环境的搭建和配置,以及源代码的编译。
第二部分(第3~9章)
详细讲解了Flink的编程范式,各种编程接口的功能、应用场景和使用方法,以及核心模块和组件的原理和使用。
第三部分(第10章)
重点讲解了Flink的监控和优化,参数调优,以及对反压、Checkpoint和内存的优化。
第1 章 流式数据架构理论 1
1.1 大数据处理架构演进历程 1
1.2 案例分析 8
1.2.1 SK 电信驾驶安全性评分 8
1.2.2 流式机器学习应用 12
1.3 流式数据架构基本概念 17
1.3.1 流 17
1.3.2 时间 18
1.3.3 窗口 21
1.3.4 水印 23
1.3.5 触发器 23
1.3.6 数据处理模式 23
1.3.7 如何理解流式数据架构的内在机制 27
1.4 根据事件时间开滚动窗口 28
1.4.1 what:转换/where:窗口 29
1.4.2 when:水印 29
1.4.3 when:触发器 32
1.4.4 when:迟到生存期 34
1.4.5 how:累加模式 35
1.5 一致性 37
1.5.1 有状态计算 37
1.5.2 exactly-once 语义 38
1.5.3 异步屏障快照 39
1.5.4 保存点 44
1.6 思考题 45
第2 章 编程基础 46
2.1 Flink 概述 46
2.2 让轮子转起来 47
2.2.1 本书约定 47
2.2.2 搭建单机版环境 48
2.2.3 配置IDEA 51
2.3 编程模型 53
2.3.1 分层组件栈 53
2.3.2 流式计算模型 54
2.3.3 流处理编程 57
2.4 运行时 62
2.4.1 运行时结构 62
2.4.2 任务调度 66
2.4.3 物理执行计划 69
2.5 思考题 70
第3 章 流处理API 71
3.1 流处理API 概述 71
3.2 时间处理 73
3.2.1 时间 73
3.2.2 水印 74
3.2.3 周期性水印生成器 75
3.2.4 间歇性水印生成器 77
3.2.5 递增式水印生成器 78
3.3 算子 79
3.3.1 算子函数 80
3.3.2 数据分区 83
3.3.3 资源共享 85
3.3.4 RichFunction 85
3.3.5 输出带外数据 86
3.4 窗口 86
3.4.1 窗口分类 87
3.4.2 窗口函数 90
3.4.3 触发器 94
3.4.4 清除器 96
3.4.5 迟到生存期 96
3.5 连接器 97
3.5.1 HDFS 连接器 98
3.5.2 Kafka 99
3.5.3 异步I/O 102
3.6 状态管理 104
3.6.1 状态分类 104
3.6.2 托管的Keyed State 104
3.6.3 状态后端配置 106
3.7 检查点 107
3.8 思考题 108
第4 章 批处理API 109
4.1 批处理API 概述. 109
4.1.1 程序结构 110
4.1.2 Source 111
4.1.3 Sink 112
4.1.4 连接器 112
4.2 算子 113
4.2.1 算子函数 113
4.2.2 广播变量 121
4.2.3 文件缓存 122
4.2.4 容错 123
4.3 迭代 123
4.3.1 深度神经网络训练 123
4.3.2 网络社团发现算法 125
4.3.3 Bulk Iteration 127
4.3.4 Delta Iteration 的迭代形式 128
4.4 注解 130
4.4.1 直接转发 130
4.4.2 非直接转发 131
4.4.3 触达 132
4.5 思考题 132
第5 章 机器学习引擎架构与应用编程 133
5.1 概述 133
5.1.1 数据加载 134
5.1.2 多项式曲线拟合的例子 135
5.2 流水线 137
5.2.1 机器学习面临的架构问题 137
5.2.2 Scikit-learn 架构实践总结 138
5.2.3 FlinkML 实现 140
5.3 深入分析多项式曲线拟合 170
5.3.1 数值计算的底层框架 170
5.3.2 向量 172
5.3.3 数据预处理 178
5.3.4 特征变换 184
5.3.5 线性拟合 188
5.4 分类算法 190
5.4.1 最优超平面 190
5.4.2 凸优化理论 193
5.4.3 求解最优超平面 198
5.4.4 核方法 200
5.4.5 软间隔 205
5.4.6 优化解法 208
5.4.7 SVM 的FlinkML 实现 211
5.4.8 SVM 的应用 220
5.5 推荐算法 221
5.5.1 推荐系统的分类 221
5.5.2 ALS-WR 算法 223
5.5.3 FlinkML 实现 225
5.5.4 ALS-WR 的应用 230
5.6 思考题 230
第6 章 关系型API 234
6.1 为什么需要关系型API 234
6.2 Calcite 235
6.3 关系型API 概述. 236
6.3.1 程序结构 236
6.3.2 Table 运行时 239
6.3.3 表注册 241
6.3.4 TableSource 与TableSink 242
6.3.5 查询 244
6.3.6 相互转换 244
6.4 动态表概述 247
6.4.1 流式关系代数 247
6.4.2 动态表 248
6.4.3 持续查询 250
6.5 思考题 255
第7 章 复杂事件处理 256
7.1 什么是复杂事件处理 256
7.1.1 股票异常交易检测 256
7.1.2 重新审视DataStream 与Table API 258
7.2 复杂事件处理的自动机理论 259
7.2.1 有穷自动机模型NFA 259
7.2.2 NFAb 模型 261
7.2.3 带版本号的共享缓存 263
7.3 FlinkCEP API 265
7.3.1 基本模式 266
7.3.2 模式拼合 267
7.3.3 模式分组 268
7.3.4 匹配输出 269
7.4 基于FlinkCEP 的股票异常交易检测的实现 270
7.5 思考题 274
第8 章 监控与部署 275
8.1 监控 275
8.1.1 度量指标 275
8.1.2 指标的作用域 279
8.1.3 监控配置 279
8.2 集群部署模式 281
8.2.1 Standalone 281
8.2.2 YARN 281
8.2.3 高可用 284
8.3 访问安全 284
8.4 思考题 286
参考资料 287
第 1章 为何选择Flink 1
1.1 流处理欠佳的后果 2
1.1.1 零售业和市场营销 2
1.1.2 物联网 3
1.1.3 电信业 5
1.1.4 银行和金融业 5
1.2 连续事件处理的目标 6
1.3 流处理技术的演变 6
1.4 初探Flink 9
1.5 生产环境中的Flink 12
1.5.1 布衣格电信 13
1.5.2 其他案例 14
1.6 Flink的适用场景 15
第 2章 流处理架构 17
2.1 传统架构与流处理架构 17
2.2 消息传输层和流处理层 18
2.3 消息传输层的理想功能 19
2.3.1 兼具高性能和持久性 20
2.3.2 将生产者和消费者解耦 20
2.4 支持微服务架构的流数据 21
2.4.1 数据流作为中心数据源 22
2.4.2 欺诈检测:流处理架构用例 22
2.4.3 给开发人员带来的灵活性 24
2.5 不限于实时应用程序 24
2.6 流的跨地域复制 26
第3章 Flink 的用途 29
3.1 不同类型的正确性 29
3.1.1 符合产生数据的自然规律 29
3.1.2 事件时间 31
3.1.3 发生故障后仍保持准确 32
3.1.4 及时给出所需结果 33
3.1.5 使开发和运维更轻松 33
3.2 分阶段采用Flink 34
第4章 对时间的处理 35
4.1 采用批处理架构和Lambda 架构计数 35
4.2 采用流处理架构计数 38
4.3 时间概念 40
4.4 窗口 41
4.4.1 时间窗口 41
4.4.2 计数窗口 43
4.4.3 会话窗口 43
4.4.4 触发器 44
4.4.5 窗口的实现 44
4.5 时空穿梭 44
4.6 水印 45
4.7 真实案例:爱立信公司的Kappa 架构 47
第5章 有状态的计算 49
5.1 一致性 50
5.2 检查点:保证exactly-once 51
5.3 保存点:状态版本控制 59
5.4 端到端的一致性和作为数据库的流处理器 62
5.5 Flink 的性能 65
5.5.1 Yahoo! Streaming Benchmark 65
5.5.2 变化1:使用Flink 状态 66
5.5.3 变化2:改进数据生成器并增加吞吐量 67
5.5.4 变化3:消除网络瓶颈 68
5.5.5 变化4:使用MapR Streams 69
5.5.6 变化5:增加key 基数 69
5.6 结论 71
第6章 批处理:一种特殊的流处理 73
6.1 批处理技术 75
6.2 案例研究:Flink 作为批处理器 76
附录 其他资源 79
Learning Apache Flink
Credits
About the Author
About the Reviewers
www.PacktPub.com
Why subscribe?
Customer Feedback
Preface
What this book covers
What you need for this book
Who this book is for
Conventions
Reader feedback
Customer support
Downloading the example code
Downloading the color images of this book
Errata
Piracy
Questions
=========================
Apache Flink 源码解析(一)入口,bash脚本
2018.10.14 09:45 920浏览
概述
因为自己在阅读源码的过程中曾经遇到过很多问题,现在稍微有一点点的经验希望分享给很多从零开始的人。Apache的项目代码量很大,很难做到彻底通读,我也是一步一步的先从整体的架构来分析。阅读源码的好处有很多,在此就不一一赘述。
介绍
首先介绍以下flink,它是一个分布式,高容错,能保证每条消息只被处理一次的流处理引擎,也是对Google Dataflow模型的一个较好的开源实现,虽然还是有一些不足之处。虽然在runtime中用的是同一个引擎,但是却提供了针对stream和batch的两套api,不过在后续的更新中应该更好地加入了对sql的支持来完成统一。
本次解析参考的代码是flink1.2版本。
另外Flink是使用Scala和Java混编,关于Scala和分布式工具包Akka的学习资料后续我会补充。
入口
首先是找到入口。因为一个项目中可能有几个主函数,而且大数据相关的项目还会兼容Yarn和Mesos,入口的话就更多了。在这里我会用Local模式和Standalone Cluster模式来讲解,一方面对Yarn和Mesos相关的背景就不需要怎么介绍(事实是我还没学 : ( ...),另一方面入门门槛也稍低一些,还省略了很多代码可以以后再分析。
要找入口,那就要去找启动脚本,建议大家可以稍微学一下bash, 不说能写的多好,最起码能看懂启动脚本就行。
Flink的启动脚本源码在flink-dist/src/main/flink-bin/bin文件夹下,其中有start-cluster和start-local。其中start-local的代码很简单
start-local.sh代码片段
就是调用同文件夹下的jobmanager.sh脚本,因为是本地模式,所以输入参数是local。其中taskmanager的启动时嵌入在同一个jvm中,后面会做解析。
而start-cluster集群模式下的运行就较为复杂
start-cluster.sh代码片段
在这里不会对Zookeeper下的高可用模式进行介绍,只介绍普通集群模式,所以直接参考else后面的语句,同样是运行jobmanager脚本,只是第二个命令行参数变成了cluster。所以接下来去看jobmanager.sh。jobmanager.sh在对入参进行了一系列判断之后,会到以下代码块。
jobmanager.sh代码片段
不管是前台运行还是后台运行,都会调用flink-daemon.sh脚本,下面就是启动脚本的核心。
flink-daemon.sh代码片段判断部分
在flink中,他会根据先前运行的脚本调用daemon脚本,所以需要运行的可能不只是jobmanager,在这儿因为我们是从jobmanager.sh中进入daemon,所以需要运行的class是org.apache.flink.runtime.jobmanaer.JobManager,所以我们看源码的入口也就在这个类。
以下是启动jvm将该类作为主程序的运行,其中很多事jvm的启动参数,不做细讲。
flink-daemon.sh代码片段运行部分
总结
至此,flink的local与cluster启动脚本应该已经比较清晰,如果想开始阅读源码的话就从org.apache.flink.runtime.jobmanaer.JobManager这个类开始看起。因为flink中基于akka的部分大部分是使用scala实现,所以建议可以先去看scala文档,或者runoob.com的scala入门教程,后续还可以研读Scala In Depth这本书。
============
Apache Flink 源码解析(二)系统架构, 启动与注册
2018.10.14 09:44 447浏览
概述
这篇文章侧重于分析JobManager和TaskManager的启动过程以及注册,还有Flink的implementation中所用到的设计模式。本文从本地与standalone模式进行解析。
Akka 简介
因为组件之间的信息传递是通过Akka工具包,所以在这儿我做一个简单的解释
首先参考Akka官方文档给出的一个抽象的图
image
如图就是对ActorSystem的一个高度抽象,所有的Actor成树状,user actor的子孙就是用户创建的Actor,system下面是Akka的监管与支持的Actor,往往不需要用户过多参与
Actor之间如果持有对方的ActorRef则可以向对方发送消息
父Actor负责监管子Actor抛出的异常能被父Actor处理,则父Actor可以重启或者废弃它,如果不能处理,会继续向上抛异常。一个Actor如果推出,那么它的所有子Actor都会退出。
它们共同组成了一个ActorSystem
Flink的架构
首先上一张从Flink官方文档拿来的架构图
process-model.png
这次我会从JobManager和TaskManager着手来解析Flink的启动过程
Flink中JobManager与TaskManager,JobManager与Client的交互是基于Akka工具包的,是通过消息驱动,这样就把中心放到了消息的接收,发送与处理,而且由于对每个Akka中的Actor来说,消息是同步的,排在一个队列中,极大地简化了多线程程序设计的复杂度,关于Akka的一些学习资料我会放在文章最后
下面的启动过程我会分为入口,ActorSystem的创建,JobManager的启动,TaskManager的启动和注册这几块来讲
入口
ActorSystem创建
JobManager
TaskManager
TaskManager的注册
AcknowledgeRegistration注册成功,如果isConnected为true则是已连接,判断该消息是否由当前链接的JobManager发送并写入日志,如果未连接,调用associateWithJobManager进行接收消息钱的准备工作(后续会深入解析)
ackRegistration.png
AlreadyRegistered重复注册,写入日志,逻辑与 AcknowledgeRegistration消息的处理相同
RefuseRegistration注册失败,如果JobManager地址存在,则发送新的TriggerTaskManagerRegistration, 重复到TaskManager注册部分的福州,如果没有地址,则验证如果发送消息的JobManager是否是当前已连接的JobManager写入日志,对结果没有影响
根据消息找到相应的TaskManager地址
一旦JobManager接收到RegisterTaskManager消息,先想ResourceManager注册(这边不做介绍,这边的?是Akka里面发送ask消息并期望得到一个返回值),如果Resource注册失败则向发送ReconnectResourceManager消息进行重试
如果该TaskManager已经注册在instanceManager中,则发送AlreadyRegistered消息给相应的TaskManager
如果还未注册,则向instanceManager注册该TaskManager,并发送AcknowledgeRegistration给相应的TaskManager
出现异常则拒绝注册,发送RefuseRegistration消息
在handleJobManagerLeaderAddress中触发了triggerTaskManagerRegistration注册函数
在该函数中,提取超时信息设置,以及当前尝试的ID,清空已经在调度器中应该被废弃的注册消息,并向自身发送尝试次数为第一次的TriggerTaskManagerRegistration消息
triggerTaskManagerRegistration.png
因为TriggerTaskManagerRegistration是在TaskManager Actor接收到RegistrationMessage的子类,所以在接收到该消息时,根据RegistrationMessage来匹配,并调用handleRegistrationMessage方法
handleRegistrationMessage.png
匹配到TriggerTaskManagerRegistration消息后,先判断该消息有没有失效,如果没有,则有三种情况
handleTriggerTaskManagerRegistration.png
如果已连接成功,写入日志
如果超时,写入日志并推出
除此之外,进行下一次尝试,向JobManager Actor发送RegisterTaskManager消息,并在调度其中注册下一次TriggerTaskManagerRegistration的消息的发送,知道出现第一种情况注册成功或第二种情况注册失败为止
在TaskManager的注册中,设计了与JobManager的消息交互,所以单独分开来讲
TaskManager中的发送注册请求
JobManager接收到注册请求消息
handleRegisterTaskManager.png
TaskManager接到返回消息
TaskManager Actor一旦接收到该Message要不就是刚启动,要不就是JobManager的Leader发生了改变,调用handleJobManagerLeaderAddress函数
handleGrantLeadershipMessage.png
在handleJobManagerLeaderAddress函数中,先断开连接,然后出发TaskManager的注册操作
handleJobManagerLeaderAddressMessage.png
首先启动leaderRetrievalService,和LeaderElection一样使用了策略模式来处理是否高可用两种情况,观察者模式来接收对象变化并调用callback方法