老曹眼中的Lambda

简介: Lambda表达式基于数学中的λ演算得名,可以看作是匿名函数,可以代替表达式,函数,闭包等,也支持类型推论,可以远离匿名内部类。Java、Python和大数据云计算中的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

与其它语言不同,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等各类大数据组件。


大数据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

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

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


AWS Lambda

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

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


ETL 的Lambda 实现

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

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



本文转载自微信公众号 中生代技术 freshmanTechnology
相关实践学习
基于MaxCompute的热门话题分析
Apsara Clouder大数据专项技能认证配套课程:基于MaxCompute的热门话题分析
目录
相关文章
|
6月前
|
人工智能 安全 API
什么是通用人工智能?一文了解2025年AGI技术突破、企业尝试与未来趋势
通用人工智能(AGI)是指具备人类同等认知广度的机器系统,能跨领域学习、推理和解决问题。随着GPT5等模型的突破,AI已能在影视创作、医疗诊断、编程等领域展现强大能力,推动AGI从科幻走向现实。本文深入解析AGI的技术进展、落地应用与伦理挑战,展现其如何重塑产业与社会。
2167 0
|
7月前
|
JavaScript 开发工具 iOS开发
如何使用DevEco Studio搭建鸿蒙开发环境?
如何使用DevEco Studio搭建鸿蒙开发环境?
|
关系型数据库 MySQL 数据安全/隐私保护
允许远程链接mysql,开放3306端口
允许远程链接mysql,开放3306端口
允许远程链接mysql,开放3306端口
|
5月前
|
存储 弹性计算 Cloud Native
云原生数据库的演进与应用实践
随着企业业务扩展,传统数据库难以应对高并发与弹性需求。云原生数据库应运而生,具备计算存储分离、弹性伸缩、高可用等核心特性,广泛应用于电商、金融、物联网等场景。阿里云PolarDB、Lindorm等产品已形成完善生态,助力企业高效处理数据。未来,AI驱动、Serverless与多云兼容将推动其进一步发展。
264 8
|
并行计算 PyTorch 算法框架/工具
OSError: [WinError 1455] 页面文件太小,无法完成操作如何解决。
如何解决Windows系统中出现的"OSError: [WinError 1455] 页面文件太小,无法完成操作"的错误。文章提供了具体的解决步骤。
769 0
OSError: [WinError 1455] 页面文件太小,无法完成操作如何解决。
|
存储 前端开发 数据可视化
超详细图解说明:一个代码仓库如何管理多个项目、且代码提交互不影响。orphan分支的使用
这篇文章详细图解了如何使用Git的`--orphan`参数创建孤立分支来管理代码仓库中的多个项目,确保不同项目的代码提交互不影响,并提供了解决实际使用中可能遇到的问题的方法。
超详细图解说明:一个代码仓库如何管理多个项目、且代码提交互不影响。orphan分支的使用
|
人工智能 搜索推荐 开发者
AI驱动的游戏设计:创造更智能、更沉浸的游戏体验
【7月更文第31天】人工智能(AI)技术正在深刻地改变游戏行业,不仅为游戏设计师提供了创造更丰富、更动态游戏世界的工具,也为玩家带来了更加个性化和沉浸式的体验。本文将探讨AI在游戏设计中的应用案例,并展示一些具体的实现方法。
2187 2
|
Ubuntu Linux 数据库
Linux:报错“command not found: yum”及yum和apt-get的区别
Linux:报错“command not found: yum”及yum和apt-get的区别
2236 0
Linux:报错“command not found: yum”及yum和apt-get的区别
|
Kubernetes API 微服务
「架构风格」SOA(面向服务)和微服务
**SOA与微服务对比摘要**: - **SOA**:企业级,服务粒度大,重用性强,常通过ESB通信,服务部署集中,技术栈统一。 - **微服务**:服务粒度小,单一职责,轻量级协议如REST,独立部署,技术多样性,去中心化治理。 - **区别**:服务大小、独立性、通信协议、部署方式和技术栈不同,微服务更强调敏捷和独立性。 - **示例**:Python Flask简单示例展示了服务创建,SOA服务间通过HTTP请求通信,微服务每个服务独立运行。 - **权衡**:涉及服务发现、负载均衡、容错和安全,常用技术如Docker、Kubernetes和API网关。
1312 0
|
存储 监控 算法
「AIGC算法」大数据架构Lambda和Kappa
**Lambda与Kappa架构对比:** Lambda提供批处理和实时处理,保证数据最终一致性,但维护复杂。Kappa简化为单一流处理,易于维护,适合实时场景,但可能增加实时处理压力,影响稳定性。选择时考虑数据一致性、系统维护、成本和实时性需求。
651 0
「AIGC算法」大数据架构Lambda和Kappa