老曹眼中的Lambda世界

“ λ ”像一个双手插兜儿,独自行走的人,有“失意、无奈、孤独”的感觉。λ 读作Lambda,是物理上的波长符号,放射学的衰变常数,线性代数中的特征值……在程序和代码的世界里,它代表了函数表达式,系统架构,以及云计算架构。

代码中的Lambda

Lambda表达式基于数学中的λ演算得名,可以看作是匿名函数,可以代替表达式,函数,闭包等,也支持类型推论,可以远离匿名内部类。

为什么使用Lambda呢? 
1)代码更紧凑 
2)拥有函数式编程中修改方法的能力 
3)有利于多核计算

Lambda的目的是让程序员能够对程序行为进行抽象,把代码行为看作数据。

Java

Java 8的一个大亮点是引入Lambda表达式,在编写Lambda表达式时,也会随之被编译成一个函数式接口。

一个典型的例子是文件类型过滤 :

File dir = new File("/an/dir/");   FileFilter directoryFilter = new FileFilter() {      public boolean accept(File file) {         return file.isDirectory();      } };

用lambda 重写后:

File dir = new File("/an/dir/");  File[] dirs = dir.listFiles((File f) -> f.isDirectory());

Lambda 表达式本身没有类型,因为常规类型系统没有“Lambda 表达式”这一内部概念。

Python

与Java语言不同,Python的Lambda表达式的函数体只能有唯一的一条语句,也就是返回值表达式语句。Python编程语言使用lambda来创建匿名函数。

一个典型的例子是求一个列表中所有元素的平方。

一般写法

def sq(x):    return x * x map(sq, [y for y in range(108)])

使用Lambda 的写法

map( lambda x: x*x, [y for y in range(108)] )

在spark 中,用python 操作RDD时,Lambda 更是随处可见。

out_rdd = in_rdd.filter( # filter the empty record          lambda x:x[1] is not None and x[1] != {}               ).map(          lambda x:utils.parse_data(x[1],es_relations)               ).filter( # filter the empty record            lambda x:x is not None               ).filter( # filter the record            lambda x:x[u'timestamp']>time_start)

大数据架构中的Lambda

Lambda架构的目标是设计出一个能满足实时大数据系统关键特性的架构,包括有:高容错、低延时和可扩展等。Lambda架构整合离线计算和实时计算,融合不可变性(Immunability),读写分离和复杂性隔离等一系列架构原则,可集成Hadoop,Kafka,Storm,Spark,Hbase等各类大数据组件。

Batch Layer进行预运算的作用实际上就是将大数据变小,从而有效地利用资源,改善实时查询的性能。主要功能是:

  • 存储Master Dataset,这是一个不变的持续增长的数据集

  • 针对这个Master Dataset进行预运算

Serving Layer就要负责对batch view进行操作,从而为最终的实时查询提供支撑。主要作用是:

  • 对batch view的随机访问

  • 更新batch view

speed layer与batch layer非常相似,它们之间最大的区别是前者只处理最近的数据,后者则要处理所有的数据。另一个区别是为了满足最小的延迟,speed layer并不会在同一时间读取所有的新数据,在接收到新数据时,更新realtime view,而不会像batch layer那样重新运算整个view。speed layer是一种增量的计算,而非重新运算(recomputation)。Speed Layer的作用包括:

  • 对更新到serving layer带来的高延迟的一种补充

  • 快速、增量的算法

  • 最终Batch Layer会覆盖speed layer

大数据系统一般具有如下属性: 
* 健壮性和容错性(Robustness和Fault Tolerance) 
* 低延迟的读与更新(Low Latency reads and updates) 
* 可伸缩性(Scalability) 
* 通用性(Generalization) 
* 可扩展性(Extensibility) 
* 内置查询(Ad hoc queries) 
* 维护最小(Minimal maintenance) 
* 可调试性(Debuggability)

个人觉得,有了spark streaming 之后,spark 本身就是一种Lambda架构。

云计算中的Lambda

云计算中的Lambda,是指serverless architecture,无需配置或管理服务器即可运行代码。借助 Lambda,几乎可以为任何类型的应用程序或后端服务运行代码,而且全部无需管理。

以AWS 为例,云计算中的Lambda 示意流程如下:

只需上传代码,Lambda 会处理运行和扩展高可用性代码所需的一切工作。还可以将代码设置为自动从其他服务触发,或者直接从任何 Web 或移动应用程序调用。

ETL 是数据挖掘与数据分析中的必备环节,可以方便的通过AWS的Lambda实现,示例如下:

其实,在spark 上实现Lambda 云服务也不是太费力的事。

总之,了解越多,越会喜欢上它,神奇而有趣的Lambda。

-------------------

(0)

相关推荐

  • 说说Python中的lambda表达式?

    公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开始, ...

  • Java先驱者发布最新Java全栈面试“秘籍”,助力你吃透Java新特性!

    Java开发圈流传着这样一句话"新款任你发,我用Java8",Java第八代作为Java历史长河中的一次重大的历史性.革命性的更新,增加了许多新的东西,同时Java8也是现在大家最 ...

  • 老曹眼中的CRM 图解

    CRM 是企业"以客户为中心"价值观的核心体现之一, 各种2B的应用都无可避免,而企业应用具有一定的复杂性,理解CRM系统也不是轻而易举的事情.在老码农的眼中,CRM 系统可能是这 ...

  • 老曹眼中的网络编程基础

    我们是幸运的,因为我们拥有网络.网络是一个神奇的东西,它改变了你和我的生活方式,改变了整个世界. 然而,网络的无标度和小世界特性使得它又是复杂的,无所不在,无所不能,以致于我们无法区分甚至无法描述. ...

  • 老曹眼中研发管理二三事

    关于管理,必然会谈到业界先贤德鲁克先生对管理的定义. 管理就是界定企业的使命,并激励和组织人力资源去实现这个使命.界定使命是企业家的任务,而激励与组织人力资源是领导力的范畴,二者的结合就是管理. 这是 ...

  • 老曹眼中的敏捷开发

    世界上不存在这样一种方法: 只要套用,就可以写出完美的软件,无论使用的哪种设计模式: 但确实可能存在一种开发方式,可以帮助我们一步步构造出需要的软件和架构--这有可能就是敏捷开发. 相对于软件开发流程 ...

  • 老曹眼中的面向数据架构

    数据是系统的核心,在面向服务的架构之外,也可以考虑一下面向数据的架构方式.面向数据的服务架构需要支持多数据源异构,支持动态数据和静态数据,既支持公有云部署又支持私有云部署,提供多种数据应用和数据产品, ...

  • 老曹眼中的开发学习环境

    "工其事必先利其器",对于一个全栈而言,一个与自己匹配的开发和学习环境,能够极大地提高个人的工作效率,很多时候都可以做到事半而功倍.环境也是一个外延很广的概念,这里我所涉及的包括硬 ...

  • 老曹眼中的Git

    为什么使用Git Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件.大神就是大神,在开发了Linux之后,Git 是又一抗鼎之作.这是唯一 ...

  • 老曹眼中的负载均衡

    什么是负载均衡 负载(load)一词起源于典型系统,指连接在电路中消耗电能的装置,负载(用电器)的功能是把电能转变为其他形式能.引申出来,一个是实体,一个转化. 于是,对于实体,有了通信帧或者报文中数 ...

  • 老曹眼中的缓存技术

    Cache: a collection of data duplicating original values stored elsewhere on a computer, usually for ...