《 Flink 入门介绍》
一、前言
在当今大数据领域,流式计算扮演着至关重要的角色。它与传统的批量计算有着明显的区别,并在众多场景中展现出独特的优势。
(一)数据的时效性
在日常工作中,数据处理方式多样。若处理年、月级别的数据进行统计分析或个性化推荐,数据时效性稍缓尚可。然而,对于天、小时甚至更小粒度的数据处理,如网站实时监控(双 11 大屏显示、12306)、异常日志监控(语雀)等场景,传统的先收集数据存储于表,再取出分析的方式已无法满足高时效性需求。这些场景要求工作人员能立即响应,因此对数据时效性要求极高。
(二)流式计算和批量计算
传统的批量计算流程为统一收集数据,存储到数据库(DB),然后对数据进行批量处理。而流式计算则是对持续流动的数据流进行实时处理,计算完后数据通常被丢弃。批量计算维护一张表并实施各种计算逻辑,而流式计算需先定义好计算逻辑并提交到流式计算系统,且在整个运行期间不可更改。在计算结果方面,批量计算对全部数据计算后传输结果,流式计算则是每次小批量计算后结果即可实时展现。
从技术框架来看,Batch Analytics 如 Map Reduce、Hive、Spark Batch 等主要用于传统的离线作业分析、处理与报表生成;Streaming Analytics 则借助 Storm、Flink 等流式分析引擎进行实时数据处理,常用于实时大屏、实时报表等场景(Spark Struct Streaming 为准实时)。
(三)流式计算流程和特性
- 流程:
- 提交流计算作业。
- 等待流式数据触发流计算作业。
- 计算结果持续不断对外写出。
- 特性:
- 实时,低延迟:能快速响应数据变化,及时给出处理结果。
- 无界:数据源源不断输入,无终止状态。
- 连续:计算持续进行,处理后的数据随即被丢弃,专注于实时处理新流入的数据。
(四)实时即未来
身处信息革命浪潮之中,5G、物联网、智慧城市、工业 4.0、新基建等新事物不断涌现。大数据领域的数据产生速度更快、数据量更大、来源更多样,数据价值挖掘愈发受重视。随着海量数据和多种业务实时处理需求的激增,传统批处理方式和早期流式处理框架在延迟性、吞吐量、容错能力和使用便捷性等方面难以满足业务要求。而 Flink 凭借其独特的天然流式计算特性和先进架构设计,有效改善了之前流式处理框架存在的问题,成为大数据处理领域的重要力量。
二、Flink 概述
(一)Flink 的引入
近年来大数据蓬勃发展,催生了多个热门开源社区。Hadoop、Storm、Spark 等各有其专注的应用场景。Spark 开启内存计算先河并推动其发展,一定程度上掩盖了其他分布式计算系统。Flink 便是在这样的环境中默默发展。在国外部分社区,大数据计算引擎被分为 4 代(虽存在争议):
- 第 1 代——Hadoop MapReduce:将计算分为 Map 和 Reduce 两个阶段,上层应用需拆分算法并串联多个 Job 来完成完整算法。
- 第 2 代——DAG 框架(Tez) + MapReduce:为解决第一代弊端,支持 DAG 框架的第二代计算引擎诞生,如 Tez 和 Oozie,多应用于批处理任务。
- 第 3 代——Spark:以 Job 内部 DAG 支持(不跨越 Job)和强调实时计算为特点,也能较好运行批处理 Job。
- 第 4 代——Flink:着重对流计算的支持和更高的实时性,同时也支持 Batch 任务和 DAG 运算,在批处理、流处理、SQL 高层 API 支持等方面表现出色,流式计算性能和可靠性更高。
(二)Flink 发展史
- 起源与捐赠:Flink 起源于 Stratosphere 项目,该项目于 2010 - 2014 年由柏林等地大学联合研究,2014 年 4 月捐赠给 Apache 软件基金会。
- 成为顶级项目:2014 年 12 月成为 Apache 软件基金会顶级项目,其前身自 2008 年起已是柏林理工大学研究项目,原名 StratoSphere,后更名为 Flink,由 Java 语言编写。
- 重要版本发布:
- 2014 - 11 - 04,Flink 0.7.0 发布,引入重要的 Streaming API。
- 2016 - 03 - 08,Flink 1.0.0 支持 Scala。
- 商业收购:2019 - 01 - 08,阿里巴巴以 9000 万欧元收购 Flink 母公司 Data Artisans,推动 Flink 进一步发展。其 logo 为一只具有 Apache 风格的松鼠,在德语中“Flink”表示快速和灵巧。
(三)Flink 官方介绍
Flink 官方网站为 https://flink.apache.org/zh/,主页展示其理念为“Apache Flink 是为分布式、高性能、随时可用以及准确的流处理应用程序打造的开源流处理框架”。它是一款分布式计算引擎,既能用于流处理,也能用于批处理。
(四)编程语言
Flink 官方提供 Java、Scala、Python 语言接口开发应用程序,但其源码由 Java 编写。被阿里收购后,Java 更是未来主要编程语言,GitHub 上多数 Flink 项目也以 Java 编写,因此本课程以 Java 为主学习 Flink。
(五)FLink 外传
在典型大数据业务场景中,常采用批处理技术处理全量数据,流式计算处理实时增量数据。但用户批处理和流处理的计算引擎不同,需编写两套代码,带来额外负担和成本。阿里巴巴商品数据处理面临增量和全量业务流程问题,由此产生对统一大数据引擎技术的需求,这便是阿里选择 Flink 的背景与初衷。2015 年阿里开始使用 Flink 并持续贡献社区(内部基于 Flink 开发了 Blink),收购后 Flink 迎来新发展机遇。
(六)Flink 中的批和流
批处理具有有界、持久、大量的特点,适合需访问全部记录的计算工作,常用于离线统计。流处理具有无界、实时的特性,对通过系统传输的每个数据项操作,多用于实时统计。在 Flink 中,一切皆由流组成,有界数据集被视为无界数据流的特例,离线数据是有界限的流,实时数据是无界限的流,即有界流和无界流。无界流只有开始无结束,需连续处理且数据注入有顺序要求以保证处理结果完整;有界流有明确起止定义,可在数据全部注入后处理,注入顺序非必需,其处理也可称为批处理。
(七)性能比较
Spark 和 Flink 均可运行在 Hadoop YARN 上,性能表现为 Flink > Spark > Hadoop(MR),尤其在迭代次数(数据量)较多时,Flink 性能优势更明显。这主要得益于 Flink 支持增量迭代并具备自动优化迭代功能。
(八)Flink 的应用场景
众多行业的公司都在使用 Flink,如:
- 电商和市场营销:实现实时数据报表、广告投放、实时推荐等功能,助力精准营销与业务决策。
- 物联网(IOT):用于传感器实时数据采集与显示、实时报警,在交通运输业等领域发挥重要作用,保障设备运行安全与数据监控及时。
- 物流配送和服务业:可实时更新订单状态、推送通知信息,提升服务质量与客户体验。
- 银行和金融业:支持实时结算与通知推送,实时检测异常行为,保障金融交易安全与高效运作。