随着大数据技术在各行各业的广泛应用,要求能对海量数据进行实时处理的需求越来越多,同时数据处理的业务逻辑也越来越复杂,传统的批处理方式和早期的流式处理框架也越来越难以在延迟性、吞吐量、容错能力以及使用便捷性等方面满足业务日益苛刻的要求。

在这种形势下,新型流式处理框架Flink通过创造性地把现代大规模并行处理技术应用到流式处理中来,极大地改善了以前的流式处理框架所存在的问题。飞马网于3月13日晚,邀请到大数据技术高级架构师—旷东林,在线上直播中,旷老师向我们分享了Flink在诸多方面的创新以及它本身所具有的独特能力。

我们主要从以下几个部分来看:

一.流式处理的背景:

传统的大数据处理方式一般是批处理式的,也就是说,今天所收集的数据,我们明天再把今天收集到的数据算出来,以供大家使用,但是在很多情况下,数据的时效性对于业务的成败是非常关键的。

1.流式处理的背景—必要性

比如说,在入侵检测的场景下,我们希望看到的结果是:一旦有入侵,我们能及时地作出响应。这种情况下,如果按照传统的批处理方式,是不可能在入侵的时候实时检测出结果的。另外,比如说在语音计算中,我们要实时监控各个虚拟器的运行状态以及出现错误时的预警,这种情况下,也要求我们能够实时监控数据,并对数据产生的各种报警,实时采取动作。由此,流式处理的必要性就显得无疑了。

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飞马网,点击菜单栏飞马直播,即可进行学习。

流式处理新秀Flink原理与实践的更多相关文章

  1. 使用flink Table &Sql api来构建批量和流式应用(3)Flink Sql 使用

    从flink的官方文档,我们知道flink的编程模型分为四层,sql层是最高层的api,Table api是中间层,DataStream/DataSet Api 是核心,stateful Stream ...

  2. 字节跳动流式数据集成基于Flink Checkpoint两阶段提交的实践和优化

    背景 字节跳动开发套件数据集成团队(DTS ,Data Transmission Service)在字节跳动内基于 Flink 实现了流批一体的数据集成服务.其中一个典型场景是 Kafka/ByteM ...

  3. Nebula Flink Connector 的原理和实践

    摘要:本文所介绍 Nebula Graph 连接器 Nebula Flink Connector,采用类似 Flink 提供的 Flink Connector 形式,支持 Flink 读写分布式图数据 ...

  4. 使用flink Table &Sql api来构建批量和流式应用(2)Table API概述

    从flink的官方文档,我们知道flink的编程模型分为四层,sql层是最高层的api,Table api是中间层,DataStream/DataSet Api 是核心,stateful Stream ...

  5. Demo:基于 Flink SQL 构建流式应用

    Flink 1.10.0 于近期刚发布,释放了许多令人激动的新特性.尤其是 Flink SQL 模块,发展速度非常快,因此本文特意从实践的角度出发,带领大家一起探索使用 Flink SQL 如何快速构 ...

  6. paip.自适应网页设计 跟 响应式 设计的区别跟原理and实践总结

    paip.自适应网页设计 跟 响应式 设计的区别跟原理and实践总结 响应式Web设计(Responsive Web design)的理念是: 1 #-----------自适应布局VS响应式布局 2 ...

  7. Flink 另外一个分布式流式和批量数据处理的开源平台

    Apache Flink是一个分布式流式和批量数据处理的开源平台. Flink的核心是一个流式数据流动引擎,它为数据流上面的分布式计算提供数据分发.通讯.容错.Flink包括几个使用 Flink引擎创 ...

  8. 流式大数据计算实践(1)----Hadoop单机模式

    一.前言 1.从今天开始进行流式大数据计算的实践之路,需要完成一个车辆实时热力图 2.技术选型:HBase作为数据仓库,Storm作为流式计算框架,ECharts作为热力图的展示 3.计划使用两台虚拟 ...

  9. 从flink-example分析flink组件(3)WordCount 流式实战及源码分析

    前面介绍了批量处理的WorkCount是如何执行的 <从flink-example分析flink组件(1)WordCount batch实战及源码分析> <从flink-exampl ...

随机推荐

  1. Node.js入门(含NVM、NPM、NVM的安装)

    本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. Node.js的介绍 引擎 引擎的特性: JS的内核即引擎.因为引擎有以 ...

  2. linux dns子域授权 split分离解析 缓存dns服务器

    DNS子域授权作用:适用于同一个DNS组织父/子域名的解析工作由不同的dns服务器负责父dns服务器应该有为子域名迭代的能力 上下级区域属于不同的机构管理:.cn与.Anonymous.cn.cn需要 ...

  3. jsencrypt参数前端加密c#解密

    写程序时一般是通过form表单或者ajax方式将参数提交到服务器进行验证,如何防止提交的请求不被抓包后串改,虽然无法说绝对安全却给非法提交提高了难度,本篇采用jsencypt在前端进行加密的并且用C# ...

  4. IE浏览器因缓存问题未能成功向后端发送请求的几个解决办法

    这段时间前后端联调,解决IE.谷歌等浏览器兼容问题,真是让人有点焦头烂额,各种奇葩问题层出不穷,旧问题刚去,新麻烦又来,其中尤其以IE浏览器缓存的问题最多.有若干次都是因为这个缓存,使得前端的请求没有 ...

  5. 【html5】html5离线存储

    html5本地存储之离线存储 1.为什么使用离线存储 ①最新的主流的浏览器中都已添加了对HTML5的offline storage功能的支持,HTML5离线存储功能非常强大, 它的作用是:在用户没有与 ...

  6. NetBeans部署项目(Extjs)报错(二)

    NetBeans部署项目(Extjs)报错(二) 1.具体错误如下: Using CATALINA_BASE: "C:\Users\Administrator.FOXB2MKB3RGUNIL ...

  7. linux中mysql命令方式备份数据的问题

    这几天公司新出了个组件化的项目,里面需要用到mysql数据库相关的技术,由于之前一直用的mongodb,所以mysql几乎忘光了,于是只能在linux虚拟机中重新开始学习. 基本的增删改查还好,但是在 ...

  8. (六)java结构控制语句

    选择语句,也叫条件分支语句:if--else和switch--case:其中if--else中的else是可选的,但是switch--case中的case是必须的.     switch后的条件必须是 ...

  9. unix时间戳转换成标准时间(c#)

    //---unix时间戳转换成标准时间(c#)---//     /*     string timeStamp = "1144821796";     DateTime dtSt ...

  10. 芝麻HTTP: Scrapy小技巧-MySQL存储

    这两天上班接手,别人留下来的爬虫发现一个很好玩的 SQL脚本拼接. 只要你的Scrapy Field字段名字和 数据库字段的名字 一样.那么恭喜你你就可以拷贝这段SQL拼接脚本.进行MySQL入库处理 ...