本书以Scala作为开发Flink应用程序的编程语言,系统地介绍了Flink编程的基础知识。全书共8章,内容包括大数据技术概述、Scala语言基础、Flink的设计与运行原理、Flink环境搭建和使用方法、DataStream API、DataSet API、Table API&SQL、FlinkCEP。本书主要章节都安排了入门级的编程实践操作,以便读者更好地学习和掌握Flink编程方法。本书官网免费提供了全套的在线教学资源,包括讲义PPT、习题、源代码、软件、数据集、授课视频、上机实验指南等。 本书可作为高等院校大数据、计算机、软件工程等专业的进阶级大数据课程教材,用于指导Flink编程实践,也可供相关技术人员参考。
市场需要一款能够实现毫秒级别响应并且支持精确一次一致性的、高吞吐、高性能的流计算框架,而Flink是当前能够满足上述要求的产品,它正在成为大数据领域流处理的标配组件。本书是一本优秀的Flink教材,详细介绍了Flink的环境搭建和基础编程方法。结构清晰,语言流畅,并配有丰富的配套资源,供读者学习和参考。
大数据技术正处于快速发展之中,不断有新的技术涌现,Hadoop和Spark等技术成为其中的佼佼者。在Spark流行之前,Hadoop俨然已成为大数据技术的事实标准,在企业中得到了广泛的应用,但其本身还存在诸多缺陷,主要的缺陷是MapReduce计算模型延迟过高,无法胜任实时、快速计算的需求,因而只适用离线批处理的应用场景。Spark在设计上充分吸收和借鉴了MapReduce的精髓并加以改进,同时,采用了先进的DAG执行引擎,以支持循环数据流与内存计算,因此,在性能上比MapReduce有了大幅度的提升,迅速获得了学界和业界的广泛关注。作为大数据计算平台的后起之秀,Spark在2014年打破了Hadoop保持的基准排序纪录,此后逐渐发展成为大数据领域热门的大数据计算平台之一。
但是,Spark的短板在于无法满足毫秒级别的企业实时数据分析需求。Spark的流计算组件Spark Streaming的核心思路是将流数据分解成一系列短小的批处理作业,每个短小的批处理作业都可以使用Spark Core进行快速处理。但是,Spark Streaming在实现高吞吐和容错性的同时,却牺牲了低延迟和实时处理能力,快只能满足秒级的实时计算需求,无法满足毫秒级的实时计算需求。由于Spark Streaming组件的延迟较高,快响应时间都要在秒级,无法满足一些需要更快响应时间的企业应用的需求,所以,Spark社区又推出了Structured Streaming。Structured Streaming是一种基于Spark SQL引擎构建的、可扩展且容错的流处理引擎。Structured Streaming包括微批处理和持续处理两种处理模型。采用微批处理时,快响应时间需要100ms,无法支持毫秒级别响应。采用持续处理模型时,可以支持毫秒级别响应,但是,只能做到至少一次一致性,无法做到精确一次一致性。
因此,市场需要一款能够实现毫秒级别响应并且支持精确一次一致性的、高吞吐、高性能的流计算框架,而Flink是当前能够满足上述要求的产品,它正在成为大数据领域流处理的标配组件。
笔者带领的厦门大学计算机科学系数据库实验室团队,是国内高校较早从事大数据教学的团队之一。在写本书之前,我们已经做了大量前期的相关工作。从2013年至今,已经出版了8本大数据教材,内容涵盖导论课、入门课、进阶课和实训课,包括《大数据导论(通识课版)》(用于开设全校公共选修课)、《大数据导论》(用于开设大数据专业导论课)、《大数据技术原理与应用》(用于开设入门级大数据专业课)、《大数据基础编程、实验和案例教程》(用于开设入门级大数据专业课)、《Spark编程基础(Scala版)》(用于开设进阶级大数据专业课)、《Spark编程基础(Python版)》(用于开设进阶级大数据专业课)、《大数据实训案例之电影推荐系统(Scala版)》(用于开设大数据实训课程)和《大数据实训案例之电信用户行为分析(Scala版)》(用于开设大数据实训课程)。这些教材已经在国内高校得到了广泛使用,其中,《大数据技术原理与应用》教材的销量已经突破了15万册,得到了广大一线教师的高度认可和好评。学习Flink需要有一定的大数据基础知识,因此,建议读者在学习本书之前,先学习《大数据技术原理与应用》。为了帮助读者更好地学习本书,我们为教材配套建设了高校大数据课程公共服务平台,截至目前,平台累计访问量已经突破1000万,在全国高校形成了广泛的影响力,并荣获2018年厦门大学教学成果特等奖和2018年福建省教学成果二等奖。为了帮助高校教师更好地教授大数据课程,我们每年都举办大数据师资培训交流班,目前已经累计为全国400多所高校培养了600余位大数据教师。上述所有工作,使笔者对于撰写一本优秀的Flink教材有了更深的认识和更强的信心。
本书共8章,详细介绍了Flink的环境搭建和基础编程方法。第1章介绍大数据技术,帮助读者形成对大数据技术的总体性认识以及Flink在其中所扮演的角色;第2章介绍Scala语言基础知识,为学习基于Scala语言的Flink编程奠定基础;第3章介绍Flink的设计与运行原理;第4章介绍Flink环境搭建和使用方法,为开展Flink编程实践铺平道路;第5章介绍DataStream API,包括DataStream编程模型、窗口的划分、时间概念、窗口计算、水位线、状态编程;第6章介绍DataSet API,包括DataSet编程模型、数据源、数据转换、数据输出、迭代计算和广播变量;第7章介绍Table API&SQL,包括编程模型、Flink Table API、Flink SQL和自定义函数;第8章介绍FlinkCEP,包括Pattern API和模式的检测等。
本书面向高校大数据、计算机、软件工程等专业的学生,可以作为专业必修课或选修课教材。本书由林子雨和陶继平执笔,其中,林子雨负责书稿规划、统稿、校对和在线资源创作,并撰写第1、3、4、5、6、7、8章的内容,陶继平负责撰写第2章的内容。
在本书的撰写过程中,厦门大学计算机科学系硕士研究生郑宛玉、陈杰祥、陈绍纬、周伟敬、阮敏朝、刘官山和黄连福等做了大量辅助性工作,在此,向这些同学的辛勤工作表示衷心的感谢。同时,感谢夏小云老师在书稿校对过程中的辛勤付出。
本书官方网站免费提供了全部配套资源的在线浏览和下载,并接受错误反馈和发布勘误信息。同时,Flink作为大数据进阶课程,在学习过程中会涉及大量相关的大数据基础知识以及各种大数据软件的安装和使用方法,因此,推荐读者访问厦门大学数据库实验室建设的国内高校首个大数据课程公共服务平台,来获得必要的辅助学习内容。
在本书的撰写过程中,参考了大量网络资料和相关书籍,对Flink技术进行了系统梳理,有选择性地把一些重要知识纳入本书。由于笔者能力有限,本书难免存在不足之处,望广大读者不吝赐教。
林子雨厦门大学计算机科学系数据库实验室2021年6月
林子雨(1978-),男,博士,国内高校知名大数据教师,厦门大学计算机科学系副教授,中国计算机学会数据库专委会委员,中国计算机学会信息系统专委会委员,中国高校首个数字教师提出者和建设者。2013年开始在厦门大学开设大数据课程,建设了国内高校首个大数据课程公共服务平台,平台累计网络访问量超过1000万次,成为全国高校大数据教学知名品牌,并荣获2018年福建省教学成果二等奖,主持的课程《大数据技术原理与应用》获评2018年国家精品在线开放课程。
第1章大数据技术概述1
1.1大数据概念与关键技术1
1.1.1大数据概念1
1.1.2大数据关键技术2
1.2代表性大数据技术3
1.2.1Hadoop4
1.2.2Spark8
1.2.3Flink10
1.2.4Beam13
1.3编程语言的选择14
1.4在线资源15
1.5本章小结16
1.6习题16
实验1Linux系统的安装和常用命令17
第2章Scala语言基础19
2.1Scala语言概述19
2.1.1计算机的缘起19
2.1.2编程范式20
2.1.3Scala简介22
2.1.4Scala的安装22
2.1.5HelloWorld23
2.2Scala的基础编程知识25
2.2.1基本数据类型和变量25
2.2.2输入输出28
2.2.3控制结构31
2.2.4数据结构35
2.3面向对象编程基础42
2.3.1类42
2.3.2对象48
2.3.3继承53
2.3.4参数化类型57
2.3.5特质59
2.3.6模式匹配64
2.3.7包67
2.4函数式编程基础68
2.4.1函数的定义与使用69
2.4.2高阶函数71
2.4.3闭包72
2.4.4偏应用函数和Curry化72
2.4.5针对容器的操作74
2.4.6函数式编程实例80
2.5本章小结81
2.6习题82
实验2Scala编程初级实践83
第3章Flink的设计与运行原理88
3.1Flink简介88
3.2选择Flink的原因89
3.2.1传统数据处理架构89
3.2.2大数据Lambda架构90
3.2.3流处理架构90
3.2.4Flink是理想的流计算框架91
3.2.5Flink的优势92
3.3Flink典型应用场景94
3.3.1事件驱动型应用94
3.3.2数据分析应用95
3.3.3数据流水线应用97
3.4Flink的统一数据处理97
3.5Flink技术栈99
3.6Flink工作原理100
3.7Flink编程模型101
3.8Flink的应用程序结构102
3.9Flink的数据一致性103
3.9.1有状态计算103
3.9.2数据一致性103
3.9.3异步屏障快照机制104
3.10本章小结105
3.11习题106
第4章Flink环境搭建和使用方法107
4.1安装Flink107
4.1.1基础环境107
4.1.2下载安装文件108
4.1.3配置相关文件108
4.1.4运行测试样例109
4.1.5Flink和Hadoop的交互110
4.2在Scala Shell中运行代码110
4.3开发Flink独立应用程序111
4.3.1安装编译打包工具Maven111
4.3.2开发批处理程序113
4.3.3开发流处理程序117
4.3.4使用IntelliJ IDEA开发Flink应用程序119
4.4设置程序运行并行度126
4.5Flink集群环境搭建127
4.5.1集群基础配置127
4.5.2在集群中安装Java129
4.5.3设置SSH无密码登录130
4.5.4安装和配置Flink131
4.5.5启动和关闭Flink集群133
4.6本章小结133
4.7习题134
实验3Flink和Hadoop的安装134
第5章DataStream API136
5.1DataStream编程模型136
5.1.1数据源137
5.1.2数据转换149
5.1.3数据输出160
5.2窗口的划分163
5.3时间概念163
5.4窗口计算165
5.4.1窗口计算程序的结构165
5.4.2窗口分配器166
5.4.3窗口计算函数170
5.4.4触发器177
5.4.5驱逐器180
5.5水位线183
5.5.1水位线原理183
5.5.2水位线的设置方法186
5.5.3水位线应用实例188
5.6延迟数据处理197
5.7状态编程201
5.8本章小结203
5.9习题203
实验4DataStream API编程实践204
第6章DataSet API207
6.1DataSet编程模型207
6.2数据源208
6.2.1文件类数据源208
6.2.2集合类数据源209
6.2.3通用类数据源209
6.2.4第三方文件系统213
6.3数据转换215
6.3.1数据处理类算子216
6.3.2聚合操作类算子217
6.3.3多表关联类算子220
6.3.4集合操作类算子223
6.3.5分区操作类算子223
6.4数据输出224
6.5迭代计算226
6.5.1全量迭代226
6.5.2增量迭代229
6.6广播变量230
6.7本章小结232
6.8习题232
实验5DataSet API编程实践233
第7章Table API&SQL236
7.1编程模型236
7.1.1程序执行原理236
7.1.2程序结构237
7.1.3TableEnvironment238
7.1.4注册表239
7.1.5查询表245
7.1.6输出表248
7.1.7DataStream/DataSet与Table的相互转换251
7.1.8时间概念258
7.2Flink Table API260
7.2.1Table API应用实例260
7.2.2扫描、投影和过滤261
7.2.3列操作263
7.2.4聚合操作263
7.2.5连接操作267
7.2.6集合操作268
7.2.7排序操作270
7.2.8插入操作270
7.2.9基于行的操作270
7.3Flink SQL280
7.3.1应用实例280
7.3.2数据查询与过滤操作282
7.3.3聚合操作282
7.3.4连接操作283
7.3.5集合操作283
7.4自定义函数285
7.4.1标量函数285
7.4.2表值函数287
7.4.3聚合函数289
7.5本章小结291
7.6习题292
实验6Table API& SQL编程实践292
第8章FlinkCEP296
8.1概述296
8.2Pattern API297
8.2.1个体模式297
8.2.2复合模式299
8.2.3模式组301
8.2.4匹配后跳过策略302
8.3模式的检测302
8.3.1匹配事件提取303
8.3.2超时事件提取303
8.4应用实例304
8.5本章小结308
8.6习题308
实验7FlinkCEP编程实践308
参考文献311