Statistics
52
Views
0
Downloads
0
Donations
Uploader

高宏飞

Shared on 2025-11-25
Support
Share

Author徐葳

No description

Tags
No tags
Language: 中文
File Format: PDF
File Size: 5.5 MB
Support Statistics
¥.00 · 0times
Text Preview (First 20 pages)
Registered users can read the full content for free

Register as a Gaohf Library member to read the complete e-book online for free and enjoy a better reading experience.

51678-Flink入门与实战.indd 1-5 2019/9/19 9:27:31
51678-Flink入门与实战.indd 6 2019/9/19 9:27:32
内 容 提 要 本书旨在帮助读者从零开始快速掌握 Flink 的基本原理与核心功能。本书首先介绍了 Flink 的基本原 理和安装部署,并对 Flink 中的一些核心 API 进行了详细分析。然后配套对应的案例分析,分别使用 Java 代码和 Scala 代码实现案例。最后通过两个项目演示了 Flink 在实际工作中的一些应用场景,帮助读者快 速掌握 Flink 开发。 学习本书需要大家具备一些大数据的基础知识,比如 Hadoop、Kafka、Redis、Elasticsearch 等框架 的基本安装和使用。本书也适合对大数据实时计算感兴趣的读者阅读。  著 徐 葳 责任编辑 陈聪聪 责任印制 焦志炜  人民邮电出版社出版发行 北京市丰台区成寿寺路 11 号 邮编 100164 电子邮件 315@ptpress.com.cn 网址 http://www.ptpress.com.cn 北京鑫正大印刷有限公司印刷  开本:8001000 1/16 印张:15 字数:264 千字 2019 年 10 月第 1 版 印数:1 – 2 400 册 2019 年 10 月北京第 1 次印刷 定价:59.00 元 读者服务热线:(010)81055410 印装质量热线:(010)81055316 反盗版热线:(010)81055315 广告经营许可证:京东工商广登字 20170147 号
前言 Flink项目是大数据计算领域冉冉升起的一颗新星。大数据计算引擎的发展经历了几 个过程,从第1代的MapReduce,到第2代基于有向无环图的Tez,第3代基于内存计算的 Spark,再到第4代的Flink。因为Flink可以基于Hadoop进行开发和使用,所以Flink并不 会取代Hadoop,而是和Hadoop紧密结合。 Flink主要包括DataStream API、DataSet API、Table API、SQL、Graph API和FlinkML等。 现在Flink也有自己的生态圈,涉及离线数据处理、实时数据处理、SQL操作、图计算和机 器学习库等。 本书共分11章,每章的主要内容如下。 第1~2章主要针对Flink的原理组件进行分析,其中包括针对Storm、Spark Streaming 和Flink这3个实时计算框架进行对比和分析,以及快速实现Flink的入门案例开发。 第3章主要介绍Flink的安装部署,包含Flink的几种部署模式:本地模式、Standalone 模式和YARN模式。本章主要针对YARN模式进行了详细分析,因为在实际工作中以 YARN模式为主,这样可以充分利用现有集群资源。 第4章主要针对DataStream和DataSet中的相关组件及API进行详细分析,并对Table API和SQL操作进行了基本的分析。 第 5~9 章主要针对 Flink 的一些高级特性进行了详细的分析,包含 Broadcast、 Accumulator、Distributed Cache、State、CheckPoint、StateBackend、SavePoint、Window、Time、 Watermark以及Flink中的并行度。 第10章主要介绍常用组件Kafka-Connector,针对Kafka Consumer和Kafka Producer的 使用结合具体案例进行分析,并描述了Kafka的容错机制的应用。
 前言2 第 11章介绍Flink在实际工作中的两个应用场景:一个是实时数据清洗 (实时ETL), 另一个是实时数据报表,通过这两个项目实战可以加深对Flink的理解。 感谢所有在本书编写过程中提出宝贵意见的朋友。作者水平有限,书中如有不足之处 还望指出并反馈至邮箱xuwei@xuwei.tech,作者将不胜感激。
资源与支持 本书由异步社区出品,社区(https://www.epubit.com/)为您提供相关资源和后续服务。 配套资源 本书提供如下资源: 本书配套资源请到异步社区本书购买页处下载。 要获得以上配套资源,请在异步社区本书页面中单击 ,跳转到下载界面,按 提示进行操作即可。注意:为保证购书读者的权益,该操作会给出相关提示,要求输入提 取码进行验证。 提交勘误 作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现 的问题反馈给我们,帮助我们提升图书的质量。 当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,单击“提交勘误”, 输入勘误信息,单击“提交”按钮即可(见下图)。本书的作者和编辑会对您提交的勘误进 行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、 样书或奖品。
与我们联系 我们的联系邮箱是contact@epubit.com.cn。 如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书 名,以便我们更高效地做出反馈。 如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可 以发邮件给我们;有意出版图书的作者也可以到异步社区在线提交投稿(直接访问www. epubit.com/selfpublish/submission即可)。 如果所在的学校、培训机构或企业想批量购买本书,或异步社区出版的其他图书,也 可以发邮件给我们。 如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部 或部分内容的非授权传播,请您将怀疑有侵权行为的链接发邮件给我们。您的这一举动是 对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。 关于异步社区和异步图书 “异步社区”是人民邮电出版社旗下 IT专业图书社区,致力于出版精品 IT技术图书和 相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品 IT技术图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网 https://www.epubit.com。 “异步图书”是由异步社区编辑团队策划出版的精品 IT专业图书的品牌,依托于人民 邮电出版社近30年的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步 图书的LOGO。异步图书的出版领域包括软件开发、大数据、 AI、测试、前端、网络技术等。 异步社区 微信服务号
目录 第1章 Flink概述 …………………………………………………………………… 1 1.1 Flink原理分析 …………………………………………………………………………… 1 1.2 Flink架构分析 …………………………………………………………………………… 2 1.3 Flink基本组件 …………………………………………………………………………… 3 1.4 Flink流处理(Streaming)与批处理(Batch) ………………………………………… 4 1.5 Flink典型应用场景分析 ………………………………………………………………… 5 1.6 流式计算框架对比 ……………………………………………………………………… 6 1.7 工作中如何选择实时计算框架 ………………………………………………………… 8 第2章 Flink快速入门 ……………………………………………………………… 9 2.1 Flink开发环境分析 ……………………………………………………………………… 9 2.1.1 开发工具推荐 …………………………………………………………………… 9 2.1.2 Flink程序依赖配置 ………………………………………………………………10 2.2 Flink程序开发步骤 ………………………………………………………………………11 2.3 Flink流处理(Streaming)案例开发 ……………………………………………………11 2.3.1 Java代码开发 ……………………………………………………………………12 2.3.2 Scala代码开发 ……………………………………………………………………14 2.3.3 执行程序 …………………………………………………………………………16 2.4 Flink批处理(Batch)案例开发 …………………………………………………………16 2.4.1 Java代码开发 ……………………………………………………………………16 2.4.2 Scala代码开发 ……………………………………………………………………18
 目录2 2.4.3 执行程序 …………………………………………………………………………19 第3章 Flink的安装和部署 ……………………………………………………… 20 3.1 Flink本地模式 ……………………………………………………………………………20 3.2 Flink集群模式 ……………………………………………………………………………22 3.2.1 Standalone模式 ……………………………………………………………………23 3.2.2 Flink on Yarn模式 …………………………………………………………………26 3.2.3 yarn-session.sh命令分析 …………………………………………………………30 3.2.4 Flink run命令分析 ………………………………………………………………30 3.3 Flink代码生成 JAR包 ……………………………………………………………………31 3.4 Flink HA的介绍和使用 …………………………………………………………………35 3.4.1 Flink HA …………………………………………………………………………35 3.4.2 Flink Standalone集群的HA安装和配置 …………………………………………35 3.4.3 Flink on Yarn集群HA的安装和配置 ……………………………………………50 3.5 Flink Scala Shell …………………………………………………………………………53 第4章 Flink常用API详解 ………………………………………………………… 56 4.1 Flink API的抽象级别分析 ………………………………………………………………56 4.2 Flink DataStream的常用API ……………………………………………………………57 4.2.1 DataSource …………………………………………………………………………57 4.2.2 Transformation ……………………………………………………………………66 4.2.3 Sink ………………………………………………………………………………70 4.3 Flink DataSet的常用API分析 ……………………………………………………………80 4.3.1 DataSource …………………………………………………………………………80 4.3.2 Transformation ……………………………………………………………………81 4.3.3 Sink ………………………………………………………………………………82 4.4 Flink Table API和SQL的分析及使用 ……………………………………………………82 4.4.1 Table API和SQL的基本使用 ……………………………………………………83 4.4.2 DataStream、DataSet和Table之间的转换 ………………………………………87 4.4.3 Table API和SQL的案例 …………………………………………………………91 4.5 Flink支持的DataType分析 ………………………………………………………………97 4.6 Flink序列化分析 …………………………………………………………………………97
目录  3 第5章 Flink高级功能的使用 …………………………………………………… 99 5.1 Flink Broadcast ……………………………………………………………………………99 5.2 Flink Accumulator ……………………………………………………………………… 104 5.3 Flink Broadcast和Accumulator的区别 ……………………………………………… 108 5.4 Flink Distributed Cache ………………………………………………………………… 108 第6章 Flink State管理与恢复 ……………………………………………………112 6.1 State …………………………………………………………………………………… 112 6.1.1 Keyed State …………………………………………………………………… 113 6.1.2 Operator State ………………………………………………………………… 115 6.2 State的容错 …………………………………………………………………………… 116 6.3 CheckPoint ……………………………………………………………………………… 118 6.4 StateBackend …………………………………………………………………………… 119 6.5 Restart Strategy ………………………………………………………………………… 121 6.6 SavePoint ……………………………………………………………………………… 123 第7章 Flink窗口详解 ……………………………………………………………125 7.1 Window ………………………………………………………………………………… 125 7.2 Window的使用 ………………………………………………………………………… 126 7.2.1 Time Window …………………………………………………………………… 127 7.2.2 Count Window ………………………………………………………………… 128 7.2.3 自定义Window ………………………………………………………………… 129 7.3 Window聚合分类 ……………………………………………………………………… 130 7.3.1 增量聚合 ……………………………………………………………………… 130 7.3.2 全量聚合 ……………………………………………………………………… 132 第8章 Flink Time详解 ……………………………………………………………134 8.1 Time …………………………………………………………………………………… 134 8.2 Flink如何处理乱序数据 ……………………………………………………………… 135 8.2.1 Watermark ……………………………………………………………………… 136
 目录4 8.2.2 Watermark的生成方式 ………………………………………………………… 137 8.3 EventTime+Watermark解决乱序数据的案例详解 …………………………………… 138 8.3.1 实现Watermark的相关代码 …………………………………………………… 138 8.3.2 通过数据跟踪Watermark的时间 ……………………………………………… 142 8.3.3 利用Watermark+Window处理乱序数据 ……………………………………… 149 8.3.4 Late Element的处理方式 ……………………………………………………… 153 8.3.5 在多并行度下的Watermark应用 ……………………………………………… 163 8.3.6 With Periodic Watermarks案例总结 …………………………………………… 165 第9章 Flink并行度详解 …………………………………………………………166 9.1 Flink并行度 …………………………………………………………………………… 166 9.2 TaskManager和Slot …………………………………………………………………… 166 9.3 并行度的设置 ………………………………………………………………………… 167 9.3.1 并行度设置之Operator Level ………………………………………………… 168 9.3.2 并行度设置之Execution Environment Level ………………………………… 168 9.3.3 并行度设置之Client Level …………………………………………………… 169 9.3.4 并行度设置之System Level …………………………………………………… 169 9.4 并行度案例分析 ……………………………………………………………………… 169 第10章 Flink Kafka Connector详解 ……………………………………………172 10.1 Kafka Connector ……………………………………………………………………… 172 10.2 Kafka Consumer ……………………………………………………………………… 173 10.2.1 Kafka Consumer消费策略设置 ……………………………………………… 173 10.2.2 Kafka Consumer的容错 ……………………………………………………… 175 10.2.3 动态加载Topic ……………………………………………………………… 176 10.2.4 Kafka Consumer Offset自动提交 …………………………………………… 177 10.3 Kafka Producer ……………………………………………………………………… 177 10.3.1 Kafka Producer的使用 ……………………………………………………… 177 10.3.2 Kafka Producer的容错 ……………………………………………………… 179
目录  5 第11章 Flink实战项目开发 ………………………………………………………184 11.1 实时数据清洗(实时ETL) ………………………………………………………… 184 11.1.1 需求分析 ……………………………………………………………………… 184 11.1.2 项目架构设计 ………………………………………………………………… 184 11.1.3 项目代码实现 ………………………………………………………………… 186 11.2 实时数据报表 ………………………………………………………………………… 205 11.2.1 需求分析 ……………………………………………………………………… 205 11.2.2 项目架构设计 ………………………………………………………………… 206 11.2.3 项目代码实现 ………………………………………………………………… 207
第1章 Flink概述 本章讲解Flink的基本原理,主要包含Flink原理及架构分析、Flink组件介绍、Flink中 的流处理和批处理的对比、Flink的一些典型应用场景分析,以及Flink和其他流式计算框架 的区别等。 1.1 Flink原理分析 很多人是在2015年才听到Flink这个词的,其实早在2008年,Flink的前身就已经是柏 林理工大学的一个研究性项目,在2014年这个项目被Apache孵化器所接受后,Flink迅速 成为ASF(Apache Software Foundation)的顶级项目之一。截至目前,Flink的版本经过了多 次更新,本书基于1.6版本写作。 Flink是一个开源的流处理框架,它具有以下特点。  分布式:Flink程序可以运行在多台机器上。  高性能:处理性能比较高。  高可用:由于Flink程序本身是稳定的,因此它支持高可用性(High Availability,HA)。  准确:Flink可以保证数据处理的准确性。 Flink主要由 Java代码实现,它同时支持实时流处理和批处理。对于Flink而言,作为 一个流处理框架,批数据只是流数据的一个极限特例而已。此外,Flink还支持迭代计算、
 第1章 Flink概述2 内存管理和程序优化,这是它的原生特性。 由图1.1可知,Flink的功能特性如下。  流式优先:Flink可以连续处理流式数据。  容错:Flink提供有状态的计算,可以记录数据的处理状态,当数据处理失败的时 候,能够无缝地从失败中恢复,并保持Exactly-once。  可伸缩:Flink中的一个集群支持上千个节点。  性能:Flink支持高吞吐、低延迟。 在这里解释一下,高吞吐表示单位时间内可以处理的数据量很大,低延迟表示数据产 生以后可以在很短的时间内对其进行处理,也就是Flink可以支持快速地处理海量数据。 图1.1 Flink的功能特性 1.2 Flink架构分析 Flink架构可以分为4层,包括Deploy层、Core层、API层和Library层,如图1.2所示。  Deploy层:该层主要涉及Flink的部署模式,Flink支持多种部署模式—本地、集 群(Standalone/YARN)和云服务器(GCE/EC2)。  Core层:该层提供了支持Flink计算的全部核心实现,为API层提供基础服务。
1.3 Flink基本组件  3  API层:该层主要实现了面向无界Stream的流处理和面向Batch的批处理API,其 中流处理对应DataStream API,批处理对应DataSet API。  Library层:该层也被称为Flink应用框架层,根据API层的划分,在API层之上 构建的满足特定应用的实现计算框架,也分别对应于面向流处理和面向批处理 两类。面向流处理支持CEP(复杂事件处理)、基于SQL-like的操作(基于Table 的关系操作);面向批处理支持 FlinkML(机器学习库)、Gelly(图处理)、Table 操作。 从图 1.2可知, Flink对底层的一些操作进行了封装,为用户提供了DataStream API 和 DataSet API。使用这些 API 可以很方便地完成一些流数据处理任务和批数据处理 任务。 图1.2 Flink架构 1.3 Flink基本组件 读者应该对Hadoop和Storm程序有所了解,在Hadoop中实现一个MapReduce需要两 个阶段—Map和Reduce,而在Storm中实现一个Topology则需要Spout和Bolt组件。因 此,如果我们想实现一个Flink任务的话,也需要有类似的逻辑。 Flink中提供了3个组件,包括DataSource、Transformation和DataSink。
 第1章 Flink概述4  DataSource :表示数据源组件,主要用来接收数据,目前官网提供了 readTextFile、 socketTextStream、fromCollection以及一些第三方的Source。  Transformation :表示算子,主要用来对数据进行处理,比如Map、FlatMap、Filter、 Reduce、Aggregation等。  DataSink :表示输出组件,主要用来把计算的结果输出到其他存储介质中,比如 writeAsText以及Kafka、Redis、Elasticsearch等第三方Sink组件。 因此,想要组装一个Flink Job,至少需要这3个组件。 Flink Job=DataSource+Transformation+DataSink 1.4 Flink流处理(Streaming)与批处理(Batch) 在大数据处理领域,批处理与流处理一般被认为是两种截然不同的任务,一个大 数据框架一般会被设计为只能处理其中一种任务。比如,Storm只支持流处理任务,而 MapReduce、Spark只支持批处理任务。Spark Streaming是Apache Spark之上支持流处理任务 的子系统,这看似是一个特例,其实不然—Spark Streaming采用了一种Micro-Batch架 构,即把输入的数据流切分成细粒度的Batch,并为每一个Batch数据提交一个批处理的 Spark任务,所以Spark Streaming本质上还是基于Spark批处理系统对流式数据进行处理, 和Storm等完全流式的数据处理方式完全不同。 通过灵活的执行引擎,Flink能够同时支持批处理任务与流处理任务。在执行引擎层级, 流处理系统与批处理系统最大的不同在于节点间的数据传输方式。 如图1.3所示,对于一个流处理系统,其节点间数据传输的标准模型是,在处理完成 一条数据后,将其序列化到缓存中,并立刻通过网络传输到下一个节点,由下一个节点继 续处理。而对于一个批处理系统,其节点间数据传输的标准模型是,在处理完成一条数据 后,将其序列化到缓存中,当缓存写满时,就持久化到本地硬盘上;在所有数据都被处理 完成后,才开始将其通过网络传输到下一个节点。 这两种数据传输模式是两个极端,对应的是流处理系统对低延迟和批处理系统对高 吞吐的要求。Flink的执行引擎采用了一种十分灵活的方式,同时支持了这两种数据传输 模型。
1.5 Flink典型应用场景分析  5 图1.3 Flink的3种数据传输模型 Flink以固定的缓存块为单位进行网络数据传输,用户可以通过设置缓存块超时值指 定缓存块的传输时机。如果缓存块的超时值为0,则Flink的数据传输方式类似于前面所提 到的流处理系统的标准模型,此时系统可以获得最低的处理延迟;如果缓存块的超时值为 无限大,则Flink的数据传输方式类似于前面所提到的批处理系统的标准模型,此时系统 可以获得最高的吞吐量。 缓存块的超时值也可以设置为 0到无限大之间的任意值,缓存块的超时阈值越小, Flink流处理执行引擎的数据处理延迟就越低,但吞吐量也会降低,反之亦然。通过调整 缓存块的超时阈值,用户可根据需求灵活地权衡系统延迟和吞吐量。 1.5 Flink典型应用场景分析 Flink主要应用于流式数据分析场景,目前涉及如下领域。  实时ETL :集成流计算现有的诸多数据通道和SQL灵活的加工能力,对流式数据 进行实时清洗、归并和结构化处理;同时,对离线数仓进行有效的补充和优化, 并为数据实时传输提供可计算通道。
 第1章 Flink概述6  实时报表:实时化采集、加工流式数据存储;实时监控和展现业务、客户各类指标, 让数据化运营实时化。  监控预警:对系统和用户行为进行实时检测和分析,以便及时发现危险行为。  在线系统:实时计算各类数据指标,并利用实时结果及时调整在线系统的相关策 略,在各类内容投放、无线智能推送领域有大量的应用。 Flink在如下类型的公司中有具体的应用。  优化电商网站的实时搜索结果:阿里巴巴的基础设施团队使用Flink实时更新产品 细节和库存信息(Blink)。  针对数据分析团队提供实时流处理服务:通过Flink数据分析平台提供实时数据分 析服务,及时发现问题。  网络 /传感器检测和错误检测:Bouygues电信公司是法国著名的电信供应商,使 用Flink监控其有线和无线网络,实现快速故障响应。  商业智能分析ETL :Zalando使用Flink转换数据以便于将其加载到数据仓库,简 化复杂的转换操作,并确保分析终端用户可以更快地访问数据(实时ETL)。 1.6 流式计算框架对比 Storm是比较早的流式计算框架,后来又出现了Spark Streaming和Trident,现在又出 现了Flink这种优秀的实时计算框架,那么这几种计算框架到底有什么区别呢?下面我们 来详细分析一下,如表1.1所示。 表1.1 流式计算框架对比 产品 模型 API 保证次数 容错机制 状态管理 延时 吞吐量 Storm Native(数据进 入立即处理) 组合式(基础 API) At-least-once (至少一次) Record ACK (ACK机制) 无 低 低 Trident Micro-Batching (划分为小批 处理) 组合式 Exactly-once (仅一次) Record ACK 基于操作 (每次操 作有一个 状态) 中等 中等
1.6 流式计算框架对比  7 产品 模型 API 保证次数 容错机制 状态管理 延时 吞吐量 Spark Streaming Micro-Batching 声明式(提供 封装后的高 阶函数,如 count函数) Exactly-once RDD CheckPoint (基于 RDD做 CheckPoint) 基于 DStream 中等 高 Flink Native 声明式 Exactly-once CheckPoint (Flink的一 种快照) 基于操作 低 高 在这里对这几种框架进行对比。  模型:Storm和Flink是真正的一条一条处理数据;而Trident(Storm的封装框架) 和Spark Streaming其实都是小批处理,一次处理一批数据(小批量)。  API :Storm和Trident都使用基础API进行开发,比如实现一个简单的sum求和操作; 而Spark Streaming和Flink中都提供封装后的高阶函数,可以直接拿来使用,这样就 比较方便了。  保证次数:在数据处理方面,Storm可以实现至少处理一次,但不能保证仅处理一 次,这样就会导致数据重复处理问题,所以针对计数类的需求,可能会产生一些 误差;Trident通过事务可以保证对数据实现仅一次的处理,Spark Streaming和Flink 也是如此。  容错机制:Storm和Trident可以通过ACK机制实现数据的容错机制,而 Spark Streaming和Flink可以通过CheckPoint机制实现容错机制。  状态管理:Storm中没有实现状态管理,Spark Streaming实现了基于DStream的状态 管理,而Trident和Flink实现了基于操作的状态管理。  延时:表示数据处理的延时情况,因此Storm和Flink接收到一条数据就处理一条 数据,其数据处理的延时性是很低的;而Trident和Spark Streaming都是小型批处 理,它们数据处理的延时性相对会偏高。  吞吐量:Storm的吞吐量其实也不低,只是相对于其他几个框架而言较低;Trident 属于中等;而Spark Streaming和Flink的吞吐量是比较高的。 官网中Flink和Storm的吞吐量对比如图1.4所示。 续表
 第1章 Flink概述8 图1.4 Flink和Storm的吞吐量对比 1.7 工作中如何选择实时计算框架 前面我们分析了 3种实时计算框架,那么公司在实际操作时到底选择哪种技术框架 呢?下面我们来分析一下。  需要关注流数据是否需要进行状态管理,如果是,那么只能在 Trident、Spark Streaming和Flink中选择一个。  需要考虑项目对At-least-once(至少一次)或者Exactly-once(仅一次)消息投递模 式是否有特殊要求,如果必须要保证仅一次,也不能选择Storm。  对于小型独立的项目,并且需要低延迟的场景,建议使用Storm,这样比较简单。  如果你的项目已经使用了Spark,并且秒级别的实时处理可以满足需求的话,建 议使用Spark Streaming  要求消息投递语义为Exactly-once ;数据量较大,要求高吞吐低延迟;需要进行 状态管理或窗口统计,这时建议使用Flink。
The above is a preview of the first 20 pages. Register to read the complete e-book.