不多说,直接上干货!

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. java 七牛上传图片到服务器(采用的html5 压缩 传输base64方式)

    //html 页面如下<div class="form-group"> <label class="col-sm-2 control-label&quo ...

  2. asp.net 中input radio checked 无效

    把Jq代码中的$(...).attr("checked",true) 换成$(...).prop("checked",true) ,

  3. 「POJ 1741」Tree

    题面: Tree Give a tree with n vertices,each edge has a length(positive integer less than 1001). Define ...

  4. 墨菲定律与 IndexOutOfBoundsException(数组越界异常)

    今天维护又反馈了一问题过来,查询试卷时报数组越界异常: 2017-02-28 10:45:24,827[ERROR] HttpException[10.32.111.7:60446:2D07867BE ...

  5. ajax标准格式

    jquery向服务器发送一个ajax请求后,可以返回多种类型的数据格式,包括:html,xml,json,text等. $.ajax({    url:"http://www.test.co ...

  6. 【转】WinForm时间选择控件(DateTimePicker)如何选择(显示)时分秒

    源地址:https://www.cnblogs.com/EvanFan/p/7826160.html 注意:年月日时分秒的大小写格式,如果错了数据就错了,如果能显示当前时间说明设置正确

  7. loj #6201. 「YNOI2016」掉进兔子洞

    #6201. 「YNOI2016」掉进兔子洞 您正在打galgame,然后突然发现您今天太颓了,于是想写个数据结构题练练手: 给出一个长为 nnn 的序列 aaa. 有 mmm 个询问,每次询问三个区 ...

  8. 洛谷P2775 机器人路径规划问题

    传送门 题解 至今没看懂这深搜怎么写的…… //minamoto #include<iostream> #include<cstdio> #include<cstring ...

  9. Pycharm关闭后Python.exe还是在后台运行

    pycharm运行程序关闭后会弹出一个对话框: 一定要选择第一个,不然python.exe一直会在后台运行.

  10. 老男孩Day9作业:高级FTP

    一.作业需求 1. 用户加密认证(已完成) 2. 多用户同时登陆(已完成) 3. 每个用户有自己的家目录且只能访问自己的家目录(已完成) 4. 对用户进行磁盘配额.不同用户配额可不同(已完成) 5.  ...