一、流式计算的世界观
1.1 万物皆流
只要时间不停万事万物都没有静止。我们所以为的静态,不过是流中的一个片段。
意味着流的世界,不在乎所谓的状态,在乎的是变化,也就是事件的发生,通过事件来表示。
1.2 升维
批量的时代,我们只记录关键的信息,只在乎当前的状态,不会去记录状态是如何一步步变化至当前状态的,计算所面向的数据也是静态的,从一个态的数据变化到另一个静态的数据。
流的时代我们在乎的是变化,也就是一系列的事件,我们计算所面临将是时时刻刻在更新流动的数据。
这完全就上升了一个维度,就像四维生物可以穿梭于时间之中。
1.3 流的时间观念
时间对流来说是至关重要的,因为这关系事件与事件之间的顺序关系,一旦错乱便有可能导致计算出的当前状态是错误的。时间让事件有了秩序。
二、流式计算的实体
2.1 架构
数据源不断产生数据形成流,通过计算生成新的流,不断去更新目标数据源,实现结果数据的实时更新。
2.2 计算
流式计算和批量计算的算子无外乎都是那些数据的操作。区别就是批量面向的数据是一坨一坨打包好的,静态的;流式面向的是流无限的数据。在分布式环境中批量计算是将计算移动到相应的数据上进行运行,而流式计算是将定义好的计算部署到分布式的节点上,让数据在上面流动。
Map类:数据只依赖于当前这条数据。
agg:聚合操作
window:部分数据的聚到一起进行计算
join:不同的数据源通过相同的key进行融合
cep:例如,事件的模式匹配,例如给做了事件A之后做了事件B的用户发生运营短信。
其他
2.2 应用场景
1.低延时。比如实时的pv、uv。
2.实时ETL。例如行为数据join维表,近实时落入hdfs。
3.事件驱动场景。例如上面的cep。
三、流计算的难点
3.1 时间
第一部分说时间在流的世界观中代表了事件的秩序,因为实时的环境会由于各种各样的原因(比如网络延时)导致事件到达计算节点的顺序和发生的顺序很可能是不一样的。
3.2 有限的内存&无限的数据
流计算面临的是源源不断流入的数据,而如果还像批量计算那样的操作方式来计算的化,很可能就会导致计算根本无法结束,或者随着时间的推移需要保存的数据越来越多,导致内存爆掉。
3.3 longlive&错误恢复
因为数据是不断产生的,所以需要计算是longlive的,一直存在。但时间长了出问题的概率大大增加,一旦挂掉,一些计算过程缓存的数据怎么保存、怎么恢复机会是个比较大的问题。
3.4 分布式环境
分布式环境下,共享数据实时同步,实现协同,这又是另一个故事了。
3.5 动态扩容
流是实时的,那数据的速率就是不稳定的,就像明星结婚啥的,会有突发的高峰,如何能实时适应这样的突发。
四、总结
本文希望同学们能对流计算有个大概的了解,了解它的应用场景、架构、所面临的难点。了解了这些接下来学习就有了方向。
做题吗→_→ 【题目】划分版图-有点难,【解答】sql和其他语言的思考方式
学spark吗→_→ spark核心构件之Dependency(依赖) ,如何学习spark大数据
本文分享自微信公众号 - 曾二爷(zeng2ye)。
如有侵权,请联系 [email protected] 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。