Flink原理、实战与性能优化(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-23 23:55:17

点击下载

作者:张利兵

出版社:机械工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Flink原理、实战与性能优化

Flink原理、实战与性能优化试读:

前言

为什么要写这本书

记得在几年前刚开始做流式计算相关的项目时,发觉项目对实时性和数据量的要求很高,无奈求助于Flink开源社区(后文简称“社区”),在社区中发现可以使用的流式框架有很多,例如比较主流的框架Apache Storm、Spark Streaming等,Apache Flink(简称“Flink”)也在其中。于是笔者开始对各种流式框架进行详细研究,最后发现能同时支持低延迟、高吞吐、Excactly-once的框架只有Apache Flink,从那时起笔者就对Flink这套框架充满兴趣,不管是其架构还是接口,都可以发现其中包含了非常优秀的设计思想。虽然当时Flink在社区的成熟度并不是很高,但笔者还是决定将Flink应用在自己的项目中,自此开启了Flink分布式计算技术应用之旅。

刚开始学习Flink,对于没有分布式处理技术和流式计算经验的人来说会相对比较困难,因为其很难理解有状态计算、数据一致性保障等概念。尤其在相关中文资源比较匮乏的情况下,需要用户在官网以及国外的技术网站中翻阅大量的外文资料,这在一定程度上对学习和应用Flink造成了阻碍。笔者在2018年参加了一场由Flink中文社区组织的线下交流活动,当时听了很多领域内专家将Flink应用在不同业务场景中的分享,发现Flink这项技术虽然优秀,但是国内尚未有一本能够全面介绍Flink的中文书籍,于是笔者决定结合自己的实际项目经验来完成一本Flink中文书籍,以帮助他人学习和使用Flink这项优秀的分布式处理技术。

阿里巴巴在2018年1月开源了其内部Flink的分支项目Blink,并推动社区将Blink中优秀的特性合并到Flink主干版本中,一时间Flink在国内的发展被推向了高潮,成为很多公司想去尝试使用的新技术。因此笔者相信未来会有更多的开发者参与到Flink社区中来,Flink也将在未来的大数据生态中占据举足轻重的位置。读者对象

本书从多个方面对Flink进行了深入介绍,包括原理、多种抽象接口的使用,以及Flink的性能监控与调优等方面,因此本书比较适合以下类型的读者。

·流计算开发工程师

·大数据架构工程师

·大数据开发工程师

·数据挖掘工程师

·高校研究生以及高年级本科生如何阅读本书

本书共分为10章,各章节间具有一定的先后关系,对于刚入门的读者,建议从第1章开始循序渐进地学习。

对于有一定经验的读者可以自行选择章节开始学习。如果想使用Flink开发流式应用,则可以直接阅读第4章、第5章,以及第7章之后的内容;如果想使用Flink开发批计算应用,则可以选择阅读第5章以及第7章之后的内容。勘误和支持

除封面署名外,参加本书编写工作的还有:张再胜、尚越、程龙、姚远等。由于笔者水平有限,编写时间仓促,书中难免会出现一些错误或者不准确的地方,恳请读者批评指正。由于Flink技术的参考资料相对较少,因此书中有些地方参考了Flink官方文档,读者也可以结合Flink官网来学习。书中的全部源文件可以从GitHub网站下载,地址为https://github.com/zhanglibing1990/learning-flink。同时笔者也会将相应的功能及时更新。如果你有更多宝贵的意见可以通过QQ群686656574或电子邮箱zhanglibing1990@126.com联系笔者,期待能够得到你们的真挚反馈。致谢

在本书的写作过程中,得到了很多朋友及同事的帮助和支持,在此表示衷心感谢!

感谢我的女朋友,因为有你的支持,我才能坚持将本书顺利完成,谢谢你一直陪伴在我的身边,不断鼓励我前行。

感谢机械工业出版社华章公司的编辑杨福川和张锡鹏,在这半年多的时间中始终支持我的写作,你们的鼓励和帮助引导我顺利完成全部书稿。

谨以此书献给我最亲爱的家人,以及众多热爱Flink的朋友!总结

本书最开始介绍Flink的发展历史,然后对Flink批数据和流数据的不同处理接口进行介绍,再对Flink的部署与实施、性能优化等方面进行全面讲解。经过系统完整地了解和学习Flink分布式处理技术之后,可以发现Flink有很多非常先进的概念,以及非常完善的接口设计,这些都能让用户更加有效地处理大数据,特别是流式数据处理。随着大数据技术的不断发展,Flink也在大数据的浪潮中奋勇前行。越来越多的用户也参与到Flink社区的开发中,尤其是近年来随着阿里巴巴的推进,Blink的开源在一定程度上推动了Flink在国内大规模的落地。相信在不久的将来,Flink会逐渐成为国内乃至全球不可或缺的分布式处理引擎,笔者也相信Flink在流式数据处理领域会有新的突破,能够改变目前大部分基于批处理的模式,让分布式数据处理变得更加高效,使得数据处理成本不断降低。张利兵2019年  第1章 Apache Flink介绍

本章对Apache Flink从多个方面进行介绍,让读者对Flink这项分布式处理技术能够有初步的了解。1.1节主要介绍了Flink的由来及其发展历史,帮助读者从历史的角度了解Flink这项技术发展的过程。1.2节重点介绍了Flink能够支持的各种实际业务场景、Flink所具备的主要特性、Flink组成部分及其基本概念等内容,最后在1.4节中介绍了Flink的基本架构以及主要组成部分。1.1 Apache Flink是什么

在当前数据量激增的时代,各种业务场景都有大量的业务数据产生,对于这些不断产生的数据应该如何进行有效的处理,成为当下大多数公司所面临的问题。随着雅虎对Hadoop的开源,越来越多的大数据处理技术开始涌入人们的视线,例如目前比较流行的大数据处理引擎Apache Spark,基本上已经取代了MapReduce成为当前大数据处理的标准。但随着数据的不断增长,新技术的不断发展,人们逐渐意识到对实时数据处理的重要性。相对于传统的数据处理模式,流式数据处理有着更高的处理效率和成本控制能力。Apache Flink就是近年来在开源社区不断发展的技术中的能够同时支持高吞吐、低延迟、高性能的分布式处理框架。

在2010年至2014年间,由柏林工业大学、柏林洪堡大学和哈索普拉特纳研究所联合发起名为“Stratosphere:Information Management on the Cloud”研究项目,该项目在当时的社区逐渐具有了一定的社区知名度。2014年4月,Stratosphere代码被贡献给Apache软件基金会,成为Apache基金会孵化器项目。初期参与该项目的核心成员均是Stratosphere曾经的核心成员,之后团队的大部分创始成员离开学校,共同创办了一家名叫Data Artisans的公司,其主要业务便是将Stratosphere,也就是之后的Flink实现商业化。在项目孵化期间,项目Stratosphere改名为Flink。Flink在德语中是快速和灵敏的意思,用来体现流式数据处理器速度快和灵活性强等特点,同时使用棕红色松鼠图案作为Flink项目的Logo,也是为了突出松鼠灵活快速的特点,由此,Flink正式进入社区开发者的视线。

2014年12月,该项目成为Apache软件基金会顶级项目,从2015年9月发布第一个稳定版本0.9,到目前撰写本书期间已经发布到1.7的版本,更多的社区开发成员逐步加入,现在Flink在全球范围内拥有350多位开发人员,不断有新的特性发布。同时在全球范围内,越来越多的公司开始使用Flink,在国内比较出名的互联网公司如阿里巴巴、美团、滴滴等,都在大规模使用Flink作为企业的分布式大数据处理引擎。

Flink近年来逐步被人们所熟知,不仅是因为Flink提供同时支持高吞吐、低延迟和exactly-once语义的实时计算能力,同时Flink还提供了基于流式计算引擎处理批量数据的计算能力,真正意义上实现了批流统一,同时随着阿里对Blink的开源,极大地增强了Flink对批计算领域的支持。众多优秀的特性,使得Flink成为开源大数据数据处理框架中的一颗新星,随着国内社区不断推动,越来越多的国内公司开始选择使用Flink作为实时数据处理技术。在不久的将来,Flink也将会成为企业内部主流的数据处理框架,最终成为下一代大数据处理的标准。1.2 数据架构的演变

近年来随着开源社区的发展,越来越多新的技术被开源,例如雅虎的Hadoop分布式计算框架、UC伯克利分校的Apache Spark等,而伴随着这些技术的发展,促使着企业数据架构的演进,从传统的关系型数据存储架构,逐步演化为分布式处理和存储的架构。1.2.1 传统数据基础架构

如图1-1所示,传统单体数据架构(Monolithic Architecture)最大的特点便是集中式数据存储,企业内部可能有诸多的系统,例如Web业务系统、订单系统、CRM系统、ERP系统、监控系统等,这些系统的事务性数据主要基于集中式的关系性数据库(DBMS)实现存储,大多数将架构分为计算层和存储层。存储层负责企业内系统的数据访问,且具有最终数据一致性保障。这些数据反映了当前的业务状态,例如系统的订单交易量、网站的活跃用户数、每个用户的交易额变化等,所有的更新操作均需要借助于同一套数据库实现。图1-1 传统数据结构

单体架构的初期效率很高,但是随着时间的推移,业务越来越多,系统逐渐变得很大,越来越难以维护和升级,数据库是唯一的准确数据源,每个应用都需要访问数据库来获取对应的数据,如果数据库发生改变或者出现问题,则将对整个业务系统产生影响。

后来随着微服务架构(Microservices Architecture)的出现,企业开始逐渐采用微服务作为企业业务系统的架构体系。微服务架构的核心思想是,一个应用是由多个小的、相互独立的微服务组成,这些服务运行在自己的进程中,开发和发布都没有依赖。不同的服务能依据不同的业务需求,构建的不同的技术架构之上,能够聚焦在有限的业务功能。

如图1-2所示,微服务架构将系统拆解成不同的独立服务模块,每个模块分别使用各自独立的数据库,这种模式解决了业务系统拓展的问题,但是也带来了新的问题,那就是业务交易数据过于分散在不同的系统中,很难将数据进行集中化管理,对于企业内部进行数据分析或者数据挖掘之类的应用,则需要通过从不同的数据库中进行数据抽取,将数据从数据库中周期性地同步到数据仓库中,然后在数据仓库中进行数据的抽取、转换、加载(ETL),从而构建成不同的数据集市和应用,提供给业务系统使用。图1-2 微服务架构1.2.2 大数据数据架构

起初数据仓库主要还是构建在关系型数据库之上,例如Oracle、Mysql等数据库,但是随着企业数据量的增长,关系型数据库已经无法支撑大规模数据集的存储和分析,因此越来越多的企业开始选择基于Hadoop构建企业级大数据平台。同时众多Sql-On-Hadoop技术方案的提出,也让企业在Hadoop上构建不同类型的数据应用变得简单而高效,例如通过使用Apache Hive进行数据ETL处理,通过使用Apache Impala进行实时交互性查询等。

大数据技术的兴起,让企业能够更加灵活高效地使用自己的业务数据,从数据中提取出更多重要的价值,并将数据分析和挖掘出来的结果应用在企业的决策、营销、管理等应用领域。但不可避免的是,随着越来越多新技术的引入与使用,企业内部一套大数据管理平台可能会借助众多开源技术组件实现。例如在构建企业数据仓库的过程中,数据往往都是周期性的从业务系统中同步到大数据平台,完成一系列ETL转换动作之后,最终形成数据集市等应用。但是对于一些时间要求比较高的应用,例如实时报表统计,则必须有非常低的延时展示统计结果,为此业界提出一套Lambda架构方案来处理不同类型的数据。例图1-3所示,大数据平台中包含批量计算的Batch Layer和实时计算的Speed Layer,通过在一套平台中将批计算和流计算整合在一起,例如使用Hadoop MapReduce进行批量数据的处理,使用Apache Storm进行实时数据的处理。这种架构在一定程度上解决了不同计算类型的问题,但是带来的问题是框架太多会导致平台复杂度过高、运维成本高等。在一套资源管理平台中管理不同类型的计算框架使用也是非常困难的事情。总而言之,Lambda架构是构建大数据应用程序的一种很有效的解决方案,但是还不是最完美的方案。图1-3 大数据Lambada架构

后来随着Apache Spark的分布式内存处理框架的出现,提出了将数据切分成微批的处理模式进行流式数据处理,从而能够在一套计算框架内完成批量计算和流式计算。但因为Spark本身是基于批处理模式的原因,并不能完美且高效地处理原生的数据流,因此对流式计算支持的相对较弱,可以说Spark的出现本质上是在一定程度上对Hadoop架构进行了一定的升级和优化。1.2.3 有状态流计算架构

数据产生的本质,其实是一条条真实存在的事件,前面提到的不同的架构其实都是在一定程度违背了这种本质,需要通过在一定时延的情况下对业务数据进行处理,然后得到基于业务数据统计的准确结果。实际上,基于流式计算技术局限性,我们很难在数据产生的过程中进行计算并直接产生统计结果,因为这不仅对系统有非常高的要求,还必须要满足高性能、高吞吐、低延时等众多目标。而有状态流计算架构(如图1-4所示)的提出,从一定程度上满足了企业的这种需求,企业基于实时的流式数据,维护所有计算过程的状态,所谓状态就是计算过程中产生的中间计算结果,每次计算新的数据进入到流式系统中都是基于中间状态结果的基础上进行运算,最终产生正确的统计结果。基于有状态计算的方式最大的优势是不需要将原始数据重新从外部存储中拿出来,从而进行全量计算,因为这种计算方式的代价可能是非常高的。从另一个角度讲,用户无须通过调度和协调各种批量计算工具,从数据仓库中获取数据统计结果,然后再落地存储,这些操作全部都可以基于流式计算完成,可以极大地减轻系统对其他框架的依赖,减少数据计算过程中的时间损耗以及硬件存储。图1-4 有状态计算架构

如果计算的结果能保持一致,实时计算在很短的时间内统计出结果,批量计算则需要等待一定时间才能得出,相信大多数用户会更加倾向于选择使用有状态流进行大数据处理。1.2.4 为什么会是Flink

可以看出有状态流计算将会逐步成为企业作为构建数据平台的架构模式,而目前从社区来看,能够满足的只有Apache Flink。Flink通过实现Google Dataflow流式计算模型实现了高吞吐、低延迟、高性能兼具实时流式计算框架。同时Flink支持高度容错的状态管理,防止状态在计算过程中因为系统异常而出现丢失,Flink周期性地通过分布式快照技术Checkpoints实现状态的持久化维护,使得即使在系统停机或者异常的情况下都能计算出正确的结果。

Flink具有先进的架构理念、诸多的优秀特性,以及完善的编程接口,而Flink也在每一次的Release版本中,不断推出新的特性,例如Queryable State功能的提出,容许用户通过远程的方式直接获取流式计算任务的状态信息,数据不需要落地数据库就能直接从Flink流式应用中查询。对于实时交互式的查询业务可以直接从Flink的状态中查询最新的结果。在未来,Flink将不仅作为实时流式处理的框架,更多的可能会成为一套实时的状态存储引擎,让更多的用户从有状态计算的技术中获益。

Flink的具体优势有以下几点。(1)同时支持高吞吐、低延迟、高性能

Flink是目前开源社区中唯一一套集高吞吐、低延迟、高性能三者于一身的分布式流式数据处理框架。像Apache Spark也只能兼顾高吞吐和高性能特性,主要因为在Spark Streaming流式计算中无法做到低延迟保障;而流式计算框架Apache Storm只能支持低延迟和高性能特性,但是无法满足高吞吐的要求。而满足高吞吐、低延迟、高性能这三个目标对分布式流式计算框架来说是非常重要的。(2)支持事件时间(Event Time)概念

在流式计算领域中,窗口计算的地位举足轻重,但目前大多数框架窗口计算采用的都是系统时间(Process Time),也是事件传输到计算框架处理时,系统主机的当前时间。Flink能够支持基于事件时间(Event Time)语义进行窗口计算,也就是使用事件产生的时间,这种基于事件驱动的机制使得事件即使乱序到达,流系统也能够计算出精确的结果,保持了事件原本产生时的时序性,尽可能避免网络传输或硬件系统的影响。(3)支持有状态计算

Flink在1.4版本中实现了状态管理,所谓状态就是在流式计算过程中将算子的中间结果数据保存在内存或者文件系统中,等下一个事件进入算子后可以从之前的状态中获取中间结果中计算当前的结果,从而无须每次都基于全部的原始数据来统计结果,这种方式极大地提升了系统的性能,并降低了数据计算过程的资源消耗。对于数据量大且运算逻辑非常复杂的流式计算场景,有状态计算发挥了非常重要的作用。(4)支持高度灵活的窗口(Window)操作

在流处理应用中,数据是连续不断的,需要通过窗口的方式对流数据进行一定范围的聚合计算,例如统计在过去的1分钟内有多少用户点击某一网页,在这种情况下,我们必须定义一个窗口,用来收集最近一分钟内的数据,并对这个窗口内的数据进行再计算。Flink将窗口划分为基于Time、Count、Session,以及Data-driven等类型的窗口操作,窗口可以用灵活的触发条件定制化来达到对复杂的流传输模式的支持,用户可以定义不同的窗口触发机制来满足不同的需求。(5)基于轻量级分布式快照(Snapshot)实现的容错

Flink能够分布式运行在上千个节点上,将一个大型计算任务的流程拆解成小的计算过程,然后将tesk分布到并行节点上进行处理。在任务执行过程中,能够自动发现事件处理过程中的错误而导致数据不一致的问题,比如:节点宕机、网路传输问题,或是由于用户因为升级或修复问题而导致计算服务重启等。在这些情况下,通过基于分布式快照技术的Checkpoints,将执行过程中的状态信息进行持久化存储,一旦任务出现异常停止,Flink就能够从Checkpoints中进行任务的自动恢复,以确保数据在处理过程中的一致性。(6)基于JVM实现独立的内存管理

内存管理是所有计算框架需要重点考虑的部分,尤其对于计算量比较大的计算场景,数据在内存中该如何进行管理显得至关重要。针对内存管理,Flink实现了自身管理内存的机制,尽可能减少JVM GC对系统的影响。另外,Flink通过序列化/反序列化方法将所有的数据对象转换成二进制在内存中存储,降低数据存储的大小的同时,能够更加有效地对内存空间进行利用,降低GC带来的性能下降或任务异常的风险,因此Flink较其他分布式处理的框架会显得更加稳定,不会因为JVM GC等问题而影响整个应用的运行。(7)Save Points(保存点)

对于7*24小时运行的流式应用,数据源源不断地接入,在一段时间内应用的终止有可能导致数据的丢失或者计算结果的不准确,例如进行集群版本的升级、停机运维操作等操作。值得一提的是,Flink通过Save Points技术将任务执行的快照保存在存储介质上,当任务重启的时候可以直接从事先保存的Save Points恢复原有的计算状态,使得任务继续按照停机之前的状态运行,Save Points技术可以让用户更好地管理和运维实时流式应用。1.3 Flink应用场景

在实际生产的过程中,大量数据在不断地产生,例如金融交易数据、互联网订单数据、GPS定位数据、传感器信号、移动终端产生的数据、通信信号数据等,以及我们熟悉的网络流量监控、服务器产生的日志数据,这些数据最大的共同点就是实时从不同的数据源中产生,然后再传输到下游的分析系统。针对这些数据类型主要包括实时智能推荐、复杂事件处理、实时欺诈检测、实时数仓与ETL类型、流数据分析类型、实时报表类型等实时业务场景,而Flink对于这些类型的场景都有着非常好的支持。(1)实时智能推荐

智能推荐会根据用户历史的购买行为,通过推荐算法训练模型,预测用户未来可能会购买的物品。对个人来说,推荐系统起着信息过滤的作用,对Web/App服务端来说,推荐系统起着满足用户个性化需求,提升用户满意度的作用。推荐系统本身也在飞速发展,除了算法越来越完善,对时延的要求也越来越苛刻和实时化。利用Flink流计算帮助用户构建更加实时的智能推荐系统,对用户行为指标进行实时计算,对模型进行实时更新,对用户指标进行实时预测,并将预测的信息推送给Wep/App端,帮助用户获取想要的商品信息,另一方面也帮助企业提升销售额,创造更大的商业价值。(2)复杂事件处理

对于复杂事件处理,比较常见的案例主要集中于工业领域,例如对车载传感器、机械设备等实时故障检测,这些业务类型通常数据量都非常大,且对数据处理的时效性要求非常高。通过利用Flink提供的CEP(复杂事件处理)进行事件模式的抽取,同时应用Flink的Sql进行事件数据的转换,在流式系统中构建实时规则引擎,一旦事件触发报警规则,便立即将告警结果传输至下游通知系统,从而实现对设备故障快速预警监测,车辆状态监控等目的。(3)实时欺诈检测

在金融领域的业务中,常常出现各种类型的欺诈行为,例如信用卡欺诈、信贷申请欺诈等,而如何保证用户和公司的资金安全,是来近年来许多金融公司及银行共同面对的挑战。随着不法分子欺诈手段的不断升级,传统的反欺诈手段已经不足以解决目前所面临的问题。以往可能需要几个小时才能通过交易数据计算出用户的行为指标,然后通过规则判别出具有欺诈行为嫌疑的用户,再进行案件调查处理,在这种情况下资金可能早已被不法分子转移,从而给企业和用户造成大量的经济损失。而运用Flink流式计算技术能够在毫秒内就完成对欺诈判断行为指标的计算,然后实时对交易流水进行规则判断或者模型预测,这样一旦检测出交易中存在欺诈嫌疑,则直接对交易进行实时拦截,避免因为处理不及时而导致的经济损失。(4)实时数仓与ETL

结合离线数仓,通过利用流计算诸多优势和SQL灵活的加工能力,对流式数据进行实时清洗、归并、结构化处理,为离线数仓进行补充和优化。另一方面结合实时数据ETL处理能力,利用有状态流式计算技术,可以尽可能降低企业由于在离线数据计算过程中调度逻辑的复杂度,高效快速地处理企业需要的统计结果,帮助企业更好地应用实时数据所分析出来的结果。(5)流数据分析

实时计算各类数据指标,并利用实时结果及时调整在线系统相关策略,在各类内容投放、无线智能推送领域有大量的应用。流式计算技术将数据分析场景实时化,帮助企业做到实时化分析Web应用或者App应用的各项指标,包括App版本分布情况、Crash检测和分布等,同时提供多维度用户行为分析,支持日志自主分析,助力开发者实现基于大数据技术的精细化运营、提升产品质量和体验、增强用户黏性。(6)实时报表分析

实时报表分析是近年来很多公司采用的报表统计方案之一,其中最主要的应用便是实时大屏展示。利用流式计算实时得出的结果直接被推送到前端应用,实时显示出重要指标的变换情况。最典型的案例便是淘宝的双十一活动,每年双十一购物节,除疯狂购物外,最引人注目的就是天猫双十一大屏不停跳跃的成交总额。在整个计算链路中包括从天猫交易下单购买到数据采集、数据计算、数据校验,最终落到双十一大屏上展现的全链路时间压缩在5秒以内,顶峰计算性能高达数三十万笔订单/秒,通过多条链路流计算备份确保万无一失。而在其他行业,企业也在构建自己的实时报表系统,让企业能够依托于自身的业务数据,快速提取出更多的数据价值,从而更好地服务于企业运行过程中。1.4 Flink基本架构1.4.1 基本组件栈

在Flink整个软件架构体系中,同样遵循着分层的架构设计理念,在降低系统耦合度的同时,也为上层用户构建Flink应用提供了丰富且友好的接口。

从图1-5中可以看出整个Flink的架构体系基本上可以分为三层,由上往下依次是API&Libraries层、Runtime核心层以及物理部署层。

·API&Libraries层

作为分布式数据处理框架,Flink同时提供了支撑流计算和批计算的接口,同时在此基础之上抽象出不同的应用类型的组件库,如基于流处理的CEP(复杂事件处理库)、SQL&Table库和基于批处理的FlinkML(机器学习库)等、Gelly(图处理库)等。API层包括构建流计算应用的DataStream API和批计算应用的DataSet API,两者都提供给用户丰富的数据处理高级API,例如Map、FlatMap操作等,同时也提供比较低级的Process Function API,用户可以直接操作状态和时间等底层数据。图1-5 Flink基本组件栈

·Runtime核心层

该层主要负责对上层不同接口提供基础服务,也是Flink分布式计算框架的核心实现层,支持分布式Stream作业的执行、JobGraph到ExecutionGraph的映射转换、任务调度等。将DataSteam和DataSet转成统一的可执行的Task Operator,达到在流式引擎下同时处理批量计算和流式计算的目的。

·物理部署层

该层主要涉及Flink的部署模式,目前Flink支持多种部署模式:本地、集群(Standalone/YARN)、云(GCE/EC2)、Kubenetes。Flink能够通过该层能够支持不同平台的部署,用户可以根据需要选择使用对应的部署模式。1.4.2 基本架构图

Flink系统架构设计如图1-6所示,可以看出Flink整个系统主要由两个组件组成,分别为JobManager和TaskManager,Flink架构也遵循Master-Slave架构设计原则,JobManager为Master节点,TaskManager为Worker(Slave)节点。所有组件之间的通信都是借助于Akka Framework,包括任务的状态以及Checkpoint触发等信息。(1)Client客户端

客户端负责将任务提交到集群,与JobManager构建Akka连接,然后将任务提交到JobManager,通过和JobManager之间进行交互获取任务执行状态。客户端提交任务可以采用CLI方式或者通过使用Flink WebUI提交,也可以在应用程序中指定JobManager的RPC网络端口构建ExecutionEnvironment提交Flink应用。图1-6 Flink基本架构图(2)JobManager

JobManager负责整个Flink集群任务的调度以及资源的管理,从客户端中获取提交的应用,然后根据集群中TaskManager上TaskSlot的使用情况,为提交的应用分配相应的TaskSlots资源并命令TaskManger启动从客户端中获取的应用。JobManager相当于整个集群的Master节点,且整个集群中有且仅有一个活跃的JobManager,负责整个集群的任务管理和资源管理。JobManager和TaskManager之间通过Actor System进行通信,获取任务执行的情况并通过Actor System将应用的任务执行情况发送给客户端。同时在任务执行过程中,Flink JobManager会触发Checkpoints操作,每个TaskManager节点收到Checkpoint触发指令后,完成Checkpoint操作,所有的Checkpoint协调过程都是在Flink JobManager中完成。当任务完成后,Flink会将任务执行的信息反馈给客户端,并且释放掉TaskManager中的资源以供下一次提交任务使用。(3)TaskManager

TaskManager相当于整个集群的Slave节点,负责具体的任务执行和对应任务在每个节点上的资源申请与管理。客户端通过将编写好的Flink应用编译打包,提交到JobManager,然后JobManager会根据已经注册在JobManager中TaskManager的资源情况,将任务分配给有资源的TaskManager节点,然后启动并运行任务。TaskManager从JobManager接收需要部署的任务,然后使用Slot资源启动Task,建立数据接入的网络连接,接收数据并开始数据处理。同时TaskManager之间的数据交互都是通过数据流的方式进行的。

可以看出,Flink的任务运行其实是采用多线程的方式,这和MapReduce多JVM进程的方式有很大的区别Fink能够极大提高CPU使用效率,在多个任务和Task之间通过TaskSlot方式共享系统资源,每个TaskManager中通过管理多个TaskSlot资源池进行对资源进行有效管理。1.5 本章小结

在本章1.1节对Flink的基本概念及发展历史进行了介绍。1.2节对目前数据架构领域的发展进行了深入的介绍,让读者能够了解传统的数据架构到大数据架构的演变过程,以及在未来支持有状态流计算的实时计算架构会扮演什么样的角色,让用户能够对Flink这项技术的发展中有着更深入的理解。1.3节列举了Flink不同的应用场景,让读者结合自己的业务场景进行技术选型,帮助读者能够更加合理地使用Flink这项技术。1.4节介绍了Flink基本组件栈、基本架构以及Flink所具备的特性,例如支持高吞吐、低延时、强一致性保障等。通过本章的学习可以让读者对Flink有一个初步的认识和了解,接下来的章节我们将逐步深入地了解和掌握Flink分布式计算技术。  第2章 环境准备

本章主要介绍Flink在使用前的环境安装准备,包括必须依赖的环境以及相应的参数,首先从不同运行环境进行介绍,包括本地调试环境、Standalone集群环境,以及在On Yarn环境上。另外介绍Flink自带的Template模板,如何通过该项目模板本地运行代码环境的直接生成,而不需要用户进行配置进行大量的开发环境配置,节省了开发的时间成本。最后介绍Flink源码编译相关的事项,通过对源码进行编译,从而对整个Flink计算引擎有更深入的理解。2.1 运行环境介绍

Flink执行环境主要分为本地环境和集群环境,本地环境主要为了方便用户编写和调试代码使用,而集群环境则被用于正式环境中,可以借助Hadoop Yarn或Mesos等不同的资源管理器部署自己的应用。环境依赖(1)JDK环境

Flink核心模块均使用Java开发,所以运行环境需要依赖JDK,本书暂不详细介绍JDK安装过程,用户可以根据官方教程自行安装,其中包括Windows和Linux环境安装,需要注意的是JDK版本需要保证在1.8以上。(2)Scala环境

如果用户选择使用Scala作为Flink应用开发语言,则需要安装Scala执行环境,Scala环境可以通过本地安装Scala执行环境,也可以通过Maven依赖Scala-lib来引入。(3)Maven编译环境

Flink的源代码目前仅支持通过Maven进行编译,所以如果需要对源代码进行编译,或通过IDE开发Flink Application,则建议使用Maven作为项目工程编译方式。Maven的具体安装方法这里不再赘述。

需要注意的是,Flink程序需要Maven的版本在3.0.4及以上,否则项目编译可能会出问题,建议用户根据要求进行环境的搭建。(4)Hadoop环境

对于执行在Hadoop Yarn资源管理器的Flink应用,则需要配置对应的Hadoop环境参数。目前Flink官方提供的版本支持hadoop2.4、2.6、2.7、2.8等主要版本,所以用户可以在这些版本的Hadoop Yarn中直接运行自己的Flink应用,而不需要考虑兼容性的问题。2.2 Flink项目模板

Flink为了对用户使用Flink进行应用开发进行简化,提供了相应的项目模板来创建开发项目,用户不需要自己引入相应的依赖库,就能够轻松搭建开发环境,前提是在JDK(1.8及以上)和Maven(3.0.4及以上)的环境已经安装好且能正常执行。在Flink项目模板中,Flink提供了分别基于Java和Scala实现的模板,下面就两套项目模板分别进行介绍和应用。2.2.1 基于Java实现的项目模板

1.创建项目

创建模板项目的方式有两种,一种方式是通过Maven archetype命令进行创建,另一种方式是通过Flink提供的Quickstart Shell脚本进行创建,具体实例说明如下。

·通过Maven Archetype进行创建:$ mvn archetype:generate \ -DarchetypeGroupId=org.apache.flink \ -DarchetypeArtifactId=flink-quickstart-java \ -DarchetypeCatalog=https://repository.apache.org/ \ content/repositories/snapshots/ \ -DarchetypeVersion=1.7.0

通过以上Maven命令进行项目创建的过程中,命令会交互式地提示用户对项目的groupId、artifactId、version、package等信息进行定义,且部分选项具有默认值,用户直接回车即可,如图2-1所示。我们创建了实例项目成功之后,客户端会提示用户项目创建成功,且在当前路径中具有相应创建的Maven项目。图2-1 Maven创建Java项目

·通过quickstart脚本创建:$ curl https://flink.apache.org/q/quickstart-SNAPSHOT.sh | bash -s 1.6.0

通过以上脚本可以比较简单地创建项目,执行后项目会自动生成,但是项目的名称和一些GAV信息都是自动生成的,用户不能进行交互式重新定义,其中的项目名称为quickstart,gourpid为org.myorg.quickstart,version为0.1。这种方式对于Flink入门相对比较适合,其他有一定基础的情况下,则不建议使用这种方式进行项目创建。注意

在Maven 3.0以上的版本中,DarchetypeCatalog配置已经从命令行中移除,需要用户在Maven Settings中进行配置,或者直接将该选项移除,否则可能造成不能生成Project的错误。

2.检查项目

对于使用quickstart curl命令创建的项目,我们可以看到的项目结构如代码清单2-1所示,如果用户使用Maven Archetype,则可以自己定义对应的artifactId等信息。

代码清单2-1 Java模板项目结构tree quickstart/quickstart/├── pom.xml└── src └── main ├── java │ └── org │ └── myorg │ └── quickstart │ ├── BatchJob.java │ └── StreamingJob.java └── resources └── log4j.properties

从上述项目结构可以看出,该项目已经是一个相对比较完善的Maven项目,其中创建出来对应的Java实例代码,分别是BatchJob.java和Streaming.java两个文件,分别对应Flink批量接口DataSet的实例代码和流式接口DataStream的实例代码。在创建好上述项目后,建议用户将项目导入到IDE进行后续开发,Flink官网推荐使用的是Intellij IDEA或者Eclipse进行项目开发,具体的开发环境配置可以参考下一节中的介绍。

3.编译项目

项目经过上述步骤创建后,可以使用Maven Command命令mvn clean package对项目进行编译,编译完成后在项目同级目录会生成target/-.jar,则该可执行Jar包就可以通过Flink命令或者Web客户端提交到集群上执行。注意

通过Maven创建Java应用,用户可以在Pom中指定Main Class,这样提交执行过程中就具有默认的入口Main Class,否则需要用户在执行的Flink App的Jar应用中指定Main Class。

4.开发应用

在项目创建和检测完成后,用户可以选择在模板项目中的代码上编写应用,也可以定义Class调用DataSet API或DataStream API进行Flink应用的开发,然后通过编译打包,上传并提交到集群上运行。具体应用的开发读者可以参考后续章节。2.2.2 基于Scala实现的项目模板

Flink在开发接口中同样提供了Scala的接口,用户可以借助Scala高效简洁的特性进行Flink App的开发。在创建项目的过程中,也可以像上述Java一样创建Scala模板项目,而在Scala项目中唯一的区别就是可以支持使用SBT进行项目的创建和编译,以下实例,将从SBT和Maven两种方式进行介绍。

1.创建项目(1)创建Maven项目

1)使用Maven archetype进行项目创建

代码清单2-2是通过Maven archetype命令创建Flink Scala版本的模板项目,其中项目相关的参数同创建Java项目一样,需要通过交互式的方式进行输入,用户可以指定对应的项目名称、groupid、artifactid以及version等信息。

代码清单2-2 使用Maven archetype创建Scala项目mvn archetype:generate \ -DarchetypeGroupId=org.apache.flink \ -DarchetypeArtifactId=flink-quickstart-scala \ -DarchetypeCatalog=https://repository.apache.org/ \ content/repositories/snapshots/ \ -DarchetypeVersion=1.7.0

执行完上述命令之后,会显示如图2-2所示的提示,表示项目创建成功,可以进行后续操作。同时可以在同级目录中看到已经创建好的Scala项目模板,其中包括了两个Scala后缀的文件。

2)使用quickstart curl脚本创建

如上节所述,在创建Scala项目模板的过程中,也可以通过quickstart curl脚本进行创建,这种方式相对比较简单,只要执行以下命令即可:curl https://flink.apache.org/q/quickstart-scala-SNAPSHOT.sh | bash -s 1.7.0图2-2 Maven创建Scala项目

执行上述命令后就能在路径中看到相应的quickstart项目生成,其目录结构和通过Maven archetype创建的一致,只是不支持修改项目的GAV信息。(2)创建SBT项目

在使用Scala接口开发Flink应用中,不仅可以使用Maven进行项目的编译,也可以使用SBT(Simple Build Tools)进行项目的编译和管理,其项目结构和Maven创建的项目结构有一定的区别。可以通过SBT命令或者quickstart脚本进行创建SBT项目,具体实现方式如下:

1)使用SBT命令创建项目sbt new path/flink-project.g8

执行上述命令后,会在客户端输出创建成功的信息,表示项目创建成功,同时在同级目录中生成创建的项目,其中包含两个Scala的实例代码供用户参考。

2)使用quickstart curl脚本创建项目

可以通过使用以下指令进行项目创建Scala项目:bash <(curl https://flink.apache.org/q/sbt-quickstart.sh)注意

如果项目编译方式选择SBT,则需要在环境中提前安装SBT编译器,同时版本需要在0.13.13以上,否则无法通过上述方式进行模板项目的创建,具体的安装教程可以参考SBT官方网站https://www.scala-sbt.org/download.html进行下载和安装。

2.检查项目

对于使用Maven archetype创建的Scala项目模板,其结构和Java类似,在项目中增加了Scala的文件夹,且包含两个Scala实例代码,其中一个是实现DataSet接口的批量应用实例BatchJob,另外一个是实现DataStream接口的流式应用实例StreamingJob,如代码清单2-3所示。

代码清单2-3 Scala模板项目结构tree quickstart/quickstart/├── pom.xml└── src └── main ├── resources │ └── log4j.properties └── scala └── org └── myorg └── quickstart ├── BatchJob.scala └── StreamingJob.scala

3.编译项目

1)使用Maven编译

进入到项目路径中,然后通过执行mvn clean package命令对项目进行编译,编译完成后产生target/-.jar。

2)使用Sbt编译

进入到项目路径中,然后通过使用sbt clean assembly对项目进行编译,编译完成后再产生target/scala_your-major-scala-version/project-name-assembly-0.1-SNAPSHOT.jar。

4.开发应用

在项目创建和检测完成后,用户可以选择在Scala项目模板的代码上编写应用,也可以定义Class调用DataSet API或DataStream API进行Flink应用的开发,然后通过编译打包,上传并提交到集群上运行。2.3 Flink开发环境配置

我们可以选择IntelliJ IDEA或者Eclipse作为Flink应用的开发IDE,但是由于Eclipse本身对Scala语言支持有限,所以Flink官方还是建议用户能够使用IntelliJ IDEA作为首选开发的IDE,以下将重点介绍使用IntelliJ IDEA进行开发环境的配置。2.3.1 下载IntelliJ IDEA IDE

用户可以通过IntelliJ IDEA官方地址下载安装程序,根据操作系统选择相应的程序包进行安装。安装方式和安装包请参考https://www.jetbrains.com/idea/download/。2.3.2 安装Scala Plugins

对于已经安装好的IntelliJ IDEA默认是不支持Scala开发环境的,如果用户选择使用Scala作为开发语言,则需要安装Scala插件进行支持。以下说明在IDEA中进行Scala插件的安装:

·打开IDEA IDE后,在IntelliJ IDEA菜单栏中选择 Preferences选项,然后选择Plugins子选项,最后在页面中选择Browser Repositories,在搜索框中输入Scala进行检索;

·在检索出来的选项列表中选择和安装Scala插件,如图2-3所示;

·点击安装后重启IDE,Scala编程环境即可生效。图2-3 检索IDE中Scala插件2.3.3 导入Flink应用代码

开发环境配置完毕之后,下面就可以将2.3.2节中创建好的项目导入到IDE中,具体步骤如下所示:

·启动IntelliJ IDEA,选择File→Open,在文件选择框中选择创建好的项目(quickstart),点击确定,IDEA将自动进行项目的导入;

·如果项目中提示没有SDK,可以选择File→Project Structure,在SDKS选项中选择安装好的JDK路径,添加Scala SDK路径,如果系统没有安装Scala SDK,也可以通过Maven Dependence将scala-lib引入;

·项目正常导入之后,程序状态显示正常,可以通过mvn clean package或者直接通过IDE中自带的工具Maven编译方式对项目进行编译;

完成了在IntelliJ IDEA中导入Flink项目,接下来用户就可以开发Flink应用了。2.3.4 项目配置

对于通过项目模板生成的项目,项目中的主要参数配置已被初始化,所以无须额外进行配置,如果用户通过手工进行项目的创建,则需要创建Flink项目并进行相应的基础配置,包括Maven Dependences、Scala的Version等配置信息。

1.Flink基础依赖库

对于Java版本,需要在项目的pom.xml文件中配置如代码清单2-4所示的依赖库,其中flink-java和flink-streaming-java分别是批量计算DataSet API和流式计算DataStream API的依赖库,{flink.version}是官方的发布的版本号,用户可根据自身需要进行选择,本书中所有的实例代码都是基于Flink 1.7版本开发。

代码清单2-4 Flink Java项目依赖配置库 org.apache.flink flink-java {flink.version} provided org.apache.flink flink-streaming-java_2.11 {flink.version} provided

创建Scala版本Flink项目依赖库配置如下,和Java相比需要指定scala的版本信息,目前官方建议的是使用Scala 2.11,如果需要使用特定版本的Scala,则要将源码下载进行指定Scala版本编译,否则Scala各大版本之间兼容性较弱会导致应用程序在实际环境中无法运行的问题。Flink基于Scala语言项目依赖配置库如代码清单2-5所示:

代码清单2-5 Flink Scala项目依赖配置库 org.apache.flink flink-scala_2.11 {flink.version} provided org.apache.flink flink-streaming-scala_2.11 {flink.version} provided

另外在上述Maven Dependences配置中,核心的依赖库配置的Scope为provided,主要目的是在编译阶段能够将依赖的Flink基础库排除在项目之外,当用户提交应用到Flink集群的时候,就避免因为引入Flink基础库而导致Jar包太大或类冲突等问题。而对于Scope配置成provided的项目可能出现本地IDE中无法运行的问题,可以在Maven中通过配置Profile的方式,动态指定编译部署包的scope为provided,本地运行过程中的scope为compile,从而解决本地和集群环境编译部署的问题。注意

由于Flink在最新版本中已经不再支持scala 2.10的版本,建议读者使用scala 2.11,同时Flink将在未来的新版本中逐渐支持Scala 2.12。

2.Flink Connector和Lib依赖库

除了上述Flink项目中应用开发必须依赖的基础库之外,如果用户需要添加其他依赖,例如Flink中內建的Connector,或者其他第三方依赖库,需要在项目中添加相应的Maven Dependences,并将这些Dependence的Scope需要配置成compile。

如果项目中需要引入Hadoop相关依赖包,和基础库一样,在打包编译的时候将Scope注明为provided,因为Flink集群中已经将Hadoop依赖包添加在集群的环境中,用户不需要再将相应的Jar包打入应用中,否则容易造成Jar包冲突。注意

对于有些常用的依赖库,为了不必每次都要上传依赖包到集群

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载