一、数据集类型有分无穷和有界数据集
无穷数据集:无穷的持续集合的数据集合
有界数据集:有限不会改变的数据集合
二、数据运算模型
数据运算模型有分流式处理和批处理:
流式:只有数据一直在产生、计算就持续地进行。
批处理:在预先定义的时间运行计算,当计算完成时释放计算机资源。
三、flink简介
Flink是一个针对流数据和批数据的分布式处理引擎,代码主要是由java实现,部分代码是scala。它可以处理有界的批量数据集,也可以处理无界的实时数据集。其所要处理的主要场景就是流数据、批数据只是流数据的一个极限特例而已,所以Flink也是一款真正的流批流一的计算引擎。
Flink提供state(支持多种state,state可存储在内存、文件、rocksdb),checkpoint(分布式快照,分布式快照、保证容错机制),time(event time,Processing time可结合watermark处理乱序数据),window(支持多种window)
四、Flink整体架构
Flink整体架构从下至上分为:
1、部署:Flink支持本地运行(IDE中直接运行程序)、能在独立集群(Standalone模式)或者在被 YARN、Mesos、K8S管理的集群上运行,也能部署在云上。
2、运行:Flink的核心是分布式流式数据引擎,意味着数据以一次一个事件的形式被处理。
3、API:DataStream、DataSet、Table API&SQL。
4、扩展库:Flink还包括用CEP(复杂事件处理)、机器学习、图处理等场景。
整体架构如图
五、Flink的多种方式部署
作为一个计算引擎,如果要做的足够完善,除了它自身的各种特点要包含,还得支持各种生态圈,比如部署的情况,Flink是支持以stadalone、YARN、Kubernets、Mesos等形式部署的。
YARN:YARN是Hadoop集群的资源管理系统,它可以在群集上运行各种分布式应用程序,Flink可与其他并行于Yarn中Flink on Yarn的架构如下图所示:
Kubernetes:Kubernetes是google开源的容器集群管理系统,在docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性,Flink也支持部署在kubernets上。
通常上面四种居多,另外还支持aws,mapr,aliyun oss等。
六、Flink分布式运行流程
Flink作业提交架构流程如下图所示:
具体流程介绍如下:
1、Program code:编写的Flink应用程序代码
2、Job Client:Job Client不是Flink程序执行的内部部分,但它是任务执行的起点。Job Client负责接受用户的程序代码,然后创建数据流,将数据流提交给JobManager以便进一步执行。执行完成后,Job Client将结果返回给用户。
3、JobManger:主进程(也称为作业管理器)协调和管理程序的执行。它的主要职责包括安排任务,管理checkpoint,故障恢复等。机器集群中至少有一个master,master负责调度task,协调checkpoints 和容灾,高可用设置的话可以有多个master,但要保证一个是leader,其他是standby;jobmanager包含actor system ,scheduler、check pointing三个重要的组件。
4、TaskManager:从jobManager处接收需要部署的task.TaskManger是JVM中的一个或多个线程中执行的任务的工作节点。任务执行的并行性由每个taskmanager上可用的任务槽(slot个数)决定。每个任务代表分配给任务槽的一组资源。例如,如果taskmanager有四个插槽,那么它将为每个插槽分配25%的内存。可以在任务槽中运行一个或多个线程。同一插槽中的线程共享相同的jvm。
同一个jvm中的任务共享tcp连接和心跳消息。taskmanager的一个slot代表一个可用线程,该线程具有固定的内存,注意slot只对内存隔离,没有对cpu隔离。默认情况下,flink允许子任务共享slot,即使它们是不同的task的subtask.只要它们来自相同的job.这种共享可以有更好的资源利用率。
七、Flink API
Flink提供了不同的抽象级别的API以开发流式和批处理应用,如下务所示:
这四种API功能分别是:
最底层提供了有状态流。它通过process function嵌入到datastream API中。允许用户可以自由地处理来自一个或多个流数据的事件,并使用一致性,容错的状态。除此之外,用户可以注册事件和下理事件的回调,从而使用程序可以实现复杂的计算。
datastream/dataset api是Flink提供的核心API,dataset处理有界的数据集,datastream处理有界或者无界的数据流。用户可以通过各种方法(map/flatmap/window/keyby/sum/max/min/avg/join等)将数据进行转换或者计算。
Table API是以代表为中心的声明DSL,其中表可能会动态变化(在表达流数据时)。table api提供了例如select ,project,join,group-by,aggregagte等操作,使用起来却更加简加(代码量更少)。你可以在表与datastream/dataset之间无缝切换,也允许程序将table api与Datastream 以及dataset 混合使用。
Flink提供最高层级的抽象是Sql,这一层抽象在语法与表达能力上与table Api类似,但是是以sql查询表达式的形式表现程序。sql抽象与table api交互密切。同时sql查询可以直接table api定义的表上执行。
Flink 除了Datastream和dataset api,它还支持table api& sql,Flink也将通过sql来构建统一的大数据流批处理引擎,因为在公司中通常会有那种每天定时生成报表的需求(批处理的场景,每晚定时跑一遍昨天的数据生成一个结果报表),但是也是会有流处理的场景(比如采用flink来做实时性要求很高需求),于是慢慢的整个整个公司的技术选型就变得越来越多了,这样开发人员也就要面临学习不一样的技术框架,运维人员也需要对两种不一样的框架进行环境搭建和作业部署,平时还要维护作业的稳定性。当我们的系统变得越来越复杂,作业越来越多了。
八、Flink程序与数据流结构
一个完整的Flink应用程序结构如下图所示:
它们的功能分别是:
source:数据输入,Flink在流处理和批处理上的source大概有4类:基于本地集合的source,基于文件source,基于网络套接字的Source,自定义source。自定义的source常见的有apche kafka,amazone kinesis streams,rabbitmq,rabbitmq、twitter streaming api,apache nifi等,当然你也可以定义自已的Source。
Transformation:数据转换的各种操作,有map/flatmap/filter/keyby/reduce/fold/aggregations/window/windowall/union/window join/split/select/project等,操作很多,可以将数据转换计算成你想要的数据。
Sink:数据输出,Flink将转换计算后的数据发送的地点,你可能需要存储下来,flink常见的flink大概有如下几类,写入文件,打印出来,写入socket,自定义的Sink。自定义的sink常见的有apache kafka 、Rabbitmq、MySQL、ElaticSearch、apache cassandra、hadoop filesytem等,同理你也可以定义自义的sink。
九、事件时间&处理时间语义
Flink支持多种time,比如event time,ingesion time,processing time,如下图所示,后面3.1 节中会有详细的讲解flink中time概念。 Processing time 事件被处理时机器的系统时间、event time事件自身的时间、ingesion time事件进入flink的时间。
十、丰富的connector
通过源码可以发现不同版本的kafka,不同的elasticsearch、cassandra、hbase、hive、hdfs、rabbitmq都是支持的,除了流应用的connector是支持的,另外还支持sql。
十一、灵活的窗口机制
Flink支持多种window,比如time window,count window,session window,还支持自定义window。
十二、并行执行任务机制
Flink的程序内在是并行和分布式的,数据流可以被分区成stream partitions ,operators 被 划分为operator subtasks,这些Subtasks在不同的机器或容器中分不同的线程独立运行;operator subtasks的数量在具体operator就是并行计算数,程序不同的operator阶段可能有不同的并行数。
十三、状态存储和容错
Flink是一款状态的流处理框架,它提供了丰富的状态访问接口,按照数据的划分方式,可以分为keyed state 和 operator state,在keyed state中提供了多种数据结构。
value state
mapstate
liststate
reducingstate
aggregatingstate
另外状态存储也支持多种方式:
Memorystatebackend:存储在内存中
fsstatebackend:存储在文件中
rocksdbstatebackend:存储rocksdb中
Flink中支持使用checkpoint来提高程序的可靠性,开启了checkpoint之后,flink会按照一定的时间间隔对程序的运行状态进行备份,当发生故障时,Flink会将所有任务状态恢复至最后一次发生checkpoint中的状态,并从那里开始重新开始执行,另外Flink还支持根据savepoint从已停止作业运行状态进行恢复,这种方式需要通过命令进行触发。
十四、内存管理机制
Flink并不是直接把对象存放在堆内存上,而是将对象序列化为固定数量的预先分配的内存段。它采用类似DBMS的排序和连接算法,可以直接操作二进制数据,
十五、内存管理机制
Flink并不是直接把对象存放在堆内存上,而是将对象序列化为固定数据预先分段的内存段。它采用类似DBMS的排序和连接算法,可以直接操作二进制数据,以此将序列化和反序列化开销降到最低,如果需要处理的数据容量超过内存,那么flink的运算符会将部分数据存储到磁盘,Flink的主动内存管理和操作二进制数据的几个好处:
保证内存可控,可以防止outofmemoryerror
减少垃圾收集压力
节省数据的存储空间
高效的二进制操作
Flink如何分配内存,将对象进行序列化和反序列化以及对二进制数据进行操作的,。
十六、多种扩展库
Flink扩展库中含有有机器学习、gelly图形处理、CEP复杂事件处理、state processing api等,这些扩展库在一些特殊场景下会比较适用。
版权归原作者 半_调_子 所有, 如有侵权,请联系我们删除。