“ λ ”像一个双手插兜儿,独自行走的人,有“失意、无奈、孤独”的感觉。λ 读作lambda,是物理上的波长符号,放射学的衰变常数,线性代数中的特征值......在程序和代码的世界里,它代表了函数表达式,系统架构,以及云计算架构。
lambda表达式基于数学中的λ演算得名,可以看作是匿名函数,可以代替表达式,函数,闭包等,也支持类型推论,可以远离匿名内部类。
为什么使用lambda呢?
代码更紧凑
拥有函数式编程中修改方法的能力
有利于多核计算
lambda的目的是让程序员能够对程序行为进行抽象,把代码行为看作数据。
java 8的一个大亮点是引入lambda表达式,在编写lambda表达式时,也会随之被编译成一个函数式接口。
一个典型的例子是文件类型过滤 :
<code>file dir = new file("/an/dir/"); filefilter directoryfilter = new filefilter() { public boolean accept(file file) { return file.isdirectory(); } };</code>
用lambda 重写后:
<code>file dir = new file("/an/dir/"); file[] dirs = dir.listfiles((file f) -> f.isdirectory());</code>
lambda 表达式本身没有类型,因为常规类型系统没有“lambda 表达式”这一内部概念。
与其它语言不同,python的lambda表达式的函数体只能有唯一的一条语句,也就是返回值表达式语句。python编程语言使用lambda来创建匿名函数。
一个典型的例子是求一个列表中所有元素的平方。
一般写法:
<code>def sq(x): return x * x map(sq, [y for y in range(108)])</code>
使用lambda 的写法:
<code>map( lambda x: x*x, [y for y in range(108)] )</code>
在spark 中,用python 操作rdd时,lambda 更是随处可见。
<code>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)</code>
lambda架构的目标是设计出一个能满足实时大数据系统关键特性的架构,包括有:高容错、低延时和可扩展等。lambda架构整合离线计算和实时计算,融合不可变性(immunability),读写分离和复杂性隔离等一系列架构原则,可集成hadoop,kafka,storm,spark,hbase等各类大数据组件。
大数据lambda 架构
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,是指serverless architecture,无需配置或管理服务器即可运行代码。借助 lambda,几乎可以为任何类型的应用程序或后端服务运行代码,而且全部无需管理。
以aws 为例,云计算中的lambda 示意流程如下:
aws lambda
只需上传代码,lambda 会处理运行和扩展高可用性代码所需的一切工作。还可以将代码设置为自动从其他服务触发,或者直接从任何 web 或移动应用程序调用。
etl 是数据挖掘与数据分析中的必备环节,可以方便的通过aws的lambda实现,示例如下:
etl 的lambda 实现
其实,在spark 上实现lambda 云服务也不是太费力的事。
总之,了解越多,越会喜欢上它,神奇而有趣的lambda。
本文转载自微信公众号 中生代技术 freshmantechnology