这个系列文章之前因为私事荒废了很久,继续更新~~之前与老大谈论架构时,老大和我聊了聊分布式数据处理之中的Lambda结构,之前在《Designing Data-Intensive Applications》这本书之中,作者 Martin Kleppmann也在文中涉及到了通过重型批处理与灵活的流处理相结合的方式来构建分布式计算系统。所以这次也是借这个机会重新梳理Lambda架构与后续由Jay Kreps提出改进的Kappa架构,结合个人对于数据系统的思考,展开聊一聊分布式计算系统的一些设计思路。由不足之处,望多多指教........

1.Lambda架构

首先我们来看看什么是Lambda架构,Lambda演算在编程语言之中是一个编程范式,它遵循如下几个特点:

  • 1、数据的不可变性,任何对于数据的操作是没有副作用。
  • 2、数据的无依赖性,即对函数提供同样的输入,那么函数总是返回同样的结果。
  • 3、函数是First Class,函数与其他数据类型一样,处于平等地位,可以赋值给其他变量,也可以作为参数,传入另一个函数,或者作为别的函数的返回值。

来自Twitter的Nathan Marz,Marz认为进行计算处理的大数据框架的本质逻辑与函数式编程的思路是不谋而合,所以Marz根据自己多年进行分布式数据系统开发的经验总结提出了Lambda架构。(Marz大神是AFS顶级项目Storm的作者,Storm作为一个优秀的分布式流处理系统)所以接下来我们来看看Marz所提出的Lambda架构是怎么样:

Lambda架构说起来也很简单,就是通过分布式系统的组件搭建,设计出一个具有鲁棒性,可扩展,低延时的分布式计算系统。之所以称之为Lambda架构,就是它最为核心的点就是理由了数据处理过程之中的不可变性与无依赖性。下图展现了一个典型的Lambda架构的分层逻辑:

由上图可以看到,一个典型的Lambda架构的核心分为三个层次:Batch Layer,Speed Layer和Serving Layer。

  • Batch Layer
  • Speed Layer
  • Serving Layer

我们来梳理一下他们是如何分工协助的:首先new data作为整个数据系统的数据源头,Batch Layer作为数据的批处理层次对原始数据进行加工与处理,并且将处理的数据结果的Batch View输入到Serving Layer。(这里对应的是全量数据)

Speed Layer对于实时增加的数据进行处理,生成对增量数据计算结果的Realtime Views。(这里对应的是增量数据

最终用户查询是通过Batch View与Realtime View相结合的形式将最终结果呈现出来。

并且随着时间的推移,Batch View的计算结果会逐渐替代Realtime View,而业务层可以低延迟的访问由Serving Layer提供的Batch View,也可以通过Realtime View实时反馈业务结果。

我们可以看到在Lambda架构之中,所有的数据都需要满足满足不可变性与无依赖性,出现任何数据问题时,(如出错,丢失等)只需要重新跑一遍算法就可以恢复所需的数据了。

业务场景理解

下面笔者利用一个业务场景简单阐述一下Lambda模式,如下的业务场景只是基于笔者对电商推荐的理解所表述的,对应电商未必实际之中就是采取笔者所阐述的模式

1:下图是笔者访问x宝网首页所展示的广告页面:

对于这个推荐数据,可以理解为通过Batch Layer对我个人历史数据进行处理之后得出的Batch View推荐。(例如跑Spark Mllib或是Hadoop Mahout对历史数据进行分析推荐的结果,跑这类算法通常费时费力,可以通过提前计算的方式存入MySQL等,后续用户访问时可以直接调用

2:接下来笔者在x宝网搜索了MacBook proThinkPad x207,对于实时搜索的数据,可以作为流数据实时的通过Speed Layer进行处理。(例如Storm这样的流处理器

3: 笔者切换回到x宝网的首页,发现多了一个推荐广告项目:Dell 8代CPU专业级显卡,晒单还送爱奇艺半年卡。显然实时流的Realtime ViewBatch View共同组成的x宝网的推荐首页内容,很好的反馈了用户的实时需求:

小结

Lambda架构结合了实时处理与批处理的结果,很好的反馈了查询需求,并且在速度和可靠性之间求取了平衡,具有足够的扩展性。在Lambda架构之中,所有的查询都可以定位成一个函数:

Query = Function(Data)

而Lambda架构将数据和计算系统进行细分:

Query = Batch(Old_Data) + RealTime(New_Data)

但是这种架构同样存在一些问题:需要运维两套不同的计算系统,并且合并查询结果,这一定程序上带来了复杂性的增加

2.Kappa架构

Lambda架构诞生之后,来自Linkedln的技术主管Jay Kreps提出了一些质疑,并在Lambda架构之上提出自己的改进版本,将其命名为Kappa架构。

Lambda架构最麻烦的问题就在于:新的逻辑需要两次编码,并且在两个系统中运行和调试代码,需要多运维一个额外的系统。所以Kreps认为Lambda架构试图在两个不同编程范式的顶部建立一个抽象层是非常难的。

而Kappa架构尝试通过一个流处理系统来处理上述两种逻辑,我们来看看Kappa架构是怎么样去设计的:

Kappa架构通过流处理系统的并行机制,来提高并行以实现重复处理。但是很多人会觉得流式处理对于历史数据的高吞吐量会力不从心,这里Kreps给出的解决方案是:仅仅重复处理的完整日志数据。加入需要重复处理30天数据,就利用Kafka保留到30天。

所以这里是开辟另个流式处理来处理新的数据,输出数据是直接输出到一个新的输出表。当这第二个流式处理完成之后,切换到新的表中进行读取,然后停止旧的流式处理,再删除旧的输出表。

同样的,笔者上文举的例子,同样也能通过Kappa架构来实现购物的广告展示。Kappa架构最为核心的是通过一个范式解决需要共同解决的问题。同时不需要引入额外计算系统进行运维。

3.小结

到此为止,笔者也大致聊完两种不同分布式计算系统的架构。笔者认为Lambda架构是一个优秀的解决分布式计算的架构,但需要处理运维不同的大数据系统,并且额外编码逻辑,对于开发者与运维人员都是一个较大的考验。而Kappa架构简化了这个模型,但是对于数据处理总归很难拿出重型的批处理做一个完整数据计算,所以计算结果的准确性是有所限缩的。(也就是对于业务场景是挑剔的,我想也没有一种架构是解决问题的银弹,之间的取舍需要我们开发人员进行完整的评估~~)

而Spark能够通过一个计算框架同时解决批处理计算与流计算的问题,是很值得开发与运维人员所关注的.........

大数据小视角4:小议Lambda 与 Kappa 架构,不可变数据的计算探索的更多相关文章

  1. 大数据小视角1:从行存储到RCFile

    前段时间一直在忙碌写毕设与项目的事情,很久没有写一些学习心得与工作记录了,开了一个新的坑,希望能继续坚持写作与记录分布式存储相关的知识.为什么叫小视角呢?因为属于随想型的内容,可能一个由小的视角来审视 ...

  2. 大数据小视角2:ORCFile与Parquet,开源圈背后的生意

    上一篇文章聊了聊基于PAX的混合存储结构的RCFile,其实这里笔者还了解一些八卦,RCfile的主力团队都是来自中科院的童鞋在Facebook完成的,算是一个由华人主导的编码项目.但是RCfile仍 ...

  3. 大数据小视角5:探究SSD写放大的成因与解决思路

    笔者目前开发运维的存储系统的服务器都跑在SSD之上,目前单机服务器最大的SSD容量有4T之多.(公司好有钱,以前在实验室都只有机械硬盘用的~~)但SSD本身的特性与机械硬盘差距较大,虽然说在性能上有诸 ...

  4. 大数据小视角3:CarbonData,来自华为的中国力量

    连续两篇文章都聊了不同的存储格式,这篇我们继续深入来看看在存储格式的演变之上有什么新的"黑科技".华为公司在2016年开源了类parquet的列存格式:CarbonData,并且贡 ...

  5. 大数据处理中的Lambda架构和Kappa架构

    首先我们来看一个典型的互联网大数据平台的架构,如下图所示: 在这张架构图中,大数据平台里面向用户的在线业务处理组件用褐色标示出来,这部分是属于互联网在线应用的部分,其他蓝色的部分属于大数据相关组件,使 ...

  6. 【大数据】大数据处理-Lambda架构-Kappa架构

    大数据处理-Lambda架构-Kappa架构 elasticsearch-head Elasticsearch-sql client NLPchina/elasticsearch-sql: Use S ...

  7. 大数据项目之_15_电信客服分析平台_01&02_项目背景+项目架构+项目实现+数据生产+数据采集/消费(存储)

    一.项目背景二.项目架构三.项目实现3.1.数据生产3.1.1.数据结构3.1.2.编写代码3.1.3.打包测试3.2.数据采集/消费(存储)3.2.1.数据采集:采集实时产生的数据到 kafka 集 ...

  8. winform 异步读取数据 小实例

    这几天对突然对委托事件,异步编程产生了兴趣,大量阅读前辈们的代码后自己总结了一下. 主要是实现 DataTable的导入导出,当然可以模拟从数据库读取大量数据,这可能需要一定的时间,然后 再把数据导入 ...

  9. ArcGIS Earth数据小析

    ArcGIS Earth,一款轻量级的三维地球应用.因为工作关系下载试用了半天,正好借这个机会简单研究一下ArcGIS Earth的大概思路,特别是地形数据的组成和影像数据的加载,在这总结整理一下.下 ...

随机推荐

  1. [JSOI2008]魔兽地图

    Description DotR里面的英雄只有一个属性——力量. 他们需要购买装备来提升自己的力量值,每件装备都可以使佩戴它的英雄的力量值提高固定的点数,所以英雄的力量值等于它购买的所有装备的力量值之 ...

  2. 【洛谷P2114】起床困难综合征 位运算+贪心

    题目大意:给定 N 个操作,每个操作为按位与.或.异或一个固定的数字,现在要求从 0 到 M 中任选一个数字,使得依次经过 N 个操作后的值最大. 题解:位运算有一个重要的性质是:位运算时,无进位产生 ...

  3. 【洛谷P1101】单词方阵

    题目大意:给一 \(n \times n\) 的字母方阵,内可能蕴含多个 \("yizhong"\) 单词.单词在方阵中是沿着同一方向连续摆放的.摆放可沿着 8 个方向的任一方向, ...

  4. NodeJS API Process全局对象

    Process 全局对象,可以在代码中的任何位置访问此对象,使用process对象可以截获进程的异常.退出等事件,也可以获取进程的当前目录.环境变量.内存占用等信息,还可以执行进程退出.工作目录切换等 ...

  5. Scala进阶之路-高级数据类型之集合的使用

    Scala进阶之路-高级数据类型之集合的使用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Scala 的集合有三大类:序列 Seq.集 Set.映射 Map,所有的集合都扩展自 ...

  6. js 正则学习小记之匹配字符串字面量

    今天看了第5章几个例子,有点收获,记录下来当作回顾也当作分享. 关于匹配字符串问题,有很多种类型,今天讨论 js 代码里的字符串匹配.(因为我想学完之后写个语法高亮练手,所以用js代码当作例子) va ...

  7. JQuery 对表格的详细操作

    <%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding=& ...

  8. tf.range()函数

    range()函数用于创建数字序列变量,有以下两种形式: range(limit, delta=1, dtype=None, name='range') range(start, limit, del ...

  9. C++ 修饰符类型

    C++ 修饰符类型 C++ 允许在 char.int 和 double 数据类型前放置修饰符.修饰符用于改变基本类型的含义,所以它更能满足各种情境的需求. 下面列出了数据类型修饰符: signed u ...

  10. 存储之磁盘阵列RAID

         存储之磁盘阵列RAID RAID是由美国加州大学伯克利分校的D.A. Patterson教授在1988年提出的.RAID名为独立冗余磁盘阵列(RedundantArray of Indepe ...