在聊lambda之前,首先要聊聊大数据中的一个痛点:如何在海量数据里做即时查询?
其实最简单的解决方法就是直接对海量数据做计算做查询,但是效率可想而知,有些计算可能需要几个小时甚至几天来完成,那么在这个需求下,lambda架构就孕育而生了。
Lambda架构由Storm 的作者 [Nathan Marz] 提出, 此架构的设计是为了在处理大规模数据时,同时发挥流处理和批处理的优势。通过批处理提供全面、准确的数据,通过流处理提供低延迟的数据,从而达到平衡延迟、吞吐量和容错性的目的。为了满足下游的即席查询,批处理和流处理的结果会进行合并。
Marz认为,大数据系统应当具有以下的关键特性
对于数据系统,可以简化为:数据系统 = 数据 + 查询
lambda架构中对数据存储采用的方式是:数据不可变,存储所有数据。
通过采用不可变方式存储的数据,可以有以下好处
- 简单,采用不可变的数据模型,存储数据时只需要简单的往主数据集后追加数据即可。相比于采用可变的数据模型,为了Update操作,数据通常需要被索引,从而能快速找到要更新的数据去做更新操作。
- 应对人为和机器的错误。前述中提到人和机器每天都可能会出错,如何应对人和机器的错误,让系统能够从错误中快速恢复极其重要。不口变性(Immutability)和重新计算(Recomputation)则是应对人为和机器错误的常用方法。采用可变数据模型,引发错误的数据有可能被覆盖而丢失。相比于采用不可变的数据模型,因为所有的数据都在,引发错误的数据也在。
修复的方法就可以简单的是遍历数据集上存诸的所有的数据,丢弃错误的数据,重新计算得到Views。重新计算的关键点在于利用数据的时间特性决定的全局次序,依次顺序重新执行。必然能得到正确的结果。
——引用自 微信公众号 大数据肌肉猿
对于数据系统中的查询,有一类成为Monoid特性的函数应用非常广泛,简单来说有些类似于加法的结合律 ( a + b ) + c = a + ( b + c ),比如多个数的平均值Avg函数,多个平均值没法直接通过结合来得到最终的值,可以通过拆成分母除以分子,分母和分子都是证书的加法,从而来达到目的,这个特性在分布式计算中极其重要,我们可以使用这个特性,将计算分解到多个节点并行计算,再结合各自的部分运算结果得到最终结果,同时也意味着部分运算结果可以储存下来被别的运算共享利用,从而减少重复运算工作量。
正如我们文章开头提出的问题,海量数据的即时计算即使查询的痛点,我们可以使用lambda架构来解决。
lambda架构分为三层
这里涉及到上文中提到的加法结合律数据合并问题,只需要简单的合并Batch View和Realtime View。否则,需要把查询函数转换为多个满足Monoid性质的查询函数的运算,单独对每个满足Monoid性质的查询函数进行Batch View和Realtime View中的结果数据集合并,然后再计算得到最终的结果数据集。也可以根据业务自身特性,运用业务自身的规则来对Batch View和Realtime View中的结果数据集合并。
Speed Layer中处理的数据也不断写入Batch Layer,当Batch Layer中重新计算的数据集包含Speed Layer处理的数据集后,当前的Realtime View就可以丢弃,这也就意味着Speed Layer处理中引入的错误,在Batch Layer重新计算时都可以得到修正。这点也可以看成是CAP理论中的最终一致性(Eventual Consistency)的体现。
上面分别讨论了Lambda架构的三层:Batch Layer,Speed Layer和Serving Layer。下图给出了Lambda架构的一个完整视图和流程。数据流进入系统后,同时发往Batch Layer和Speed Layer处理。Batch Layer以不可变模型离线存储所有数据集,通过在全体数据集上不断重新计算构建查询所对应的Batch Views。Speed Layer处理增量的实时数据流,不断更新查询所对应的Realtime Views。Serving Layer响应用户的查询请求,合并Batch View和Realtime View中的结果数据集到最终的数据集。
我们创建一个示例应用来演示Lambda架构,这个实力的主要目的是统计从某时刻到现在此时此刻的#标签
为了简单起见,假设我们的主数据集包含自时间开始以来的所有标签数据,此外我们做了一个预计算的批处理View,其中包含自项目运行时间开始依赖的#标签统计信息
apache - 6
spark - 15
flink - 14
beam - 2
lambda - 5
ranger - 7
kerberos - 9
hbase - 3
当程序运行中,我们的程序接收到了新的标签信息,如下
#lambda#ranger#spark#apache
这是我们的Speed Layer层会对新数据做实时统计,并生成Realtime View,如下
lambda - 1
ranger - 1
spark - 1
apache - 1
当终端用户查询结果时,我们只需要将Batch View和Realtime View合并即可
apache - 7
spark - 16
flink - 14
beam - 2
lambda - 6
ranger - 8
kerberos - 9
hbase - 3
lambda不只有优点,也还是存在一些缺点,我们在做架构选型时,也要考虑当前现有的场景、硬件条件来做选择。
优点:
缺点: