Flink入门与实践

0    112    1

Tags:

👉 本文共约13196个字,系统预计阅读时间或需50分钟。

初识Flink

官网:https://flink.apache.org/

GitHub:https://github.com/apache/flink

Flink 是 Apache 基金会旗下的一个开源大数据处理框架。目前,Flink 已经成为各大公司大数据实时处理的发力重点,特别是国内以阿里为代表的一众互联网大厂都在全力投入,为Flink 社区贡献了大量源码。如今 Flink 已被很多人认为是大数据实时处理的方向和未来。

那 Flink 到底是什么,又有什么样的优点,能够让大家对它如此青睐?

Flink入门与实践

Flink 的源起和设计理念

Flink 起源于一个叫作 Stratosphere 的项目,它是由地处柏林的大学和欧洲其他一些大学在 2010~2014 年共同进行的研究项目,由柏林理工大学的教授沃克尔·马尔科(Volker Markl) 领衔开发。2014 年 4 月,Stratosphere 的代码被复制并捐赠给了 Apache 软件基金会,Flink 就是在此基础上被重新设计出来的。

在德语中,“flink”一词表示“快速、灵巧”。项目的 logo 是一只彩色的松鼠,当然了,这不仅是因为 Apache 大数据项目对动物的喜好(是否联想到了 Hadoop、Hive?),更是因为松鼠这种小动物完美地体现了“快速、灵巧”的特点。关于 logo 的颜色,还一个有趣的缘由: 柏林当地的松鼠非常漂亮,颜色是迷人的红棕色;而 Apache 软件基金会的logo,刚好也是一根以红棕色为主的渐变色羽毛。于是,Flink 的松鼠Logo 就设计成了红棕色,而且拥有一个漂亮的渐变色尾巴,尾巴的配色与 Apache 软件基金会的 logo 一致。这只松鼠色彩炫目,既呼应了 Apache 的风格,似乎也预示着 Flink 未来将要大放异彩。

Flink入门与实践

从命名上,我们也可以看出 Flink 项目对于自身特点的定位,那就是对于大数据处理,要做到快速和灵活。

⚫ 2014 年 8 月,Flink 第一个版本 0.6 正式发布(至于 0.5 之前的版本,在Stratosphere 名下)。与此同时 Fink 的几位核心开发者创办了Data Artisans 公司, 主要做 Fink 的商业应用,帮助企业部署大规模数据处理解决方案。

⚫ 2014 年 12 月,Flink 项目完成了孵化,一跃成为Apache 软件基金会的顶级项目。

⚫ 2015 年 4 月,Flink 发布了里程碑式的重要版本 0.9.0,很多国内外大公司也正是从这时开始关注、并参与到 Flink 社区建设的。

⚫ 2019 年 1 月,长期对 Flink 投入研发的阿里巴巴,以 9000 万欧元的价格收购了 Data Artisans 公司;之后又将自己的内部版本 Blink 开源,继而与 8 月份发布的 Flink 1.9.0 版本进行了合并。自此之后,Flink 被越来越多的人所熟知,成为当前最火的新一代大数据处理框架。

Flink 从真正起步到火爆,只不过几年时间。在这短短几年内,Flink 从最初的第一个稳定版本 0.9,到目前本书编写期间已经发布到了 1.17.1,这期间不断有新功能新特性加入。从一开始,Flink 就拥有一个非常活跃的社区,而且一直在快速成长。到目前为止,Flink 的代码贡献者(Contributors)已经超过 800 人,并且 Flink 已经发展成为最复杂的开源流处理引擎之一,得到了广泛的应用。

根据Apache 软件基金会发布的 2020 年度报告,Flink 项目的社区参与和贡献依旧非常活跃,在 Apache 旗下的众多项目中保持着多项领先:

⚫ 邮件列表(Mailing List)活跃度,排名第一

⚫ 代码提交(Commits)数,排名第二

⚫ GitHub 访问量,排名第二

Flink 就像一列高速行进的列车,向我们呼啸而来,朝着未来更实时、更稳定的大数据处理奔去。这辆通向未来的车,我们上车可以迟,但一定不要错过。

Flink 的官网主页地址:flink.apache.org/

flink的核心目标,是“数据流上的有状态计算”(Stateful Computations over Data Streams)。

Apache Flink is a framework and distributed processing engine for stateful computations over unbounded and bounded data streams. Flink has been designed to run in all common cluster environments, perform computations at in-memory speed and at any scale.

Flink是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。Flink 被设计在所有常见的集群环境中运行,以内存执行速度和任意规模来执行计算;

突出了 Flink 的两个特点:速度快、可扩展性强

Flink入门与实践

Flink 的应用

Flink 在企业中的应用

Flink 为全球许多公司和企业的关键业务应用提供了强大的支持。

对于数据处理而言,任何行业、任何公司的需求其实都是一样的:数据规模大、实时性要求高、确保结果准确、方便扩展、故障后可恢复——而这些要求,作为新一代大数据流式处理引擎的 Flink 统统可以满足!这也正是 Flink 在全世界范围得到广泛应用的原因

以下是 Flink 官网列出的知名企业用户

Flink入门与实践

flink.apache.org/powered-by/ 以阿里为例。阿里巴巴这个庞大的电商公司,为买方和卖方提供了交易平台。它的个性化搜索和实时推荐功能就是通过 Flink 实现的。用户所购买或者浏览的商品,可以被用作推荐的依据,这就是为什么我们经常发现“刚看过什么、网站就推出来了”。当用户数据量非常庞大时,快速地分析响应、实时做出精准的推荐就显得尤为困难。而 Flink 这样真正意义上的大数据流处理引擎,就能做到这些。

Flink 的应用场景

Flink入门与实践

流式数据处理的发展和演变

流处理和批处理

数据处理有不同的方式。

对于具体应用来说,有些场景数据是一个一个来的,是一组有序的数据序列,我们把它叫作“数据流”;而有些场景的数据,本身就是一批同时到来,是一个有限的数据集,这就是批量数据(有时也直接叫数据集)。

处理数据流,应该“来一个就处理一个”,这种数据处理模式就叫作流处理;因为这种处理是即时的,所以也叫实时处理。与之对应,处理批量数据自然就应该一批读入、一起计算,这种方式就叫作批处理

在 IT 应用场景中,这一点会体现得更加明显。企业的绝大多数应用程序,都是在不停地接收用户请求、记录用户行为和系统日志,或者持续接收采集到的状态信息。所以数据会在不同的时间持续生成,形成一个有序的数据序列——这就是典型的数据流

很显然,对于流式数据,用流处理是最好、也最合理的方式。但传统的数据处理架构并不是这样。无论是关系型数据库、还是数据仓库,都倾向于先“收集数据”,然后再进行处理,这是因为分布式批处理在架构上更容易实现。

传统事务处理

Flink入门与实践 On-Line Transaction Processing 联机事务处理过程(OLTP)

这就是传统的“事务处理”架构。系统所处理的连续不断的事件,其实就是一个数据流。而对于每一个事件,系统都在收到之后进行相应的处理,这也是符合流处理的原则的。所以可以说,传统的事务处理,就是最基本的流处理架构。

这样的架构对表和数据库的设计要求很高;当数据规模越来越庞大、系统越来越复杂时, 可能需要对表进行重构,而且一次联表查询也会花费大量的时间,甚至不能及时得到返回结果。

联机分析处理(on-Line Analytic Processing)

数据量很大,离线处理,但是不够实时

有状态的流处理

Flink入门与实践

直接将状态保存在本地内存,当应用收到一个新事件时,它可以从状态中读取数据,也可以更新状态。而当状态是从内存中读写的时候, 这就和访问本地变量没什么区别了,实时性可以得到极大的提升。

数据规模增大时,可以构建分布式集群;可以定期地将应用状态的一致性检查点(checkpoint)存盘,写入远程的持久化存储,遇到故障时再去读取进行恢复,这样就保证了更好的容错性。

缺点:无法保证数据处理的先后顺序

Lambda 架构

对于批处理来说,这并不是一个问题。因为所有数据都已收集完毕,我们可以根据需要选择、排列数据,得到想要的结果;

与批处理器相比,可以说第一代流处理器牺牲了结果的准确性,用来换取更低的延迟。而批处理器恰好反过来,牺牲了实时性,换取了结果的准确。如果可以让二者做个结合,不就可以同时提供快速和准确的结果了吗?正是基于这样的思想,Lambda 架构被设计出来;

Flink入门与实践

它的“批处理层”(Batch Layer)就是由传统的批处理器和存储组成,而“实时层”(Speed Layer)则由低延迟的流处理器实现。数据到达之后,两层处理双管齐下,一方面由流处理器进行实时处理,另一方面写入批处理存储空间, 等待批处理器批量计算。流处理器快速计算出一个近似结果,并将它们写入“流处理表”中。而批处理器会定期处理存储中的数据,将准确的结果写入批处理表,并从快速表中删除不准确的结果。最终,应用程序会合并快速表和批处理表中的结果,并展示出来。

Lambda 架构现在已经不再是最先进的,但仍在许多地方使用。它的优点非常明显,就是兼具了批处理器和第一代流处理器的特点,同时保证了低延迟和结果的准确性。而它的缺点同样非常明显。首先,Lambda 架构本身就很难建立和维护;而且,它需要我们对一个应用程序, 做出两套语义上等效的逻辑实现,因为批处理和流处理是两套完全独立的系统,它们的 API 也完全不同。为了实现一个应用,付出了双倍的工作量,这对程序员显然不够友好

新一代流处理器

新一代流处理器通过巧妙的设计,完美解决了乱序数据对结果正确性的影响。这一代系统还做到了精确一次(exactly-once)的一致性保障,是第一个具有一致性和准确结果的开源流处理器。

Flink 的特性总结

  1. 高吞吐、低延迟;(每秒处理数百万个事件,毫秒级延迟)
  2. 结果的准确性;(Flink 提供了事件时间(event-time)和处理时间(processing-time) 语义。对于乱序事件流,事件时间语义仍然能提供一致且准确的结果)
  3. 可以与众多常用存储系统链接;(如Apache Kafka、Elasticsearch、JDBC、分布式文件系统)
  4. 高可用,支持动态扩展

流处理的应用场景

事件驱动型(Event-Driven)应用

Flink入门与实践

事件驱动型应用是一类具有状态的应用,它从一个或多个事件流提取数据,并根据到来的事件触发计算、状态更新或其他外部动作。比较典型的就是以 Kafka 为代表的消息队列几乎都是事件驱动型应用

数据分析(Data Analysis)型应用

Flink入门与实践

所谓的数据分析,就是从原始数据中提取信息和发掘规律。传统上,数据分析一般是先将数据复制到数据仓库(Data Warehouse),然后进行批量查询。如果数据有了更新,必须将最新数据添加到要分析的数据集中,然后重新运行查询或应用程序。

与批处理分析相比,流处理分析最大的优势就是低延迟,真正实现了实时。另外,流处理不需要去单独考虑新数据的导入和处理,实时更新本来就是流处理的基本模式。当前企业对流式数据处理的一个热点应用就是实时数仓,很多公司正是基于 Flink 来实现的。

数据管道(Data Pipeline)型应用

Flink入门与实践

所谓数据管道的作用与 ETL 类似。它们可以转换和扩展数据,也可以在存储系统之间移动数据。不过如果我们用流处理架构来搭建数据管道,通过cdc(debezium)捕获实时数据,这些工作就可以连续运行,而不需要再去周期性触发了;

Flink的分层api

  • 越顶层越抽象,表达含义越简明,使用越方便
  • 越底层越具体,表达能力越丰富,使用越灵活

Flink入门与实践

Flink部署

下载

https://flink.apache.org/downloads/

https://github.com/apache/flink/releases/tag/release-1.17.1

安装包大约500MB:

部署架构及环境

Flink 是一个分布式的流处理框架,所以实际应用一般都需要搭建集群环境。JobManager 就是 Flink 集群里的“管事人”,对作业进行中央调度管理;而它获取到要执行的作业后,会进一步处理转换,然后分发任务给众多的TaskManager。这里的 TaskManager,就是真正“干活的人”。

Flink入门与实践

需要准备 3 台Linux 机器。具体要求如下:

  • 安装 Java 8。
  • 配置集群节点服务器间时间同步以及免密登录,关闭防火墙。

服务部署

(1)将flink-1.15.0-bin-scala_2.12.tgz 文件夹分别拷贝到对应的服务器上(JobManager服务器和TaskManager服务器,请参阅部署架构),所有机器上都需要在相同路径访问。

(2)解压每台服务压缩包: tar zxvf flink-1.15.0-bin-scala_2.12.tgz

(3)设置权限 chmod -R 777 flink-1.15.0

(4)修改配置文件(每台机器均要设置):修改flink-1.15.0/conf/flink-conf.yaml文件

参数参数说明例子
jobmanager.rpc.addressJobManager的服务器IP地址172.16.0.189
taskmanager.numberOfTaskSlots采集任务槽,默认200,由项目情况决定,一般无需修改200

(5)修改{解压文件夹}/conf/workers文件

将TaskManager节点的IP配置到该文件下,例如TaskManager节点IP分别为10.0.0.2和10.0.0.3则配置文件内容如下:

免密登录

由于是集群环境,JobManager将通过ssh命令访问TaskManager节点,若不开启免密登录,启动时需每次输入节点的对应访问密码,开启免密方法如下:

(1)JobManager节点执行命令ssh-keygen -t rsa,并回车确认。

(2)复制生成的id_rsa.pub文件导所有节点:

scp -p ~/.ssh/id_rsa.pub {USER}@{TASKMANAGER_IP}:/{USER}/.ssh/authorized_keys

例如用户为root用户,集群节点为10.0.0.3,则示例语句如下:

scp -p ~/.ssh/id_rsa.pub root@10.0.0.3:/root/.ssh/authorized_keys

启动服务

(1)登录JobManager,进入目录{解压文件夹}/bin目录,执行start-cluser.sh命令

浏览器中输入:http://{JobManager_IP}:18081,如打开如下界面,则启动成功

Flink入门与实践 (2)停止服务:登录JobManager,进入目录{解压文件夹}/bin目录,执行stop-cluser.sh命令

参数配置

  • jobmanager.memory.process.size:对 JobManager 进程可使用到的全部内存进行配置, 包括 JVM 元空间和其他开销,默认为 1600M,可以根据集群规模进行适当调整。
  • taskmanager.memory.process.size:对 TaskManager 进程可使用到的全部内存进行配置,包括 JVM 元空间和其他开销,默认为 1600M,可以根据集群规模进行适当调整。
  • taskmanager.numberOfTaskSlots:对每个 TaskManager 能够分配的 Slot 数量进行配置, 默认为 1,可根据 TaskManager 所在的机器能够提供给 Flink 的 CPU 数量决定。所谓Slot 就是TaskManager 中具体运行一个任务所分配的计算资源。
  • parallelism.default:Flink 任务执行的默认并行度,优先级低于代码中进行的并行度配置和任务提交时使用参数指定的并行度数量

部署模式

会话模式(Session Mode)

会话模式其实最符合常规思维。我们需要先启动一个集群,保持一个会话,在这个会话中通过客户端提交作业。集群启动时所有资源就都已经确定,所以所有提交的作业会竞争集群中的资源。

本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!
Flink入门与实践后续精彩内容已被小麦苗无情隐藏,请输入验证码解锁本站所有文章
验证码:
请关注本站微信公众号,回复“小麦苗博客”,获取验证码。在微信里搜索“DB宝”或者“www_xmmup_com”或者微信扫描右侧二维码都可以关注本站微信公众号。

标签:

Avatar photo

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复

嘿,我是小麦,需要帮助随时找我哦
  • 18509239930
  • 个人微信

  • 麦老师QQ聊天
  • 个人邮箱
  • 点击加入QQ群
  • 个人微店

  • 回到顶部