本书从Apache Flink的缘起开始,由浅入深,理论结合实践,全方位地介绍Apache Flink这一处理海量数据集的高性能工具。本书围绕部署、流处理、批处理、Table API和SQL四大模块进行讲解,并详细说明Apache Flink的每个特性的实际业务背景,使读者不仅能编写可运行的Apache Flink程序代码,还能深刻理解并正确地将其运用到合适的生产业务环境中。
虽然本书是以Apache Flink技术框架来讲解流计算技术的,但是流计算领域开发所面临的各种问题同样是Java后端开发者在进行服务端开发时所要面临的,如有状态计算、Exactly Once语义等。因此,Apache Flink框架为解决这些问题而设计的方案同样值得Java后端开发者借鉴。
本书适合初级和中级软件工程师阅读,未接触过流计算领域的Java开发者也可以从本书中获益。针对初学者,本书提供Windows环境搭建的演示,使不具备Linux系统操作经验的读者也可以快速学习Apache Flink。
深入分析Flink实现原理
配套完整随书源代码,便于读者实战
前言
为什么要写这本书?
最近几年,在Apache Flink(简称Flink)社区的推动下,国内越来越多的公司开始应用Flink去解决生产问题。笔者在2019年便开始全面从Storm转到Flink。当时正值Flink在国内推广的起步阶段,相关系统性学习资料较少,因此笔者只能通过阅读Flink官网和浏览Flink框架源码进行学习,踩了不计其数的“雷”。例如,某些特性因为相关描述较少,导致初学者无法真正理解该特性所解决的实际业务背景,或者因为某些特性的示例代码不全,导致初学者无法快速使用该特性编写可运行的代码。本书按照笔者的学习过程来编写大纲,可以帮助初学者快速入门Flink,避免在学习过程中出现各种不必要的问题而浪费时间。
本书介绍的Flink的常用特性都附带完整的可运行代码,供读者上手实践。完整代码可在笔者的GitHub上下载,相关地址为https://github.com/intsmaze/flink-book。
本书内容
本书共10章,其中第2、3、10章是读者必须阅读的章节,其他章节读者可以结合自己的业务情况阅读。
第1章主要介绍Flink分布式处理框架的背景、特性及应用场景。读者可以快速阅读本章以建立对Flink的基本认识。
第2章主要介绍Flink的多种部署方式,重点讲解了它的单机部署、Standalone模式部署、YARN模式部署及相应的高可用设置。读者可以根据自己的业务需求选择其中一种方式搭建Flink。
第3章主要介绍Flink分布式开发的基础概念。这些概念是流处理和批处理开发中的通用概念,为此读者需要仔细阅读本章后再根据自己的业务需求选择阅读相关流处理章节、批处理章节或Table&SQL章节的内容。
第4章主要介绍Flink的流处理开发的基本功能,包括读取数据和输出数据,以及对数据流进行各种转换操作等,同时还讲解了如何对开发的Flink应用程序进行本地测试。读者在阅读完本章后便可以使用Flink进行一些非关键业务程序的开发工作。
第5章主要介绍Flink在流处理开发中对有状态计算的支持,包括检查点机制、保存点机制、各种状态后端等。读者在阅读完本章后便可以使用Flink进行一些关键业务程序的开发工作。
第6章主要介绍Flink在流处理开发中的高级功能,如窗口操作、时间处理、连接操作、侧端输出操作,以及自定义数据源和自定义数据接收器,同时讲解了Apache Kafka连接器对数据源和数据接收器的支持。读者在阅读完本章后便可以使用Flink进行一些关键且复杂的业务程序的开发工作。
第7章主要介绍Flink在批处理开发中的基本操作,包括读取数据和输出数据,以及对数据集进行的各种转换操作等。读者在阅读完本章后便可以使用Flink进行一些离线批处理任务的开发工作。
第8章主要介绍Flink的Table API和SQL如何统一流处理和批处理。Table API和SQL借助Apache Calcite进行查询的解析、校验和优化。它们可以简化用户的开发工作。针对一些常规的业务,开发者只需要写SQL,Flink会自动将SQL转化为流程序或批程序去执行。
第9章主要介绍Table API和SQL在流处理中的一些特别情况,包括动态表、时间属性和时态表等。
第10章主要介绍Flink中部署程序的基本操作,包括配置程序的执行参数、程序的并行度、程序的重启策略、发布程序的方式等。
术语约定
?Sink称为接收器。
?DataStream中的数据集合称为数据流,DataSet中的数据集合称为数据集,数据集内部也是数据流。Flink程序中的数据集合统指数据流或数据集。
?Keyed状态称为键控状态。
?SideOutput称为侧端输出。
?Evictor称为剔除器。
?Temporal Table称为时态表。
?流处理表称为流表。
?数据流中的一条数据(元素)也称为一个事件。
?Flink集群中运行的Flink程序称为作业。
?RichFunction称为富函数。
?Window称为窗口。
?Interval Join称为间隔连接。
?Kafka中的数据称为消息。
?Kafka消息的Value称为消息的主体,消息的Key仍称为Key,Key与Value的组合称为Kafka消息。
?DataStream和DataSet上的转换方法称为操作符。
本书是以Flink 的1.7版本为基础编写的,示例代码均用Java语言进行编写,同时本书的大部分代码均可运行在Flink 的1.8、1.9、1.10版本上。在本书的下载资源中提供了1.8、1.9、1.10版本的变动详情说明,版本变动主要体现在底层优化上,在API的使用方式上并无太大变动,大的差异在于SQL模块(例如在基于流处理的SQL模块中增加了新的特性,以及集成Hive等)。
本书相关资源的下载地址为www.broadview.com.cn/39911。对本书的勘误也可以在此网页上提交。
由于个人能力有限,书中难免有疏漏之处,欢迎读者批评指正。
刘洋
com.intsmaze.flink.streaming.chain.SoltSharingTemplate 应该更改为 com.intsmaze.flink.streaming.chain.SlotSharingTemplate ?
祝好。
行末尾多了一个”。”符号。
望校正。
谢谢。