不多说,直接上干货!

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. PLSA的EM推导

    本文作为em算法在图模型中的一个应用,推导plsa的em算法. 1 em算法 em算法是解决一类带有隐变量模型的参数估计问题. 1.1 模型的定义 输入样本为,对应的隐变量为.待估计的模型参数为,目标 ...

  2. CentOS 进程操作

    ps -ef:查看所有进程, ps -ef |grap firewalld 查看与firewalld相关的进程 which :查看进程:which firewalld kill 进程id:杀掉进程 k ...

  3. 「BZOJ1000」A+B Problem

    写这个主要是为了凑\(BZOJ\)题解用的,不用在意.跳过即可 \(Code\) #include<bits/stdc++.h> using namespace std; int main ...

  4. C# 接口(3)

    这么半天说了如何使用,实现接口.相信也都发现了接口和抽象类很多相似的地方. 但是! 这两个根本就是不一样的. 抽象类 :                                         ...

  5. [Swift]八大排序算法(七):归并排序

    排序分为内部排序和外部排序. 内部排序:是指待排序列完全存放在内存中所进行的排序过程,适合不太大的元素序列. 外部排序:指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存 ...

  6. VS2017+DLib_19.17详细配置教程

      最近学校布置了一个关于图像融合的作业,于是想利用Learn OpenCV 网站上的Face Morph 教程来设计一个人脸融合的Gif图,但是程序中需要用到DLib库,光是配置这个库就花费了我半天 ...

  7. TFS解锁命令

    tf undo  /server:http://193.100.100.29:8080/tfs/EGSS  /workspace:HY-PC;hy   $/CTCS/TSAGS_TEAM/TestHY ...

  8. NetworkX初相识

    听说NetworkX是一个很牛的复杂网络研究的工具,就来试一下吧. import networkx as nx G= nx.Graph()#建立一个空白的图 G.add_node("node ...

  9. The server of Apache (二)——apache服务客户端验证

    一.确定网站名称.IP地址 地址为: 192.168.1.1   域名为: www.benet.com 二.配置可用的DNS域名服务或者修改本地hosts记录 ~] # vim /etc/hosts ...

  10. docker下ubutun没有ifconfig命令问题

    解决: apt-get update #更新apt-get apt install net-tools       # ifconfig apt install iputils-ping     # ...