流式框架,同时支持低延迟、高吞吐、Exactly-once的只有Apache Flink。数据库
实时数据处理愈来愈重要,流式数据处理有着更高的处理效率和成本控制能力。Flink在德语中意味着快速和灵敏,用来体现流式数据处理器速度快和灵活性强等特色。Apache是流式框架中同时支持低延迟、高吞吐、Exactly-once的,同时提供了基于流式计算引擎处理批量数据的计算能力,真正意义上实现了批流统一,同时随着阿里Blind的开源,极大地加强了Flink对批量计算领域的支持,编程
传统的关系型数据存储架构,逐步演化为分布式处理和存储的架构。windows
主要基于集中式的关系型数据库实现存储,大多数将架构分为计算层和存储层。微服务架构将系统数据源拆分,解决了业务系统扩展的问题,可是业务数据国语分散在不一样的系统中,很难将数据进行集中化管理,对于企业内部进行数据分析或者数据挖掘之类的应用则须要经过从不一样的数据库进行数据抽取,将数据从数据库中周期性同步到数据仓库中,而后再数据仓库中进行数据的抽取、转换、加载(ETL),从而构建成不一样的数据集和应用,提供给业务系统使用。数组
图-大数据实时处理架构网络
Lamada架构支持处理不一样类型的数据,包含支持批量计算的Batch Layer和实时计算的Speed Layer,经过在一套平台中将批计算和流计算整合在一块儿,可是这种架构由于框架太多仍然存在平台复杂度和运维成本较高的问题。数据结构
图-有状态流计算架构架构
企业基于实时的流式数据,维护全部计算过程的状态,所谓状态就是计算过程当中产生的中间结果,每次计算新的数据进入到流式系统中都是基于中间状态结果的基础上进行计算,最终产生正确的中间结果。基于有状态计算方式的最大优点是不须要将原始数据从外部系统中拿出来,避免进行全量计算,对比批量计算,实时计算能够在很短的时间内统计出结果。框架
能够看出有状态流计算会逐步成为企业做为构建数据平台的架构模式。Flink经过实现Google DataFlow流式计算模型实现了高吞吐、低延迟、高性能且兼具实时流式计算框架,同时支持高度容错的状态管理。运维
Apache Flink同时支持如下特性:分布式
图-Flink分层架构
有界数据集,具备时间边界,批计算处理;无界数据集,没有边界,持续不断产生新的数据,流式数据处理。两者是相对概念,主要根据时间的范围而定,能够认为一段时间内的无界数据集实际上是有界数据集,同时有界数据也能够经过一些方法转换为无界数据,有界数据和无界数据实际上是能够相互转换的,对于不一样的数据类型能够进行统一的处理,Apache Spark和Flink同时支持流式计算和批量计算。
核心数据处理接口,支持批计算的接口DataSet API,支持流计算的DataStream API
图-Flink接口分层与抽象
设定Flink执行环境、建立和加载数据集、对数据集指定转换操做逻辑、指定计算结果输出位置、调用execute方法触发程序执行。
图-示例Flink程序WordCount
数据类型的描述信息都是由TypeInformation定义,比较经常使用的有BasicTypeInfo、TupleTypeInfo、CaseClassTypeInfo、PojoTypeInfo
BasicTypeInfo:支持任意Java原生数据类型,数组BasicTypeInfo
Java Tuples类型:固定长度固定类型,不支持空值存储
POJO类型:复杂数据结构的定义
Flink Value类型:序列化与反序列化
特殊数据类型:Types Hmt
一般状况下Flink都能正常进行数据类型判断,并选择合适的serializers以及comparators,可是在某些状况下没法获取,例如JVM泛型擦除。
反射机制尽量重构类型信息,类型提示(Ctype Himts),TypeHint指定输出参数类型
自定义TypeInformation
基于Google提出的DataFlow模型,实现了支持原生数据流处理的计算引擎。API主要分为三个部分:
DataSourc模块,数据接入功能,主要是将各类外部数据接入到Flink系统,并将接入的数据转换成对应的DataStream数据集
Transformation模块,定义了对DataStream数据集的各类转换操做,例如map、reduce、windows等操做
DataSink模块,将结果数据写出到外部存储介质中,如文件或者Kafka中间件
内置数据源,包括文件、Socket网络端口以及集合类型数据;第三方数据源,定义了Flink和外部系统数据交互的逻辑,包括数据的读写接口,Flink定义了丰富的第三方数据源链接器(Connector),例如Kafka Connector、ES Connector以及自定义第三方数据源Connector。
即经过一个或多个DataStream生成新的DataStream的过程称为Transformation,在转换过程当中,每种操做类型被定义为不一样的Operator,Flink可以将多个Transformation组成一个DataFlow的拓扑。DataStream的转换操做能够分为Single-DataStream、Multi-DataStream、物理分区三类类型。
Map(DataStream->DataStream)、FlatMap(DataStream->DataStream)、Filter(DataStream->DataStream)、KeyBy(DataStream->KeyedStream)、Reduce(KeyedStream->DataStream)、Aggregations(KeyedStream->DataStream)
Union(DataStream->DataStream)、Connect/CoMap/CoFlatMap(DataStream->DataStream)、Split(DataStream->SplitStream)、Select(SplitStream->DataStream)、Iterate(DataStream->IterativeStream->DataStream)
根据指定的分区策略将数据从新分配到不一样节点的task案例上执行,随机分区、平衡分区、按比例分区等
文件输出、客户端输出、Socket网络端口、
如Kafka、Cassandra、Kinesis、ES、HDFS、NIFI等。DataSink类操做算子专门处理数据的输出,全部的数据输出均可以基于实现SinkFunction完成定义,如FlinkKafkaProducer。
三种时间概念:
事件生成时间(Event time)、时间接入时间(Ingestion Time)和事件处理时间(Processing Time)