伴随着海量增长的数据,数字化时代的未来感扑面而至。不论是结绳记事的小数据时代,还是我们正在经历的大数据时代,计算的边界正在被无限拓宽,而数据的价值再也难以被计算。时下,谈及大数据,不得不提到热门的下一代大数据计算引擎Apache Flink(以下简称Flink)。

统一的批处理与流处理系统

在大数据处理领域,批处理任务与流处理任务一般被认为是两种不同的任务,一个大数据项目一般会被设计为只能处理其中一种任务,例如Apache Storm、Apache Smaza只支持流处理任务,而Aapche MapReduce、Apache Tez、Apache Spark只支持批处理任务。Spark Streaming是Apache Spark之上支持流处理任务的子系统,看似一个特例,实则不然——Spark Streaming采用了一种micro-batch的架构,即把输入的数据流切分成细粒度的batch,并为每一个batch数据提交一个批处理的Spark任务,所以Spark Streaming本质上还是基于Spark批处理系统对流式数据进行处理,和Apache Storm、Apache Smaza等完全流式的数据处理方式完全不同。目前同时支持流处理和批处理的计算引擎,只有两种选择:一个是Apache Spark,一个是Apache Flink。通过其灵活的执行引擎,Flink能够同时支持批处理任务与流处理任务。

在执行引擎这一层,流处理系统与批处理系统最大不同在于节点间的数据传输方式。对于一个流处理系统,其节点间数据传输的标准模型是:当一条数据被处理完成后,序列化到缓存中,然后立刻通过网络传输到下一个节点,由下一个节点继续处理。而对于一个批处理系统,其节点间数据传输的标准模型是:当一条数据被处理完成后,序列化到缓存中,并不会立刻通过网络传输到下一个节点,当缓存写满,就持久化到本地硬盘上,当所有数据都被处理完成后,才开始将处理后的数据通过网络传输到下一个节点。这两种数据传输模式是两个极端,对应的是流处理系统对低延迟的要求和批处理系统对高吞吐量的要求。Flink的执行引擎采用了一种十分灵活的方式,同时支持了这两种数据传输模型。Flink以固定的缓存块为单位进行网络数据传输,用户可以通过缓存块超时值指定缓存块的传输时机。如果缓存块的超时值为0,则Flink的数据传输方式类似上文所提到流处理系统的标准模型,此时系统可以获得最低的处理延迟。如果缓存块的超时值为无限大,则Flink的数据传输方式类似上文所提到批处理系统的标准模型,此时系统可以获得最高的吞吐量。同时缓存块的超时值也可以设置为0到无限大之间的任意值。缓存块的超时阈值越小,则Flink流处理执行引擎的数据处理延迟越低,但吞吐量也会降低,反之亦然。通过调整缓存块的超时阈值,用户可根据需求灵活地权衡系统延迟和吞吐量。下图为Flink执行引擎数据传输模式:

在统一的流式执行引擎基础上,Flink同时支持了流计算和批处理,并对性能(延迟、吞吐量等)有所保障。相对于其他原生的流处理与批处理系统,并没有因为统一执行引擎而受到影响从而大幅度减轻了用户安装、部署、监控、维护等成本。

Flink的技术栈

Flink核心是一个流式的数据流执行引擎,其针对数据流的分布式计算提供了数据分布、数据通信以及容错机制等功能。基于流执行引擎,Flink提供了诸多更高抽象层的API以便用户编写分布式任务:

  1. DataSet API,对静态数据进行批处理操作,将静态数据抽象成分布式的数据集,用户可以方便地使用Flink提供的各种操作符对分布式数据集进行处理,支持Java、Scala和Python。
  2. DataStream API,对数据流进行流处理操作,将流式的数据抽象成分布式的数据流,用户可以方便地对分布式数据流进行各种操作,支持Java和Scala。
  3. Table API,对结构化数据进行查询操作,将结构化数据抽象成关系表,并通过类SQL的DSL对关系表进行各种查询操作,支持Java和Scala。

此外,Flink还针对特定的应用领域提供了领域库,例如Flink ML,Flink的机器学习库,提供了机器学习Pipelines API并实现了多种机器学习算法;还有Gelly,Flink的图计算库,提供了图计算的相关API及多种图计算算法实现。

另外,Flink也可以方便地和Hadoop生态圈中其他项目集成,例如Flink可以读取存储在HDFS或HBase中的静态数据,以Kafka作为流式的数据源,直接重用MapReduce或Storm代码,或是通过YARN申请集群资源等。Flink的技术栈如下所示:

Flink的状态管理

Flink最区别于其他流计算引擎的,其实就是状态管理。什么是状态?例如开发一套流计算的系统或者任务做数据处理,可能经常要对数据进行统计,如Sum,Count,Min,Max,这些值是需要存储的。因为要不断更新,这些值或者变量就可以理解为一种状态。如果数据源是在读取Kafka,RocketMQ,可能要记录读取到什么位置,并记录Offset,这些Offset变量都是要计算的状态。

Flink提供了内置的状态管理,可以把这些状态存储在Flink内部,而不需要把它存储在外部系统。这样做的好处是第一降低了计算引擎对外部系统的依赖以及部署,使运维更加简单;第二,对性能带来了极大的提升:如果通过外部去访问,如Redis,HBase它一定是通过网络及RPC。如果通过Flink内部去访问,它只通过自身的进程去访问这些变量。同时Flink会定期将这些状态做Checkpoint持久化,把Checkpoint存储到一个分布式的持久化系统中,比如HDFS。这样的话,当Flink的任务出现任何故障时,它都会从最近的一次Checkpoint将整个流的状态进行恢复,然后继续运行它的流处理。对用户没有任何数据上的影响。

那么Flink是如何做到在Checkpoint恢复过程中没有任何数据的丢失和数据的冗余?来保证精准计算的?这其中原因是Flink利用了一套非常经典的Chandy-Lamport算法,它的核心思想是把这个流计算看成一个流式的拓扑,定期从这个拓扑的头部Source点开始插入特殊的Barries,从上游开始不断的向下游广播这个Barries。每一个节点收到所有的Barries,会将State做一次Snapshot,当每个节点都做完Snapshot之后,整个拓扑就算完整的做完了一次Checkpoint。接下来不管出现任何故障,都会从最近的Checkpoint进行恢复。Flink利用这套经典的算法,保证了强一致性的语义。这也是Flink与其他无状态流计算引擎的核心区别。

Flink流计算引擎相关推荐

  1. 基于 Flink 流计算实现的股票交易实时资产应用

    01 背景 本次赛题思路源自于真实工作场景的一个线上项目,该项目在经过一系列优化后已稳定上线,在该项目开发的过程中数据平台组和技术负责人提供了许多资源和指导意见,而项目的结果也让我意识到了流计算在实际 ...

  2. 流计算引擎数据一致性的本质

    简介: 本篇文章从流计算的本质出发,重点分析流计算领域中数据处理的一致性问题,同时对一致性问题进行简单的形式化定义,提供一个一窥当下流计算引擎发展脉络的视角,让大家对流计算引擎的认识更为深入,为可能的 ...

  3. Flink流计算WordCount代码示例

    代码 package com.zxl.flinkimport org.apache.flink.streaming.api.scala.StreamExecutionEnvironment/*** f ...

  4. Spark精华问答 | 为什么选择Spark作为流计算引擎?

    总的来说,Spark采用更先进的架构,使得灵活性.易用性.性能等方面都比Hadoop更有优势,有取代Hadoop的趋势,但其稳定性有待进一步提高.我总结,具体表现在如下几个方面. 1 Q:为什么选择K ...

  5. Flink——实时计算引擎

    Flink介绍 框架和分布式流处理引擎,应用于持续生成新数据的场景,如:电商促销时的实时交易总额榜,TOP5最受欢迎的产品等等,简单描述如下: 数据实时采集-->数据实时计算-->数据实时 ...

  6. 7、Flink 流计算处理和批处理平台

    一.Flink 基本概念 Flink 是一个批处理和流处理结合的统一计算框架,其核心是一个提供了数据分发以及并行化计算的流数据处理引擎.它的最大亮点是流处理,是业界最顶级的开源流处理引擎.Flink ...

  7. Flink流计算编程--在WindowedStream中体会EventTime与ProcessingTime

    一.Flink流处理简介 Flink流处理的API叫做DataStream,可以在保证Exactly-Once的前提下提供高吞吐.低延时的实时流处理. 二.Flink中的Time模型 Flink中提供 ...

  8. Flink流计算可视化平台

    github 地址 https://github.com/zhp8341/flink-streaming-platform-web (建议) 国内 gitee 地址 https://gitee.com ...

  9. 【Flink】Flink 流计算 容错 source节点进行数据容错

    1.概述 本博客是视频的笔记:Apache Flink 知其然,知其所以然(原理&实战) 就是当流任务失败的时候,如何让flink从数据源上次消费的位置开始消费. 2.案例 2.1 没有che ...

最新文章

  1. idea 查看jsp是否被引用_全网最全的IDEA热部署方案,看完再也不用加班了!
  2. 利用服务器修改服务器数据,用Jquery实现可编辑表格并用AJAX提交到服务器修改数据...
  3. RSA算法原理——(2)RSA简介及基础数论知识
  4. Java 面试题全梳理
  5. 每天进步一点点《ML - 从极大似然到EM算法》
  6. 卡特兰(Catalan)数列
  7. chrome charset使用_SourceMap-使用教程
  8. RHEL6本地YUM源配置
  9. php存省市,PHP格式化全国省市区列表
  10. 美团财报数据初步分析
  11. BJFU_数据结构习题_274六度空间理论
  12. java xml 小于等于_MyBatis中xml文件中的大于 大于等于 小于 小于等于 写法
  13. 戴维·萨尔诺夫,霍华德·阿姆斯特朗以及超外差无线接收机
  14. OUC暑期培训(深度学习)——第五周学习记录:ShuffleNet EfficientNet 迁移学习
  15. word press html,wordpress广告插件24款 管理网站广告代码很方便
  16. Web应用多账号系统设计及微信扫码登录实现
  17. 使用Dynamo和Python,读取坐标点实现钢结构的建模及构件旋转
  18. npm命令安装element-ui报错
  19. 微信登录并拿手机号码(实战)目前仅公众号及小程序登录
  20. 扫码枪多次扫码用空格分开

热门文章

  1. Lenovo E430
  2. 解决PyCharm中的Manage Repositories为空
  3. python圣诞树代码成品图片动态_节日快乐! Python画一棵圣诞树送给你
  4. 全球及中国DHA粉行业消费需求调查与竞争前景研究报告2022-2028年
  5. GBase 8c V3.0.0版本关键字介绍
  6. VSFTP安装部署及配置
  7. 【RPA研究】Gartner公布影响企业发展的10大科技,RPA居首
  8. 人还是要有幻想的(22)
  9. Python爬取小说网站总推荐排行榜所有小说~
  10. AutoRun.inf 文件详解