龙空技术网

Flink(一):为什么大数据项目都要选它?

青梅主码 593

前言:

眼前大家对“apache的用处”大体比较看重,咱们都需要知道一些“apache的用处”的相关知识。那么小编在网上网罗了一些有关“apache的用处””的相关知识,希望看官们能喜欢,我们快快来学习一下吧!

大家好,我是杰哥

好久不更,有读者留言问我这些天都在忙啥呢?

今天统一回复:在啃一块硬骨头呢。哪块?它就是我们今天的主角——Flink

起初了解它,是因为今年的这个项目中使用到了它,用它来对海量日志进行规则匹配。本以为它很简单,在其他技术栈的基础上,稍微看看就得了,但是真正了解的时候,却发现它的内容原来如此丰富,功能如此强大,远不止“数据计算”这么简单

不信,你看......

一 Flink 是什么?

官网上这样讲:Apache Flink 是一个框架和分布式处理引擎,用于在无边界和有边界数据流上进行有状态的计算

我们来解析一下

1、数据流分类有边界,就是说我们的数据范围是确定的,比如就是一天的数据,或者一个月的数据。这种数据可以全部拿得到,对于实时性要求不那么高,处理被称为批处理无边界,就是说源源不断的数据,比如网站用户的访问日志,网站只要存在,就会一直被用户访问,那么,就会一直有日志数据。就需要实现来一条日志,处理一条,从而才能够得到比较准确实时的用户访问量与独立访客等数据。这种处理被称为流处理。它对于低延时要求比较高2、应用场景

举个 Flink 使用的真实场景,你可能会更清楚地认识 Flink 这里流处理计算引擎:

淘宝的双十一实时战报大屏,就是利用流式计算得出实时结果,直接被推送到前端应用,从而实时显示出重要的指标变换。比如用户的访问量、下单量、商品下单率等等

也就是说,Flink 可以对数据进行实时的分析计算,得出我们比较关注的数据结果

总的来说,Flink 的应用场景分为如下三类:

事件驱动型应用

事件驱动型应用是一类具有状态的应用,它从一个或多个事件流提取数据,并根据到来的事件触发计算、状态更新或其他外部动作。比如基于规则的报警

数据分析应用

数据分析任务需要从原始数据中提取有价值的信息和指标,从而实时输出。比如电信网络质量监控

数据管道应用

数据管道是以持续流模式运行,而非周期性触发。因此它支持从一个不断生成数据的源头读取记录,并将它们以低延迟移动到终点

数据管道可以用来监控文件系统目录中的新文件,并将其数据写入事件日志;另一个应用可能会将事件流物化到数据库或增量构建和优化查询索引。比如电子商务中的持续 ETL

二 部署方式

Flink 除了作为独立集群的方式部署以外,还集成了所有常见的集群资源管理器,实现高可用的集群部署。例如 Hadoop YARN、 Apache Mesos 和 Kubernetes

三 主要特性1 同时支持高吞吐、低延迟、高性能

Flink 是目前开源社区中唯一一套集高吞吐、低延迟、高性能三者于一身的分布式流式处理框架

高吞吐、高性能:它会根据应用程序的具体处理复杂度与数据量,将其拆分为不同的任务,并行执行计算。你也知道,只要可以同时处理,大家团结起来,一起来干活,谁也不闲着,就可以充分利用 CPU、内存、磁盘和网络 IO,从而保障了高吞吐与高性能。据官网所收集的用户数据:Flink可以达到:每天处理数万亿条事件的性能低延迟:Flink 的异步和增量的检查点算法对处理延迟产生最小的影响,同时保证精确一次状态的一致性2 同时支持事件时间和处理时间语义

Flink 能够支持在窗口处理中,基于事件时间语义进行窗口计算,也就是使用事件产生的时间,使得事件即使乱序到达,流系统也能够计算出精确的结果,保证了事件原本的时序性

3 支持有状态计算

对于 Flink 来说,有状态计算,就是在流式计算过程中将算子的中间结果数据存储下来,等下一个事件进入算子后可以直接获取这个中间结果,增量计算当前的结果即可,并不需要每次都基于全部的原始数据来统计结果

比如说求一段时间内某个用户的访问量,只需要每次保存一个该用户的最新的访问次数的 count 值,后续来的数据直接叠加就行了,并不需要每次都把原始的数据再查询一遍来计算

这种方式极大地提升了系统的性能,并降低了数据计算过程的资源消耗,尤其是在数据量很大的应用中,效果会更为明显

4 基于轻量级分布式快照实现的容错机制

Flink 采用快照 checkPoint 机制,实现了容错机制。并巧妙地实现了精确一次的语义

5 高可用

主要通过与 Kubernetes、YARN、Apache Mesos 等集群管理工具的紧密集成,实现高可用性配置,包括快速故障恢复、动态扩缩容作业等功能的支持

区别于检查点 checkPoint —— 自动实现状态的保存机制,Flink 还提供保存点——支持用户手动保存状态到存储介质上,从而支持 Flink 集群的动态更新或者快速恢复等功能

6 支持高度灵活的窗口操作

Flink 将窗口划分为基于 Time、Count、Session,以及 Data-driven 等类型的窗口操作,窗口可以用灵活的触发条件定制化来达到对复杂流传输模式的支持,用户可以定义不同的窗口触发机制来满足不同的需求

7 可以与众多常用存储系统连接

支持 Kafka 等诸多存储系统的输入源与输出源连接。当前最新版本所支持的所有输入输出源如下:

四 Flink 的架构

我们来看看 Flink 的基本架构图

总体来说,Flink 的基本架构分为三个角色

1 客户端

其实是 Flink 的应用程序,主要用来下发命令(提交作业)给 JobManager 的角色,算是用户,或者大 Boss 吧,是直接以特定的方式向 Flink 发出命令的角色

客户端可以在 Java/Scala 程序中进行作业的提交,也可以采用命令行:./bin/Flink run ... 来提交

2 JobManager

JobManager 主要负责任务的管理,在架构图中就算是二当家的。它决定何时调度下一个任务(或一组任务)、处理已完成的或执行失败的任务、协调 checkPoint、并且协调失败恢复过程等,算是真正管事的角色,在 Flink 的架构中起着决定性作用

JobManager 由三个组件组成

1)资源管理器-ResourceManagerResourceManager 负责 Flink 集群中的资源管理。包括提供资源、分配资源和回收资源。Flink 集群中资源调度的单位为:task slots, 即任务槽

2)分发器-DispatcherDispatcher 提供了一个 REST 接口,用来提交 Flink 应用程序执行,并为每个提交的作业启动一个新的 JobMaster。它还提供了 Flink WebUI 用来展示作业执行信息

3)作业 Master - JobMaster

JobMaster 负责管理单个 JobGraph(即,作业图,你可以理解为是将用户定制好的需求,画成的一张图) 的执行。Flink 集群中可以同时运行多个作业,每个作业都有自己的 JobMaster

集群中至少有一个 JobManager。也可以有多个 JobManager 来实现高可用

3 TaskManager

TaskManager(也称为 worker)用于执行作业流的任务,并且缓存和交换数据流

集群中至少有一个 TaskManager。TaskManager 中 task slot (即,任务槽)的数量表示并发处理 task 的数量。需要注意的是,一个任务槽中可以执行多个算子

五 作业提交流程

流程如下:

1、由客户端通过分发器提供的 REST 接口,将作业提交给 JobManager

2、由分发器启动 JobMaster,并将作业(包含 JobGraph)提交给 JobMaster

3、JobMaster 将 JobGraph 解析为可执行的 ExecutionGraph,得到所需的资源数量,然后向资源管理器请求资源(slots)

4、资源管理器判断当前是否有足够的可用资源;如果没有,启动新的 TaskManager

5、TaskManager 启动之后,向 ResourceManager 注册自己的可用任务槽(slots)

6、资源管理器通知 TaskManager 为新的作业提供 slots

7、TaskManager 连接到对应的 JobMaster,提供 slots

8、JobMaster 将需要执行的任务分发给 TaskManager

9、TaskManager 执行任务

总结

Flink 就是一个可以对于无边界和有边界数据流进行计算的分布式处理引擎。近几年来,Flink 一直处于快速更新迭代中,目前最新的稳定版本已经达到了 v1.16.0,它也支持了越来越多主流数据源的连接,比如 Apache pulsar

由于 Flink 具有高吞吐、低延迟、高性能、高可用以及精确一次等优秀特性,并且随着在稳步更新,它的功能也越来越完备,对于涉及到日志分析等大数据相关业务的项目来说,选择 Flink 性价比相对还是比较高的

因此,近期,我们将定期推送 Flink 的系列文章,带你由浅入深地了解一下这款优秀的大数据处理框架,共同来领略一番它的神奇之处。敬请期待哦~

嗯,就这样。每天学习一点,时间会见证你的强大

欢迎大家关注我们的公众号【青梅主码】,一起持续性学习吧~

参考资料:

往期精彩回顾

总结复盘

架构设计读书笔记与感悟总结

带领新人团队的沉淀总结

复盘篇:问题解决经验总结复盘

网络篇

网络篇(四):《图解 TCP/IP》读书笔记

网络篇(一):《趣谈网络协议》读书笔记(一)

事务篇章

事务篇(四):Spring事务并发问题解决

事务篇(三):分享一个隐性事务失效场景

事务篇(一):毕业三年,你真的学会事务了吗?

Docker篇章

Docker篇(六):Docker Compose如何管理多个容器?

Docker篇(二):Docker实战,命令解析

Docker篇(一):为什么要用Docker?

..........

SpringCloud篇章

Spring Cloud(十三):Feign居然这么强大?

Spring Cloud(十):消息中心篇-Kafka经典面试题,你都会吗?

Spring Cloud(九):注册中心选型篇-四种注册中心特点超全总结

Spring Cloud(四):公司内部,关于Eureka和zookeeper的一场辩论赛

..........

Spring Boot篇章

Spring Boot(十二):陌生又熟悉的 OAuth2.0 协议,实际上每个人都在用

Spring Boot(七):你不能不知道的Mybatis缓存机制!

Spring Boot(六):那些好用的数据库连接池们

Spring Boot(四):让人又爱又恨的JPA

SpringBoot(一):特性概览

..........

翻译

[译]用 Mint 这门强大的语言来创建一个 Web 应用

【译】基于 50 万个浏览器指纹的新发现

使用 CSS 提升页面渲染速度

WebTransport 会在不久的将来取代 WebRTC 吗?

.........

职业、生活感悟

你有没有想过,旅行的意义是什么?

程序员的职业规划

灵魂拷问:人生最重要的是什么?

如何高效学习一个新技术?

如何让自己更坦然地度过一天?

..........

标签: #apache的用处