Flink原理、实战与性能优化

流式框架,同时支持低延迟、高吞吐、Exactly-once的只有Apache Flink。数据库

1. Apache Flink介绍

1.1 Apache Flink是什么?

实时数据处理愈来愈重要,流式数据处理有着更高的处理效率和成本控制能力。Flink在德语中意味着快速和灵敏,用来体现流式数据处理器速度快和灵活性强等特色。Apache是流式框架中同时支持低延迟、高吞吐、Exactly-once的,同时提供了基于流式计算引擎处理批量数据的计算能力,真正意义上实现了批流统一,同时随着阿里Blind的开源,极大地加强了Flink对批量计算领域的支持,编程

1.2 数据架构的演变

传统的关系型数据存储架构,逐步演化为分布式处理和存储的架构。windows

1.2.1 传统数据基础架构

主要基于集中式的关系型数据库实现存储,大多数将架构分为计算层和存储层。微服务架构将系统数据源拆分,解决了业务系统扩展的问题,可是业务数据国语分散在不一样的系统中,很难将数据进行集中化管理,对于企业内部进行数据分析或者数据挖掘之类的应用则须要经过从不一样的数据库进行数据抽取,将数据从数据库中周期性同步到数据仓库中,而后再数据仓库中进行数据的抽取、转换、加载(ETL),从而构建成不一样的数据集和应用,提供给业务系统使用。数组

1.2.2 大数据数据架构

                                

                                                              图-大数据实时处理架构网络

Lamada架构支持处理不一样类型的数据,包含支持批量计算的Batch Layer和实时计算的Speed Layer,经过在一套平台中将批计算和流计算整合在一块儿,可是这种架构由于框架太多仍然存在平台复杂度和运维成本较高的问题。数据结构

1.2.3 有状态流计算架构

                                                

                                                             图-有状态流计算架构架构

企业基于实时的流式数据,维护全部计算过程的状态,所谓状态就是计算过程当中产生的中间结果,每次计算新的数据进入到流式系统中都是基于中间状态结果的基础上进行计算,最终产生正确的中间结果。基于有状态计算方式的最大优点是不须要将原始数据从外部系统中拿出来,避免进行全量计算,对比批量计算,实时计算能够在很短的时间内统计出结果。框架

1.2.4 为何会是Flink?

能够看出有状态流计算会逐步成为企业做为构建数据平台的架构模式。Flink经过实现Google DataFlow流式计算模型实现了高吞吐、低延迟、高性能且兼具实时流式计算框架,同时支持高度容错的状态管理。运维

Apache Flink同时支持如下特性:分布式

  • 同时支持高吞吐、低延迟、高性能,且目前惟一支持,Storm不支持高吞吐的要求
  • 支持事件时间(Event time)的概念,使用事件产生的时间,使得即便乱序,流系统也能计算出正确的结果,保持事件本来产生时的有序性,尽量避免网络传输或者硬件系统的影响
  • 支持有状态流式计算,将算子中间结果保存在内存或者文件系统中,极大提高系统性能,下降资源消耗
  • 支持高度灵活的窗口(Window)机制,经过窗口的方式对流数据进行必定范围的聚合计算
  • 基于轻量级分布式快照(Snapshot)实现的容错,基于分布式快照技术的Checkpoints,将执行过程当中的状态信息进行持久化存储,支持任务异常时候的自动恢复,确保数据在处理过程当中的一致性
  • 基于JVM实现独立的内存管理,序列化/反序列化方式减小数据存储大小,下降GC带来的性能影响
  • 支持保存点(Save Points),将任务执行的快照保存在存储介质上,便于更好的管理和运维流式应用

1.3 Flink运用场景

  • 实时智能推荐,经过Flink流计算构建更加实时的智能推荐系统,对用户行为指标进行实时计算,对模型进行实时更新,对用户指标进行实时预测,并将预测的信息推送到Web/App端。
  • 复琐事件处理,借助Flink CEP(复琐事件处理)
  • 实时欺诈检测
  • 实时数仓和ETL
  • 流数据分析
  • 实时报表分析,天猫双十一大屏

1.4 Flink基本架构

                                                  

                                                                         图-Flink分层架构

2. 环境准备

3. Flink编程模型

3.1 数据集类型

有界数据集,具备时间边界,批计算处理;无界数据集,没有边界,持续不断产生新的数据,流式数据处理。两者是相对概念,主要根据时间的范围而定,能够认为一段时间内的无界数据集实际上是有界数据集,同时有界数据也能够经过一些方法转换为无界数据,有界数据和无界数据实际上是能够相互转换的,对于不一样的数据类型能够进行统一的处理,Apache Spark和Flink同时支持流式计算和批量计算。

3.2 Flink编程接口

核心数据处理接口,支持批计算的接口DataSet API,支持流计算的DataStream API

                                                      

                                                                       图-Flink接口分层与抽象

3.3 Flink程序结构

设定Flink执行环境、建立和加载数据集、对数据集指定转换操做逻辑、指定计算结果输出位置、调用execute方法触发程序执行。

                                       

                                                                图-示例Flink程序WordCount

3.4 Flink数据类型

3.4.1 数据类型支持

数据类型的描述信息都是由TypeInformation定义,比较经常使用的有BasicTypeInfo、TupleTypeInfo、CaseClassTypeInfo、PojoTypeInfo

BasicTypeInfo:支持任意Java原生数据类型,数组BasicTypeInfo

Java Tuples类型:固定长度固定类型,不支持空值存储

POJO类型:复杂数据结构的定义

Flink Value类型:序列化与反序列化

特殊数据类型:Types Hmt

3.4.2 TypeInformation信息获取

一般状况下Flink都能正常进行数据类型判断,并选择合适的serializers以及comparators,可是在某些状况下没法获取,例如JVM泛型擦除。

反射机制尽量重构类型信息,类型提示(Ctype Himts),TypeHint指定输出参数类型

自定义TypeInformation

4. DataStream API介绍与使用

4.1 DataStream编程模型

基于Google提出的DataFlow模型,实现了支持原生数据流处理的计算引擎。API主要分为三个部分:

DataSourc模块,数据接入功能,主要是将各类外部数据接入到Flink系统,并将接入的数据转换成对应的DataStream数据集

Transformation模块,定义了对DataStream数据集的各类转换操做,例如map、reduce、windows等操做

DataSink模块,将结果数据写出到外部存储介质中,如文件或者Kafka中间件

4.1.1 DataSources数据输入

内置数据源,包括文件、Socket网络端口以及集合类型数据;第三方数据源,定义了Flink和外部系统数据交互的逻辑,包括数据的读写接口,Flink定义了丰富的第三方数据源链接器(Connector),例如Kafka Connector、ES Connector以及自定义第三方数据源Connector。

  • 内置文件数据源
  • 内置Socket数据源
  • 内置集合数据源,集合类Collection,将本地集合中的数据分发到远端并行执行的节点中
  • 外部数据源链接器,如Kafka
  • 外部自定义数据源链接器,实现SourceFunction等

4.1.2 DataStream转换操做

即经过一个或多个DataStream生成新的DataStream的过程称为Transformation,在转换过程当中,每种操做类型被定义为不一样的Operator,Flink可以将多个Transformation组成一个DataFlow的拓扑。DataStream的转换操做能够分为Single-DataStream、Multi-DataStream、物理分区三类类型。

  • Single-DataStream

Map(DataStream->DataStream)、FlatMap(DataStream->DataStream)、Filter(DataStream->DataStream)、KeyBy(DataStream->KeyedStream)、Reduce(KeyedStream->DataStream)、Aggregations(KeyedStream->DataStream)

  • Multi-DataStream

Union(DataStream->DataStream)、Connect/CoMap/CoFlatMap(DataStream->DataStream)、Split(DataStream->SplitStream)、Select(SplitStream->DataStream)、Iterate(DataStream->IterativeStream->DataStream)

  • 物理分区操做

根据指定的分区策略将数据从新分配到不一样节点的task案例上执行,随机分区、平衡分区、按比例分区等

4.1.3 DataSinks数据输出

  • 基本数据输出

文件输出、客户端输出、Socket网络端口、

  • 第三方数据输出

如Kafka、Cassandra、Kinesis、ES、HDFS、NIFI等。DataSink类操做算子专门处理数据的输出,全部的数据输出均可以基于实现SinkFunction完成定义,如FlinkKafkaProducer。

4.2 时间几率与WaterMark

三种时间概念:

事件生成时间(Event time)、时间接入时间(Ingestion Time)和事件处理时间(Processing Time)

相关文章
相关标签/搜索