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之流处理理论基础的更多相关文章

  1. Flink在流处理上常见的Source和sink操作

    flink在流处理上的source和在批处理上的source基本一致.大致有4大类 1.基于本地集合的source(Collection-based-source) 2.基于文件的source(Fil ...

  2. flink的流处理特性

    flink的流处理特性: 支持高吞吐.低延迟.高性能的流处理 支持带有事件时间的窗口(Window)操作 支持有状态计算的Exactly-once语义 支持高度灵活的窗口(Window)操作,支持基于 ...

  3. Plink v0.1.0 发布——基于Flink的流处理平台

    Plink是一个基于Flink的流处理平台,旨在基于 [Apache Flink]封装构建上层平台. 提供常见的作业管理功能.如作业的创建,删除,编辑,更新,保存,启动,停止,重启,管理,多作业模板配 ...

  4. 《基于Apache Flink的流处理》读书笔记

    前段时间详细地阅读了 <Apache Flink的流处理> 这本书,作者是 Fabian Hueske&Vasiliki Kalavri,国内崔星灿翻译的,这本书非常详细.全面得介 ...

  5. 【Flink】流-表概念

    title: Flink流-表概念 date: 2017-12-12 14:48:16 categories: technique tags: Flink Flink Streaming Dynami ...

  6. 统一批处理流处理——Flink批流一体实现原理

    实现批处理的技术许许多多,从各种关系型数据库的sql处理,到大数据领域的MapReduce,Hive,Spark等等.这些都是处理有限数据流的经典方式.而Flink专注的是无限流处理,那么他是怎么做到 ...

  7. Flink的流处理API(二)

    一.Environment 1,getExecutionEnvironment getExecutionEnvironment会根据查询运行的方式决定返回什么样的运行环境,是最常用的一种创建执行环境的 ...

  8. Flink的流处理--KeyBy

    逻辑上将一个流分成不相交的分区,每个分区包含相同键的元素.在内部,这是通过散列分区来实现的 object Keyby { def main(args: Array[String]): Unit = { ...

  9. flink连接器-流处理-读写redis

    写入redis resultStream.addSink(new RedisSink(FlinkUtils.getRedisSinkConfig(parameters),new MyRedisMapp ...

随机推荐

  1. 开源业务规则引擎JBoss Drools

    Drools 是什么? 规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策.接受数据输入,解释业务规则,并根据业务规 ...

  2. Caffe2:添加CUDA路径

    在使用Eclipse时候,仍然出现 libcuda.so 找不到的情况..... 原因:cuda环境没有设置到系统环境中. 方案: 设置CUDA path: 在bashrc中添加路径,只对当前用户产生 ...

  3. PHP 之ftp客户端类封装实现

    <?php /** * Class FtpClient */ class FtpClient { private $host = '';//远程服务器地址 private $user = ''; ...

  4. 【HTTP/S】透明代理、匿名代理、混淆代理、高匿代理有什么区别?

    这4种代理,主要是在代理服务器端的配置不同,导致其向目标地址发送请求时,REMOTE_ADDR, HTTP_VIA,HTTP_X_FORWARDED_FOR三个变量不同. 1.透明代理(Transpa ...

  5. .net core 使用 textSharp生成pdf

    引入Nuget包 using iTextSharp.text; using iTextSharp.text.pdf; using System; using System.IO; namespace ...

  6. C#学习笔记_07_数组

    07_数组 数组的声明与实例化 名词解释 数组:数组是一个容器,用来存储一系列相兼容的数据类型的变量: 实例化:声明一个数组,并且赋初始值: 数组长度:就是数组的容量,表示这个数组可以存储多少个数据: ...

  7. 关于嵌入式web服务器

    1.boa的配置文件boa.conf Port 80 //服务访问端口 User 0 Group 0 ErrorLog /var/log/boa/error_log //错误日志地址 AccessLo ...

  8. ISNUMERIC()检测是否为数字

    ISNUMERIC ( expression )当输入表达式得数为一个有效的整数.浮点数.money 或 decimal 类型,那么 ISNUMERIC 返回 1:否则返回 0.返回值为 1 确保可以 ...

  9. hdu2003 求绝对值【C++】

    求绝对值 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  10. 用 console.time()和 console.timeEnd() 测试你的 javascript 代码执行效率

    无意中学习到了一种测试 javascript 代码执行效率的一种方法,就记下来便于以后使用,用到了console对象中的  time  和  timeEnd  方法 . console.time('m ...