老曹眼中的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。

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

原文发布于微信公众号 - 喔家ArchiSelf(wireless_com)

原文发表时间:2016-09-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏函数式编程语言及工具

细谈Slick(5)- 学习体会和将来实际应用的一些想法

   通过一段时间的学习和了解以及前面几篇关于Slick的讨论后对Slick这个函数式数据库编程工具有了些具体的了解。回顾我学习Slick的目的,产生了许多想法...

2038
来自专栏IT笔记

JAVA工作三年面试(一)

博主毕业快满三年了,由于种种原因想换一份工作。学了 7 年计算机技术,在目前的行业用到的技术不多,还是想去寻找一份互联网行业的工作,这样更能学以致用发挥自己的特...

1.5K8
来自专栏北京马哥教育

shell十三问,为linux学习打基础(三)

本文整理并转自CU上的帖子[学习共享] shell 十三問?,此贴是2003年发表的,但却是相当不错的linux基础知识汇集贴,原帖主使用的台湾风格,本文加以简...

3806
来自专栏Java学习网

程序员应该避免的5种代码注释

程序员应该避免的5种代码注释 你有没有这样的经历:别人审查过你的代码之后给出的注释,你认为是没有必要的?注释代码是为了提高代码的可读性,目的是为了能让其他人更容...

2458
来自专栏python3

python3--python的出生与应用

python的创始人为吉多·范罗苏姆(Guido van Rossum)。1989年的圣诞节期间,吉多·范罗苏姆(中文名字:龟叔)为了在阿姆斯特丹打发时间,决心...

1442
来自专栏阮一峰的网络日志

Javascript的10个设计缺陷

前几篇文章,我经常说Javascript的设计不够严谨,有很多失误。 今天的这一篇,前半部分就谈为什么会这样,后半部分将列举Javascript的10个设计缺陷...

3607
来自专栏撸码那些事

最佳编码实践——单一职责原则

同时应用这些最佳实践,可以提升代码适应变更的能力。但是凡事要有度,过度使用虽然可以让代码有很高的自适应能力,但是会导致层次粒度过小而难以理解或使用,还会影响代码...

1296
来自专栏iOS技术

何为代码质量?——用脑子写代码引言正文总结

为什么项目维护困难、BUG 反复?实际上很多时候就是代码质量的问题。代码架构就像是建筑的钢筋结构,代码细节就像是建筑的内部装修,建筑的抗震等级、简装或豪装完全取...

672
来自专栏程序员互动联盟

【答疑解惑第二十三讲】C语言main函数那点事

疑惑一 C语言函数的参数问题 在C语言中main函数大家见到的基本有两种:一种是带参数的如int main(char * argc,char *argv[])...

2763
来自专栏令仔很忙

Spring从入门到精通(一)----IoC(控制反转)

在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过相互合作,最终实现系统的业务逻辑。

1012

扫码关注云+社区

领取腾讯云代金券