Apache Beam中的函数式编程理念

简介:

Apache Beam中的函数式编程理念
Apache Beam的编程范式借鉴了函数式编程的概念,从工程和实现角度向命令式妥协。
 编程的领域里有三大流派:函数式、命令式、逻辑式。
此处的函数不是编程语言中的函数,而是数学中的函数。现代计算的理论模型是图灵机,冯诺依曼体系是图灵机的实现,所以命令式变成本质上是冯诺依曼体系下的操作指令序列。函数式来自于lambda演算,lambda演算与图灵机是等价的,本质上函数也可以完全表达计算。
C、C++、Java等都属于命令式编程,是从计算机的视角编写代码,告诉计算机操作步骤,计算机执行操作步骤。
Scala、Haskell等属于函数式编程,是从解决问题的视角出发编写代码,解决问题需要哪些步骤,然后由编译器翻译为计算机可执行的操作步骤。

 


  函数式的最主要的好处主要是不可变性带来的。好处如下:
函数即不依赖外部的状态也不修改外部的状态,无论在什么状态下调用函数,只要输入参数是相同的,输出的结果必然是相同的,这样写的代码容易进行推理,不容易出错。这使得单元测试和调试都更容易。
由于不共享状态,不会造成资源争用,也就不需要用锁来保护可变状态,也就不会出现死锁,这样可以更好地并发起来,在多处理器、分布式的情况下可以提供更好的并行计算。
锁是并行计算的天敌,对于分布式计算来说,尤其要注意在不同的机器之间共享资源,因为访问另一个机器的资源需要跨越网络,耗时非常高,会导致整个数据处理的过程不得不处于等待状态。不共享状态意味着不会在机器之间共享资源,可以很好的优化执行策略。所以函数式的思想天然适合于分布式计算。 
也许有人会说,函数式的不可变性会带来内存不断重复申请释放的开销,对于Java这样依赖垃圾回收的系统,会带来GC的问题。这个问题需要分开两个角度来看:
  技术角度
不可变性确实带来了一些Jvm堆的开销,但是在Flink、Spark这样的系统中,现在已经开始自主管理内存,使用Java的Unsafe的堆外内存,可以避免GC带来的JVM停顿的问题。
  工程角度
工程是时间、性能、能力要求之间的妥协。时间是工程进度,性能是软件的执行性能,能力是对开发人员的要求。时间总是越短越好,成本越低,但是要保证软件的质量,很多情况下时间和质量是相互冲突的。性能总是越高越好,越高的性能意味着更大的吞吐能力,需要更巧妙的设计,更好的编码能力,对开发人员更高的要求。 
技术是为业务服务的,随着互联网的逐渐深化,想传统产业渗透,世界处于剧烈的变革之中,业务创新日渐加快,所以时间变得越来越重要,快速实现往往是第一目标,如果有什么方式能够更快的实现业务支持,且能够让软件更可靠,稍微牺牲一点性能是值得的。


本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/7609500.html,如需转载请自行联系原作者

相关文章
|
数据处理 分布式数据库 Apache
《使用Apache Beam和HBase进行高效数据处理》电子版地址
使用Apache Beam和HBase进行高效数据处理
83 0
《使用Apache Beam和HBase进行高效数据处理》电子版地址
|
存储 SQL 分布式计算
开放可编程API(兼容Apache Beam)
开放可编程API(兼容Apache Beam)
97 0
|
分布式计算 大数据 测试技术
|
分布式计算 大数据 数据处理
|
分布式计算 大数据 测试技术
|
大数据 数据处理 Apache
|
Apache 开发工具 数据处理
|
分布式计算 Hadoop API
Apache Beam研究报告
## 概述 本文不是一篇Beam的入门文档,不会介绍Beam的基本概念;而会主要探讨Beam的表达力,Beam的性能,以及Beam目前在业内的使用情况。面向的读者是那些想使用Beam作为自己公司操作大数据的统一API,但是还有所顾虑的人们。 ## 表达力 ### 离线 Beam里面有两个核心原语: * ParDo: 来处理通用的基于单条数据的计算: 每条需要处理的数据
6122 0
|
存储 API 数据处理

热门文章

最新文章

推荐镜像

更多