Flink之流处理理论基础
Introduction to Stateful Stream Processing
Traditional Data Infrastructures
企业的应用,如enterprise resource planning (ERP) systems, customer relationship management (CRM) software, or web-based applications等都会对DBMS进行操作,有时操作还会公用一个库甚至一个表。为减少应用间的耦合性,最近提出微服务概念。微服务之间通过标准接口,如RESTful HTTP进行连接。在这种情况下,微服务就可以使用自己的技术栈。
各个应用与事务数据库系统交互,这个系统的数据不能直接用于分析(格式、业务单一等问题)。想要对数据进行分析,需要对事务数据库的数据进行extract-transform-load (ETL),即复制、转换数据到数据仓库。
数据查询通常分为周期报告和热点查询。
Apache Hadoop的出现使得数据仓库的使用(存储、分析)成为可能。
Stateful Stream Processing
几乎所有的数据都是通过连续的事件流来创建的。 Stateful stream processing就是一个用来处理无界事件流的、较为通用的应用设计模式。任何处理事件流(不是简单的记录数据)的应用都需要是stateful的,即有能力存储和访问中间数据。这些状态state可存储在各种地方,如program variables, local files, or embedded or external databases。Flink把state存储到内存或绑定的数据库(不包括远程数据库),并周期性地将state的一致性checkpoint写到remote and durable storage。(state, state 一致性, and Flink’s checkpointing 机制后面介绍)
Stateful stream processing applications 通常处理事件日志,日志是append-only的,所以顺序是不变的。Flink能够保持日志的这一特点,即便是遇到挂机、升级和测试。
Stateful stream processing可以解决很多案例,其中常见的三类如下:
Event-driven Applications:接收事件流并对其执行业务逻辑,根据处理结果做出反应。场景:实时推荐、complex event processing (CEP如反作弊)、异常检测
Data Pipelines and Real-time ETL
Streaming Analytics:Flink可以把过去的数据分析步骤穿起来,包括 event ingestion, continuous computation including state maintenance, and updating the result.
The Evolution of Open Source Stream Processing
第一代分布式开源流处理器focused在millisecond latencies and provided guarantees that events would never be lost in case of a failure,但降低了结果的准确性、且处理一条数据多于一次。
第二代提高了准确性(结果仍取决于计时、事件到达时间)和数据只处理一次,但延迟提高到了秒级。
第三代解决了high throughput和low latency,made the lambda architecture obsolete。
Stream Processing Fundamentals
Introduction to dataflow programming
Dataflow graphs
Dataflow programs:类似Spark的DAG,节点称为operators并表示计算,而边表示数据依赖。没有输入端口的operators称为sources,没有输出端口的operators称为sinks。
physical dataflow graph:包含计算的细节。在这里operators变为tasks
Data parallelism and task parallelism
前者 partition input data and have tasks of the same operation execute on the data subsets in parallel
后者 have tasks from different operators performing computations on the same or different data in parallel.
Data exchange strategies
定义数据在physical dataflow graph中的分配方式。
- forward:两个任务的数据在同一机器上,不跨节点
- broadcast:如果下一级有n个并行任务,那么一个节点的所有数据都被复制n份,分别发到n个节点上。
- key-based:类似于groupbyKey,相同key到相同的任务
- random:为了平均分布数据到n个并行任务
Processing infinite streams in parallel
定义:A data stream is a potentially unbounded sequence of events
events可以是监测数据、传感器的测量、信用卡交易等。
Latency and throughput
Latency:不是平均延迟,而是每次都要低延迟。Throughput:处理速度。两者必须做取舍,除非增加机器来提高并行处理。
背压backpressure :数据涌入的速度大于处理速度,并挤爆了缓冲区,数据就会丢失。
Operations on data streams
计算可分为无状态和有状态。前者不保留历史,计算更快,失败也可重算。有状态则可以用于更新。
Data ingestion and data egress,即source和sink
Transformation operations:相当于map操作
Rolling aggregation
Window:为了得到计算结果,必须收集并存储数据时用(在存储期间可用于查询)。窗口运算不断产生有限数据集buckets。事件会被根据其特征或到达时间分配到buckets。所以这种运算要定义buckets什么时候被使用(触发条件),事件分配规则和产生buckets的频率。
Tumbling:不重叠的固定大小(数量或者时间)
Sliding:重叠固定大小
Session:设定不活跃时间长度,timeout就算session窗口结束
这些窗口也可以并行,比如一个窗口针对同一id的信息
Time semantics
Processing time:服务端处理数据的时点,适合低延迟要求高的,准确度稍低的,因为不需要理会延迟和数据产生顺序,数据一旦到达或达到触发数量就可以进行计算。但这样的结果是不一致的(不同顺序、数据),不可reproduce的。
Event time:客户端产生数据的时点,适合场景反之,即便乱序也能保持唯一正确。
Watermarks:设定多久不再接受延迟的信息,这是低延迟和准确性的权衡。stream processing system提供超出watermarks范围的数据的处理方式很重要,比如忽略、记录或者用它来更新数据。
State and consistency models
由于流数据是无界的,所以要限定state的大小,比如聚合成一些指标或保留部分特征等。state的实现要防止并发更新、划分数据流和保证数据的准确。
Task failures:一个任务的顺序:接收事件(存入buffer)、可能要更新state、产生结果。任务失败可以是这里的任何一个步骤。
假设:这里假设网络不会丢失和重复数据。未失败的任务都遵循上述步骤。
Result guarantees
AT-MOST-ONCE:do nothing,数据丢失,适合准确度要求不高的。
AT-LEAST-ONCE:保证没有数据丢失,即便对数据进行重复处理(即也不一定准确)。
EXACTLY-ONCE:没有数据丢失、数据只处理一次。即如果任务失败,在重启计算时会知道上一次更新是否已经反映在state上。
END-TO-END EXACTLY-ONCE:包括source和sink的整个pipeline
不一定所有情况都需要最高级别的保证,如计算最值就可以采用AT-LEAST-ONCE
参考:
Stream Processing with Apache Flink by Vasiliki Kalavri; Fabian Hueske
Flink之流处理理论基础的更多相关文章
- Flink在流处理上常见的Source和sink操作
flink在流处理上的source和在批处理上的source基本一致.大致有4大类 1.基于本地集合的source(Collection-based-source) 2.基于文件的source(Fil ...
- flink的流处理特性
flink的流处理特性: 支持高吞吐.低延迟.高性能的流处理 支持带有事件时间的窗口(Window)操作 支持有状态计算的Exactly-once语义 支持高度灵活的窗口(Window)操作,支持基于 ...
- Plink v0.1.0 发布——基于Flink的流处理平台
Plink是一个基于Flink的流处理平台,旨在基于 [Apache Flink]封装构建上层平台. 提供常见的作业管理功能.如作业的创建,删除,编辑,更新,保存,启动,停止,重启,管理,多作业模板配 ...
- 《基于Apache Flink的流处理》读书笔记
前段时间详细地阅读了 <Apache Flink的流处理> 这本书,作者是 Fabian Hueske&Vasiliki Kalavri,国内崔星灿翻译的,这本书非常详细.全面得介 ...
- 【Flink】流-表概念
title: Flink流-表概念 date: 2017-12-12 14:48:16 categories: technique tags: Flink Flink Streaming Dynami ...
- 统一批处理流处理——Flink批流一体实现原理
实现批处理的技术许许多多,从各种关系型数据库的sql处理,到大数据领域的MapReduce,Hive,Spark等等.这些都是处理有限数据流的经典方式.而Flink专注的是无限流处理,那么他是怎么做到 ...
- Flink的流处理API(二)
一.Environment 1,getExecutionEnvironment getExecutionEnvironment会根据查询运行的方式决定返回什么样的运行环境,是最常用的一种创建执行环境的 ...
- Flink的流处理--KeyBy
逻辑上将一个流分成不相交的分区,每个分区包含相同键的元素.在内部,这是通过散列分区来实现的 object Keyby { def main(args: Array[String]): Unit = { ...
- flink连接器-流处理-读写redis
写入redis resultStream.addSink(new RedisSink(FlinkUtils.getRedisSinkConfig(parameters),new MyRedisMapp ...
随机推荐
- servlet得到web应用路径
package context; import java.io.IOException; import javax.servlet.ServletContext; import javax.servl ...
- java攻城狮之路--复习xml&dom_pull编程
xml&dom_pull编程: 1.去掉欢迎弹窗界面:在window项的preferences选项中输入“configuration center” 找到这一项然后 把复选框勾去即可. ...
- java设计模式03装饰者者模式
动态地给一个对象添加一些额外的职责.就增加功能来说, Decorator模式相比生成子类更为灵活.该模式以对客 户端透明的方式扩展对象的功能. (1)在不影响其他对象的情况下,以动态.透明的方式给单个 ...
- Zabbix 客户端安装教程(第二篇)
Zabbix 客户端安装教程 blog地址:http://www.cnblogs.com/caoguo [root@localhost ~]# yum install -y gcc make [roo ...
- 关于Python中的类普通继承与super函数继承
关于Python中的类普通继承与super函数继承 1.super只能用于新式类 2.多重继承super可以保公共父类仅被执行一次 一.首先看下普通继承的写法 二.再看看super继承的写法 参考链接 ...
- css nth-child 的应用
最近改视频监控页面,由于窗口比较多,以前是通过计算窗口大小位置来处理页面布局的,其实还是比较麻烦,而且偶尔会有页面位置错乱的现象,虽然只是及其偶尔的现象,但总归是不好. 计算窗口位置的代码: /*监控 ...
- c++选择文件夹对话框
1,目的 提供一个对话框供用户选择一个文件夹路径. 2,原理&实现 先贴上这个工具类的源码: 在你的程序中使用静态方法 CSelectFolderDlg::Show() 就能显示一个选择文件夹 ...
- BZOJ 2626: JZPFAR KDtree + 堆
Code: #include<bits/stdc++.h> #define maxn 200000 #define inf 1000000000000000 #define mid ((l ...
- mysql在windows上安装
一.在window上安装mysql MySQL是一个小巧玲珑但功能强大的数据库,目前十分流行.但是官网给出的安装包有两种格式,一个是msi格式,一个是zip格式的.很多人下了zip格式的解压发现没有s ...
- JavaSE 学习笔记之package包(十一)
包:定义包用package关键字. 1:对类文件进行分类管理. 2:给类文件提供多层名称空间. 如果生成的包不在当前目录下,需要最好执行classpath,将包所在父目录定义到classpath变量中 ...