Flink概述
计算引擎
大数据计算引擎分为离线计算和实时计算,离线计算就是我们通常说的批计算,代表是Hadoop MapReduce、Hive等大数据技术。实时计算也被称作流计算,代表是Storm、Spark Streaming、Flink等大数据技术。
计算引擎也在不断更新迭代,下图展示的是每一代计算引擎的代表,从第一代的Hadoop MapReduce,到第二代的Spark,再到第三代的Flink技术,从批处理到微批,再到真正的流式计算。
实时计算
实时计算是相对离线计算的概念,重要是时效性。举个例子,我们知道离线计算通常是天级别的计算任务,比如统计一天的新增用户,商品销量,销售收入等。但是实时计算是只要有事件发生,统计结果就会发生变化,比如有一个新用户注册登录了,那么我们的新增用户数就发生了变化,商品只要新增一个销售,销量就会发生变化,销售收入也会变化。所以实时计算让我们能更及时了解我们的现状,以及根据实时的统计结果做出决策,决策也更加具有时效性。
Flink介绍
Apache Flink是一个开源的流处理框架,应用于分布式、高性能、高可用的数据流应用程序。可以处理有限数据流和无限数据,即能够处理有边界和无边界的数据流。无边界的数据流就是真正意义上的流数据,所以Flink是支持流计算的。有边界的数据流就是批数据,所以也支持批处理的。不过Flink在流处理上的应用比在批处理上的应用更加广泛,统一批处理和流处理也是Flink目标之一。Flink可以部署在各种集群环境,可以对各种大小规模的数据进行快速计算。
随着大数据技术在各行各业的广泛应用,要求能对海量数据进行实时处理的需求越来越多,同时数据处理的业务逻辑也越来越复杂,传统的批处理方式和早期的流式处理框架也越来越难以在延迟性、吞吐量、容错能力以及使用便捷性等方面满足业务日益苛刻的要求。其中流式计算的典型代表是Storm和Flink技术。它们数据处理的延迟都是亚秒级低延迟,但是Flink相比Storm还有其他的一些优势,比如支持exactly once语义,确保数据不会重复。 Storm支持at least once语义,保证数据不会丢失。保证数据不会重复的代价很高,比如数据下游操作属于幂等操作。另外从测试结果来看,Flink在低延迟的基础上还能保证高吞吐,优势明显。
在这种形势下,新型流式处理框架Flink通过创造性地把现代大规模并行处理技术应用到流式处理中来,极大地改善了以前的流式处理框架所存在的问题。
前世今生
诞生于2009年,原来叫StratoSphere,是柏林工业大学的一个研究性项目,早期专注于批计算。2014年孵化出Flink并捐给Apache,2015年Flink开始崭露头角,引起大家注意。它不仅是一个高吞吐,低延迟的计算引擎,同时还提供有状态的计算,支持状态管理,支持强一致性的语义,以及支持EventTime和waterMark 对消息乱序的处理。这也是阿里看上Flink的原因,并决心投入重金研究基于Flink的blink。2016年Flink在阿里得到大规模应用。
Flink特征
1.一切皆为流
事件驱动应用(Event-driven Applications)
2.正确性保证
唯一状态一致性(Exactly-once state consistency)
事件-事件处理(Event-time processing)
高超的最近数据处理(Sophisticated late data handling)
3.多层api
基于流式和批量数据处理的SQL(SQL on Stream & Batch Data)
流水数据API & 数据集API(DataStream API & DataSet API)
处理函数 (时间 & 状态)(ProcessFunction (Time & State))
4.易用性
部署灵活(Flexible deployment)
高可用安装(High-availability setup)
保存点(Savepoints)
5.可扩展性
可扩展架构(Scale-out architecture)
大量状态的支持(Support for very large state)
增量检查点(Incremental checkpointing)
6.高性能
低延迟(Low latency)
高吞吐量(High throughput)
内存计算(In-Memory computing)
Flink优点
支持批处理和流处理。
优雅流畅的支持java和scala。
高吞吐量和低延迟。
支持事件处理和无序处理通过SataStream API,基于DataFlow数据流模型。
在不同的时间语义(事件时间,摄取时间、处理时间)下支持灵活的窗口(时间,滑动、 翻滚,会话,自定义触发器)。
仅处理一次的容错担保,通过event time & watermarker。
自动背压机制,下游对上游的反压。
图处理(批) 机器学习(批) 复杂事件处理(流)。
在dataSet(批处理)API中内置支持迭代程序(BSP)。
高效的自定义内存管理,和健壮的切换能力在in-memory和out-of-core中。
兼容hadoop的mapreduce和storm。
集成YARN,HDFS,Hbase 和其它hadoop生态系统的组件,丰富的connector。
Flink模型
Flink提供不同级别的抽象来开发流/批处理应用程序。
最低级的抽象接口是状态化的数据流接口(stateful streaming)。这个接口是通过 ProcessFunction 集成到 DataStream API 中的。该接口允许用户自由的处理来自一个或多个流中的事件,并使用一致的容错状态。另外,用户也可以通过注册 event time 和 processing time 处理回调函数的方法来实现复杂的计算。
大部分程序通常会使用以 DataStream API(有界/无界数据流)、DataSet API(有界数据集)为代表的 Core APIs,并不会使用低级抽象接口。这些API为数据处理提供了大量的通用模块(common building block),包括用户定义的各种各样的变换(transformations)、连接(joins)、聚合(aggregations)、窗口(windows)、状态(state)等等。DataStream API 集成了 low level 处理函数,使得对一些特定的操作提供更低层次的抽象。此外,DataSet API 也为有界数据集提供了一些补充的编程原语,例如循环(loops)、迭代(iterations)等。
Table API 是一种以数据表为核心地声明式 DSL,能够动态地修改表(表示流时)。Table API 的是一种(扩展的)关系型模型:每个都有一个 schema(类似于关系型数据库中的表结构),API也提供以下操作: select,project,join,group by,aggregate等。Table API 程序定义的是应该执行什么样的逻辑操作,而不是直接准确地指定程序代码运行的具体步骤。尽管 Table API 可以通过各式各样的自定义函数进行扩展,但是它在表达能力上仍然比不上 Core APIs,不过在使用上更简练(可以减少很多代码)。此外,Table API 程序在运行之前也会使用一个优化器对程序进行优化。用户可以在 tables 与 DataStream/DataSet 之间进行无缝切换,程序也可以混合使用 Table API 和 DataStream/DataSet APIs。
Flink 提供的最高级接口是 SQL。这个层次的抽象接口和 Table API 非常相似,包括语法和接口的表现能力,唯一的区别是通过 SQL 查询语言实现程序。SQL 抽象接口和 Table API 的交互非常紧密,而且 SQL 查询也可以在 Table API 中定义的表上执行。
应用类型
1.实时BI
对于淘宝和考拉这种电商场景,有着海量的在线交易和用户数据,实时计算不同维度的数据统计数据对于指导运营有很大的帮助。
实时BI系统的流程:在线服务系统和数据库会产生大量的日志数据,通过日志收集工具采集到消息队列比如Kafka,FlinkJob实时读取处理这些数据,然后将各种统计结果实时写到Mysql或者Hbase中,通过可视化技术,运营用户可从DashBoard中实时看到各个维度的统计分析结果。
最直观的例子就是双十一的实时GMV成交额,大屏实时显示最新的销售总额,看似一个简单的数据,背后需要Flink平稳、精准的计算。
2.实时数仓
离线计算阶段,数据仓库都是非实时的,通常是天级别或者小时级别的ETL作业,通过MapReduce,将数据进行批处理,将数据load到hive分区表。但是离线建立的数据,时间上具有延迟性,按天级别任务的ETL,只能到第二天才能对前一天的数据进行查询和计算。如果希望可以查询到实时数据,实时的ETL就显的尤为必要。
通过Flink,可以实时将数据进行处理,load到Hive表,从而实现实时数仓的搭建,数据实时可查询。
3.在线模型
传统的离线机器学习需要T+1的分析用户的历史行为,训练模型,第二天上线,但是用户的需求和预期可能已经发生了改变,因此模型的实时性就显得尤为重要。我们知道,机器学习的特征一般都是通过复杂计算得到的,所以提取特征需要大量的计算任务。FlinkJob通过实时的日志,根据需求提取需要的特征,并在线上使用最新的特征和结果数据,增量训练模型,从而达到在线机器学习的目的。
在线模型的计算更加密集和复杂,而这些正是Flink的优势所在。通过在线学习,模型也会更加实时,可以给用户带来更好的使用体验。
4.实时监控
监控系统一般采集的数据量都是巨大的,通过参数的一些阈值设定,实时报警,Flink在这类场景中也有应用。通过用户的实时行为数据,可以做到实时监控。比如广告系统的实时反作弊,美团、招商等运营活动的实时反薅羊毛都是实时计算的案例,Flink在其中也能发挥巨大的价值。
Flink未来
Flink会进行批计算的突破、流处理和批处理无缝切换、界限越来越模糊、甚至混合。
Flink会开发更多语言支持。
Flink会逐步完善Machine Learning 算法库,同时 Flink 也会向更成熟的机器学习、深度学习去集成(比如Tensorflow On Flink)。