大数据系统的关键问题:如何实时地在任意大数据集上进行查询?
最简单的方法是,直接在全体数据集上运行查询函数得到结果,但是这种方法的计算代码太大,所以不现实。
Lambda架构通过分解的三层架构来解决该问题:Batch Layer,Speed Layer和Serving Layer,如下图所示:
1.Batch Layer
这层的功能主要有两点:
- 存储数据集
- 在数据集上预先计算查询函数,构建查询所对应的view
在全体数据集上运行查询的代价太大,但我们可以预先在数据集上计算并保存查询函数的结果,查询的时候可以直接返回结果(或通过简单加工)而无需重新进行完整费时的计算。
所以Batch Layer可以看成是一个数据预处理的过程。我们把针对查询预先计算并保存的结果称为View,其是Lamba架构的一个核心概念,通过View可以快速得到查询结果,如下图所示:
注意:View是一个和业务关联性比较大的概念,其创建需要从业务自身需求出发。
2.Speed Layer
Batch Layer可以很好的处理离线数据,但有很多场景数据不断实时生成,且需要实时查询处理。Speed Layer是用来处理增量的实时数据。
Speed Layer对数据进行计算并生成Realtime View,其主要区别如下:
- Speed Layer处理数据为最近的增量数据流,Batch Layer处理的是全体数据集
- Speed Layer为了效率,接收到新数据时不断更新Realtime View,而Batch Layer根据全体离线数据集直接得到Batch View。
Lambda架构将数据处理分解为Batch Layer和Speed Layer有如下优点:
- 容错性。Speed Layer中处理的数据也不断写入Batch Layer,当Batch Layer中重新计算的数据集包含Speed Layer处理的数据集后,当前的Realtime View就可以丢弃,这意味着Speed Layer处理中引入的错误,在Batch Layer重新计算时都可以得到修正。
- 复杂性隔离。Batch Layer处理的是离线数据,可以很好的掌控。Speed Layer采用增量算法处理实时数据,复杂性比Batch Layer要高很多。通过分开Batch Layer和Speed Layer,把复杂性隔离到Speed Layer,可以很好的提高整个系统的鲁棒性和可靠性。
3.Serving Layer
这一层用于响应用户的查询请求,合并Batch View和Realtime View中的结果数据集到最终的数据集。
这里涉及到数据合并的问题,如果查询函数满足Monoid性质(结合律,(a+b)+c = a + (b + c)),只需要简单的合并Batch View和Realtime View中的经过数据集。否则,需要把查询函数转换为多个满足Monoid性质的查询函数的运算,单独对每个满足Monoid性质的查询函数进行Batch View和Realtime View中的结果数据集合并,然后再计算得到最终的结果数据集。也可以根据业务自身特性,运用业务自身的规则来对Batch View和Realtime View中的结果数据集合并。
以下为Lambda架构的完整视图:
数据流进入系统后,同时发往Batch Layer和Speed Layer处理。Batch Layer以不可变模型离线存储所有数据集,通过在全体数据集上不断重新计算构建查询所对应的Batch Views。Speed Layer处理增量的实时数据流,不断更新查询所对应的Realtime Views。Serving Layer响应用户的查询请求,合并Batch View和Realtime View中的结果数据集到最终的数据集。
4.Lambda架构技术选型
下图给出了Lambda架构中各个层常用的组件。数据流存储可选用基于不可变日志的分布式消息系统Kafka;Batch Layer数据集的存储可选用Hadoop的HDFS,或者是阿里云的ODPS;Batch View的预计算可以选用MapReduce或Spark;Batch View自身结果数据的存储可使用MySQL(查询少量的最近结果数据),或HBase(查询大量的历史结果数据)。Speed Layer增量数据的处理可选用Storm或Spark Streaming;Realtime View增量结果数据集为了满足实时更新的效率,可选用Redis等内存NoSQL。