不多说,直接上干货!

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. 如何在DOS下以管理员身份执行命令?

    原创 普通User的DOS窗口: 以管理员身份运行的DOS窗口: 转换(Windows10系统下): 13:11:55 2018-10-18

  2. OkHttp3的简单使用(一)

    一.导入 1)gradle方式: compile 'com.squareup.okhttp3:okhttp:3.8.0'(okhttp 最新版) compile 'com.squareup.okio: ...

  3. sql server 简单语句整合

    1.去重distinct , group by select distinct userid,username from 表名 select userid,username from 表名 group ...

  4. [.net 多线程]Semaphore信号量

    信号量(Semaphore)是一种CLR中的内核同步对象.与标准的排他锁对象(Monitor,Mutex,SpinLock)不同的是,它不是一个排他的锁对象,它与SemaphoreSlim,Reade ...

  5. Codeforces Round #546 (Div. 2)D(贪心,思维,SET,VECTOR,模拟)

    #include<bits/stdc++.h>using namespace std;int a[300007],b[500007],c[500007];set<int>st[ ...

  6. luoguP3690 列队

    https://www.luogu.org/problemnew/show/P3960 作为一个初二蒟蒻要考提高组,先做一下17年的题目 我们发现进行一次操作相当于 把第 x 行的第 y 个弹出记为 ...

  7. Linux原理与实践

    Linux 中的文件及权限 -rwxr-xr-x 1 cat animal 68 03-31 21:47 sleep.sh 三种用户角色: r 4 w 2 x 1 user ,文件的所有者 group ...

  8. centos7 docker 安装 mysql5.7.24 导入12G的sql

    先在CentOS7里面安装docker Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker .通过 uname - ...

  9. linux下用rpm 安装jdk

    转载自http://blog.csdn.net/ldl22847/article/details/7605650 1.下载jdk的rpm安装包,这里以jdk-7u4-linux-i586.rpm为例进 ...

  10. 1. Shell编程第一讲

    (1)shell 历史: Shell的作用是解释执行用户的命令,用户输入一条命令,Shell就解释执行一条,这种方式称为交互式(Interactive). Shell还有一种执行命令的方式称为批处理( ...