随着大数据技术在各行各业的普遍应用,要求能对海量数据进行实时处理的需求愈来愈多,同时数据处理的业务逻辑也愈来愈复杂,传统的批处理方式和早期的流式处理框架也愈来愈难以在延迟性、吞吐量、容错能力以及使用便捷性等方面知足业务日益苛刻的要求。数据库
在这种形势下,新型流式处理框架Flink经过创造性地把现代大规模并行处理技术应用到流式处理中来,极大地改善了之前的流式处理框架所存在的问题。飞马网于3月13日晚,邀请到大数据技术高级架构师—旷东林,在线上直播中,旷老师向咱们分享了Flink在诸多方面的创新以及它自己所具备的独特能力。编程
咱们主要从如下几个部分来看:缓存
一.流式处理的背景:安全
传统的大数据处理方式通常是批处理式的,也就是说,今天所收集的数据,咱们明天再把今天收集到的数据算出来,以供你们使用,可是在不少状况下,数据的时效性对于业务的成败是很是关键的。微信
1.流式处理的背景—必要性架构
好比说,在入侵检测的场景下,咱们但愿看到的结果是:一旦有入侵,咱们能及时地做出响应。这种状况下,若是按照传统的批处理方式,是不可能在入侵的时候实时检测出结果的。另外,好比说在语音计算中,咱们要实时监控各个虚拟器的运行状态以及出现错误时的预警,这种状况下,也要求咱们可以实时监控数据,并对数据产生的各类报警,实时采起动做。由此,流式处理的必要性就显得无疑了。app
2.流式处理的背景—基础架构框架
咱们来看一下流式处理的基本框架。分布式
主要分为六个部分:事件生产者、收集、排队系统(其中kafka的主要目的是,在数据高峰时,暂时把它缓存,防止数据丢失。)、数据变换(也就是流式处理过程)、长期存储、陈述/行动。性能
3.流式处理的背景—评测指标
目前的业界有不少流式处理的框架,在这么多框架中,咱们怎样评价这个流式处理框架的性能呢?有哪些指标呢?通常咱们会从如下这些方面来考核流式处理框架的能力。
其中“数据传输的保障度”,是指能不能保证数据被处理并到达目的地。它有三种可能性:保证至少一次、最多一次、精确一次。大多数状况下,“保证至少一次”就能知足业务要求,除要求数据精确度高的特定场景。
“处理延迟”,在大多数状况下,流式处理的延迟越低越好,但不少状况下,咱们的延迟越低,相应付出的代价也越高,“吞吐量”与“处理延迟”就是一对矛盾。吞吐量高,相应的延迟就会低,吞吐量低,相应的延迟就会高。
“状态管理”,咱们在实时变换的过程当中,要有与外部的交互,如入侵检测,以此来保护环境和数据的安全。
“容错能力”和“容错负荷”要求当流式处理在正常进行中,即便有某些机器挂掉,系统仍能正常运行,整个流式处理框架不受影响。
“流控”,也就是流量控制,咱们在数据传输的过程当中,可能会数据忽然增多,为了保证系统不至于负荷太重而崩溃,这时候就须要控制数据密度。
“编程复杂性”,相对而言,API设计地越高级,编程负担越低。
4.流式处理的背景—选型
了解流式处理框架的考核标准以后,那么咱们为何选择Flink?Flink有哪些优点呢?
“保证带状态计算下的精确一次语义”,对于某些特定的计算而言很是有必要。
通常在流式处理框架中,数据的处理通常有两种方式,一种是按照处理时间来处理数据,另外一种就是按照事件时间来处理数据,“事件时间语义支持”方式更为复杂。
Flink的API很是高级,在处理流式数据的逻辑业务中,效率更高。
二.Flink的原理:
了解Flink的背景以后,咱们一块儿来看一看它的原理。
1.概述
Flink的整个组件相似于Spark,它的核心是一个分布式的流式处理框架,在核心之上,有两套API,一套应用于批处理—DataSet API,一套应用于流式处理—DataStream API。
从图中咱们能够看到,在两套API下又有更为高级的库,而它的整个处理部署方式能够支持本地、集群、云端。
2.基础架构
Flink的整个架构和Spark很类似,有三个主要部分。
一个是提交任务的客户端—Flink Program;还有做业的管理器—JobManager,主要负责任务的调度和状态的检测,以及在整个集群出现故障时进行初步管理;最后是任务管理器—TaskManager,实现业务逻辑的执行,负责把接受到的任务运行以后,将相应的结果输出到外部或进行外部交互。
在整个过程当中,JobManager是不负责任务执行的。
3.编程模型
下面咱们来看一下Flink的具体编程模型结构。
第一条语句是创建整个Flink运行时的环境,相似于Spark里创建一个上下文。它的主要业务逻辑是由指定数据源、指定变换逻辑、指定输出三部分决定的。
指定数据源的过程就是nv.addSource,这是指定咱们的数据到底从哪里来,在这个设计中,它是从kafka里把数据读出来。在这个事例里面,数据流的变换比较简单,只是把每一行数据作一个解析,解析完后得到另外一个数据流,就构成了 DataStreamevents这个数据流。
在这个数据流上面,咱们作了一个分组:keyBy(“id”)、timeWindow(Time.seconds(10))、apply(new MyWindowAggregationFunction())。咱们把整个数据处理完以后,获得一个统计数据流,指定输出。
这大体就是整个数据流的业务逻辑,箭头下方是数据流图。
示例里面展现的只是部分API,除了上面那些,还有不少操做,咱们一块儿来看下面这张图片。
“map”就是作一些映射,好比咱们把两个字符串合并成一个字符串,把一个字符串拆成两个或者三个字符串。
“flatMap”相似于把一个记录拆分红两条、三条、甚至是四条记录。
“Filter”就相似于过滤。
“keyBy”就等效于SQL里的group by。
“reduce”就相似于MapReduce里的reduce。
“join”操做就有点相似于咱们数据库里面的join。
“aggregate”是一个聚合操做,如计数、求和、求平均等。
“connect”实现把两个流连成一个流。
“project”操做就相似于SQL里面的snacks。
“repartition”是一个从新分区操做。
4.执行机制
知道Flink的编程模型以后,那么Flink是怎样去运行这些业务逻辑的呢?下面是它的执行机制。
上图是表现业务逻辑的业务执行图,Flink的执行方式相似于管道,它借鉴了数据库的一些执行原理,实现了本身独特的执行方式。
5.状态与容错
Flink的容错机制很特别,咱们一块儿来看一看。
Flink在处理数据流时,它的整个数据流里面的数据分为两种,一种是自己业务发给的数据,还有一种是Flink本身插到数据流里面的数据。插入的记录咱们叫它barrier,就是栅栏,咱们能够把它当作一个表示进度的标记,标记整个数据处理的状态,它从源头发出。从图中咱们能够看到,不论是什么流,它都会产生一个checkpoint barrier。
当operator收到栅栏以后,它会把栅栏的状态存储,而后把特定记录发出去,到达第二个operator里面,它又把它的状态放到Master里,它就是这样一步一步去完成的。在这个过程当中,若是有一步出现故障,Flink会重复前面的步骤,从新去运行,因此不会出现数据的丢失和错误。
三.Flink的实践:
1.示例
咱们来看一下具体的示例。
第一步是初始化框架的运行时环境;第二步是指定数据流的数据源,示例里指定的是FlinkKafkaConsumer010<>(...)数据;第三步是实现数据流的业务变换逻辑,这里主要是经过flatmap把一个记录分红多条记录,经过filter进行过滤,以后按照域名进行分组,指定窗口长度,最后指定统计方式,这里的统计方式是计数;第四步就是对统计出来的数据流进行指定输出;最后一步,提交数据变换逻辑到框架中经编译后运行。
2.监控
把这个程序启动以后,咱们就能够看到Flink的监控页面,下面是一些监控信息。
咱们能够看到,在启动的Flink集群里面,有80个Task Managers,80个巢,1个空闲的巢数,红框点进去以后,就是下面的图片。
监控指标有不少。
四.总结与展望:
最后,咱们来作一下总结。以上只是关于Flink的一些简单介绍,关于Flink的内存管理、部署、内部执行机制等相关详细资料,咱们能够经过如下网站进行资料查询。
Apache Flink是有关Flink开源的官方网站。
Flink-Forward网站主要介绍各家大公司在使用Flink过程当中的心得体会,以及Flink自己的发展提案的一些相关内容。
dataArtisans是Flink背后的一个商业公司,Flink由它发展起来。它上面的博客包含好多关于Flinkd的介绍,以及一些有深度的文章。
Athenax主要是关于Flink的前瞻性研究的网站。
以上四部分就是本次线上直播旷东林老师讲述的主要内容,在提问环节有哪些问题呢?咱们一块儿来看看。
1.请老师讲讲Flink和最新版Spark的对比?
旷老师:spark streaming和flink是竞争关系,两个框架都是流处理里面用的比较多,Flink最大的优点在于保证高吞吐量状况下的低延迟,以及对复杂的带有状态的流的状态管理能力,还有就是很是灵活窗口的支持。
2.新版spark采用的是timeline db技术吗?
旷老师:不是的,timeline db在实现上与spark不是同样的,spark streaming是典型的微批次的流处理框架,其余的大部分都是基于pipeline的执行架构。
此次线上直播,相信你们对Flink流式处理有了进一步的认识,在这里咱们也很感谢旷东林老师的分享。想了解更多更详细内容的小伙伴们,能够关注服务号:FMI飞马网,点击菜单栏飞马直播,便可进行学习。