streaming 101

花了一天时间才看完了Tyler Akidau写的两篇关于流处理的文章,一是我英语一般,二是他用的词我也觉得比较生,所以理解的比较慢,三是看文章的环境比较嘈杂,难以专注。看之前就知道这是两篇能够提升你对流处理理解的文章,不是一般的提升,可以说是一种升华,因为他谈的不是一个具体的工具(spark streaming,flink等),而是谈流处理应该是怎么样的,流处理要打败批处理一统天下的话需要有什么特性,当然他也提到了传统的lambda架构,那当然是一顿批了。作者是google dataflow的作者,而到现时为止,dataflow是所有流处理工具中特性最全的,也是最先进的,所以这篇文章也有很高的参考价值。

术语

更正了我们对流处理的理解,我们以前都数据怎样来被处理来命名streaming,例如流处理系统,批处理系统等。但应该以它是什么来命名,bounded data和unbounded data。我们可以用流处理系统或者批处理系统来处理有边界的数据和无边界的数据。

关于lambda架构

lambda架构出现的原因是因为原有的批处理系统不能胜任实时任务,所以由流处理系统来处理实时的任务,但同时流处理系统计算出来的是不靠谱的结果,所以又必须由批处理系统来保证数据的正确性,所以lambda架构就是同时部署两套系统,然后综合两个系统的计算结果来输出最终结果

流处理胜过批处理

- 经过良好设计的流处理是批处理的超集

- 流处理要赶上批处理,要做到正确性(correctness)

- 流处理要胜过批处理,要需要有处理关于时间问题的工具(tools for reasoning about time)

时间域问题

有两个概念,分别是event time和processing time。由于各种原因,时间发生的时间和被处理的时间会有一定的偏差,而这也是现实世界中的常态。有时候如果我们需要对event time划分窗口的话,就需要有一些手段来处理:(1)什么时候才认为窗口内的所有事件都已经到达来(2)到达假如晚到达来怎么办。处理第一个问题可以用watermark,处理第二个问题用trigger

数据处理的模式

批处理 - bounded data

用批处理的话比较简单

批处理 - unbounded data

Fixed windows

将数据切分成一个个固定长度的窗口来处理,但是在批处理系统里,fixed window必须是批次间隔的倍数

sessions

按照一串有前后连续关系的事件来切分窗口,但是有可能一个session刚好被切分在两个不同的批次里。这样的话需要将session缝合到一起,但这样又会引入复杂性

流处理 - unbounded data

分布式数据源的特点,(1)高度无序(2)event time和processing time的skew不总是一样的

Highly unordered with respect to event times, meaning you need some sort of time-based shuffle in your pipeline if you want to analyze the data in the context in which they occurred.

Of varying event time skew, meaning you can’t just assume you’ll always see most of the data for a given event time X within some

有几种可以拿来处理这类型数据的方法,大概有以下几类:

- Time-agnostic

    这种用在时间不要紧的时候,例如filtering,inner-joins

- Approximation

    这种用在计算近似值的时候,例如top-n,k-means等

- Windowing by processing time

有三类窗口,fixed window,sliding window,sessions

按processing time来划分窗口比较简单,但是处理不了event time的问题

- Windowing by event time

这个处理比较复杂,作者在streaming 102中详细的解释了,大概就是watermark和triggers来处理event time和processing time不一致的问题

你可能感兴趣的:(streaming 101)