您好,登录后才能下订单哦!
这篇文章主要介绍“Flink的原理和用法”,在日常操作中,相信很多人在Flink的原理和用法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Flink的原理和用法”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
流式框架,同时支持低延迟、高吞吐、Exactly-once的只有Apache Flink。
实时数据处理越来越重要,流式数据处理有着更高的处理效率和成本控制能力。Flink在德语中意味着快速和灵敏,用来体现流式数据处理器速度快和灵活性强等特点。Apache是流式框架中同时支持低延迟、高吞吐、Exactly-once的,同时提供了基于流式计算引擎处理批量数据的计算能力,真正意义上实现了批流统一,同时随着阿里Blind的开源,极大地增强了Flink对批量计算领域的支持,
传统的关系型数据存储架构,逐步演化为分布式处理和存储的架构。
主要基于集中式的关系型数据库实现存储,大多数将架构分为计算层和存储层。微服务架构将系统数据源拆分,解决了业务系统扩展的问题,但是业务数据国语分散在不同的系统中,很难将数据进行集中化管理,对于企业内部进行数据分析或者数据挖掘之类的应用则需要通过从不同的数据库进行数据抽取,将数据从数据库中周期性同步到数据仓库中,然后再数据仓库中进行数据的抽取、转换、加载(ETL),从而构建成不同的数据集和应用,提供给业务系统使用。
图-大数据实时处理架构
Lamada架构支持处理不同类型的数据,包含支持批量计算的Batch Layer和实时计算的Speed Layer,通过在一套平台中将批计算和流计算整合在一起,但是这种架构因为框架太多仍然存在平台复杂度和运维成本较高的问题。
图-有状态流计算架构
企业基于实时的流式数据,维护所有计算过程的状态,所谓状态就是计算过程中产生的中间结果,每次计算新的数据进入到流式系统中都是基于中间状态结果的基础上进行计算,最终产生正确的中间结果。基于有状态计算方式的最大优势是不需要将原始数据从外部系统中拿出来,避免进行全量计算,对比批量计算,实时计算可以在很短的时间内统计出结果。
可以看出有状态流计算会逐步成为企业作为构建数据平台的架构模式。Flink通过实现Google DataFlow流式计算模型实现了高吞吐、低延迟、高性能且兼具实时流式计算框架,同时支持高度容错的状态管理。
Apache Flink同时支持以下特性:
同时支持高吞吐、低延迟、高性能,且目前唯一支持,Storm不支持高吞吐的要求
支持事件时间(Event time)的概念,使用事件产生的时间,使得即使乱序,流系统也能计算出正确的结果,保持事件原本产生时的有序性,尽可能避免网络传输或者硬件系统的影响
支持有状态流式计算,将算子中间结果保存在内存或者文件系统中,极大提升系统性能,降低资源消耗
支持高度灵活的窗口(Window)机制,通过窗口的方式对流数据进行一定范围的聚合计算
基于轻量级分布式快照(Snapshot)实现的容错,基于分布式快照技术的Checkpoints,将执行过程中的状态信息进行持久化存储,支持任务异常时候的自动恢复,确保数据在处理过程中的一致性
基于JVM实现独立的内存管理,序列化/反序列化方式减少数据存储大小,降低GC带来的性能影响
支持保存点(Save Points),将任务执行的快照保存在存储介质上,便于更好的管理和运维流式应用
实时智能推荐,通过Flink流计算构建更加实时的智能推荐系统,对用户行为指标进行实时计算,对模型进行实时更新,对用户指标进行实时预测,并将预测的信息推送到Web/App端。
复杂事件处理,借助Flink CEP(复杂事件处理)
实时欺诈检测
实时数仓和ETL
流数据分析
实时报表分析,天猫双十一大屏
图-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。
内置文件数据源
内置Socket数据源
内置集合数据源,集合类Collection,将本地集合中的数据分发到远端并行执行的节点中
外部数据源连接器,如Kafka
外部自定义数据源连接器,实现SourceFunction等
即通过一个或多个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案例上执行,随机分区、平衡分区、按比例分区等
基本数据输出
文件输出、客户端输出、Socket网络端口、
第三方数据输出
如Kafka、Cassandra、Kinesis、ES、HDFS、NIFI等。DataSink类操作算子专门处理数据的输出,所有的数据输出都可以基于实现SinkFunction完成定义,如FlinkKafkaProducer。
三种时间概念:
事件生成时间(Event time)、时间接入时间(Ingestion Time)和事件处理时间(Processing Time)
到此,关于“Flink的原理和用法”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。