不多说,直接上干货!

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

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

Apache Beam中的函数式编程理念的更多相关文章

  1. Apache beam中的便携式有状态大数据处理

    Apache beam中的便携式有状态大数据处理 目标: 什么是 apache beam? 状态 计时器 例子&小demo 一.什么是 apache beam? 上面两个图片一个是正面切图,一 ...

  2. (数据科学学习手札101)funcy:Python中的函数式编程百宝箱

    本文示例文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 我们在使用Python完成日常任务时,经常会遇到 ...

  3. 可爱的 Python : Python中的函数式编程,第三部分

    英文原文:Charming Python: Functional programming in Python, Part 3,翻译:开源中国 摘要:  作者David Mertz在其文章<可爱的 ...

  4. Java 中的函数式编程(Functional Programming):Lambda 初识

    Java 8 发布带来的一个主要特性就是对函数式编程的支持. 而 Lambda 表达式就是一个新的并且很重要的一个概念. 它提供了一个简单并且很简洁的编码方式. 首先从几个简单的 Lambda 表达式 ...

  5. C#中的函数式编程:序言(一)

    学了那么久的函数式编程语言,一直想写一些相关的文章.经过一段时间的考虑,我决定开这个坑. 至于为什么选择C#,在我看来,编程语言分三类:一类是难以进行函数式编程的语言,这类语言包括Java6.C语言等 ...

  6. (数据科学学习手札48)Scala中的函数式编程

    一.简介 Scala作为一门函数式编程与面向对象完美结合的语言,函数式编程部分也有其独到之处,本文就将针对Scala中关于函数式编程的一些常用基本内容进行介绍: 二.在Scala中定义函数 2.1 定 ...

  7. C#中的函数式编程:递归与纯函数(二) 学习ASP.NET Core Razor 编程系列四——Asp.Net Core Razor列表模板页面

    C#中的函数式编程:递归与纯函数(二)   在序言中,我们提到函数式编程的两大特征:无副作用.函数是第一公民.现在,我们先来深入第一个特征:无副作用. 无副作用是通过引用透明(Referential ...

  8. C#中面向对象编程中的函数式编程详解

    介绍 使用函数式编程来丰富面向对象编程的想法是陈旧的.将函数编程功能添加到面向对象的语言中会带来面向对象编程设计的好处. 一些旧的和不太老的语言,具有函数式编程和面向对象的编程: 例如,Smallta ...

  9. Java经典类库-Guava中的函数式编程讲解

    如果我要新建一个java的项目,那么有两个类库是必备的,一个是junit,另一个是Guava.选择junit,因为我喜欢TDD,喜欢自动化测试.而是用Guava,是因为我喜欢简洁的API.Guava提 ...

随机推荐

  1. C++ 虚基类 派生与继承

    在学习设计模式时我就有一个疑问,关联和继承除了用法上的区别,好像在内存上并没有什么区别,继承也是父类作为了子类的元素(内存上),关联也是这样.而且关联好像更占内存一些.这就是设计模式里问题了“依赖倒转 ...

  2. [bash] 显示配色

    #/bin/bash for STYLE in 0 1 2 3 4 5 6 7; do for FG in 30 31 32 33 34 35 36 37; do for BG in 40 41 42 ...

  3. angular 引入第三方库

    第一步 --save:自动写入package.json 第二步: 第三部: 为了让typescript识别$ 第四步:

  4. Flask写web时cookie的处理

    本文来自网易云社区 作者:孙圣翔 flask是一个微型web开发框架,别看他微型,在github上排名还是挺高的. A microframework based on Werkzeug, Jinja2 ...

  5. 「BZOJ 1876」「SDOI 2009」SuperGCD「数论」

    题意 求\(\gcd(a, b)\),其中\(a,b\leq10^{10000}\) 题解 使用\(\text{Stein}\)算法,其原理是不断筛除因子\(2\)然后使用更相减损法 如果不筛\(2\ ...

  6. 转载 Adobe DreamweaverCS6安装及破解

    一:安装 百度链接:链接:http://pan.baidu.com/s/1dF8hTex 密码:zrew   (重点) 1) Adobe DreamweaverCS6中文版下载 2)Adobe Dre ...

  7. Sql Server两个数据库中有一张表的结构一样,怎么快速将一张表中的数据复制到另一个表中

    1,下面这句会把表2数据删除,然后把表1复制到表一,两表内容一样 SELECT * into 表2 FROM 表1 2,这句只追加,不删除表2的数据 insert into 表1 select * f ...

  8. c语言数据结构学习心得——树

    树 一对多的树型结构,有且只有一个特定的根结点. 结点的度:结点拥有子树的数量{ 度为0:叶子结点/终端结点. 度不为0:非终端结点/分支结点(除去根结点其它称为内部结点).} 树的度:树中所有结点的 ...

  9. Application received signal SIGABRT

    Application received signal SIGABRT (null) (( 0 CoreFoundation 0x0000000182bbadc8 <redacted> + ...

  10. 使用带参数的SQL语句向数据库中插入空值

    private void button1_Click(object sender, EventArgs e) { string name = textBox1.Text; int age = Conv ...