1、单击此处编辑母版标题样式,#,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,2010NJUPT,Title:,Type,:Arial Bold,Size:28pt,Color:blue,Subtitle:,Type:,Arial,Size:,24pt,Color:Blue,Text,(2-5,Level,),Type:Arial,Size:24,pt,Color:blue,R:23 G:55 B:94,R:55 G:96 B:146,R:85 G:142 B:213,R:255 G:51 B:0,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,#
2、,之,Spark,胡楠,计算机学院,云计算技术和大数据,1,纲要,Spark,综述,1,核心技术,2,Spark,架构,3,BDAS,简介,4,函数式编程简介,7,Spark,应用实例,6,Spark,安装部署,5,2,一、,Spark,综述,Spark,是什么,1,Spark,是基于内存计算的大数据并行计算框架。,Spark,基于内存计算,提高了在大数据环境下数据处理的实时性,同时保证了高容错性和高可伸缩性,允许用户将,Spark,部署在大量廉价硬件之上,形成集群。,Spark,于,2009,年诞生于加州大学伯克利分校,AMPLab,。并且于,2010,年开源。,2013,年,6,月,Spa
3、rk,进入,Apache,孵化器。目前,已经成为,Apache,软件基金会旗下的顶级开源项目。,people.csail.mit.edu/matei/,Matai zaharia,3,一、,Spark,综述,Spark,与,Hadoop,2,Spark,相比,HadoopMapRedue,的优势如下:,1,、,中间结果输出,基于,MapReduce,的计算模型会将中间结果序列化到磁盘上。而,Spark,将执行模型抽象为通用的有向无环图执行计划。且可以将中间结果缓存内存中。,2,、,数据格式和内存布局,Spark,抽象出分布式内存存储结构,RDD,,进行数据存储。,Spark,能够控制数据在不同
4、节点上的分区,用户可以自定义分区策略。,4,一、,Spark,综述,Spark,与Hadoop,3,3,、执行策略,MapReduce,在数据,shuffle,之前总是花费大量时间来排序。,Spark,支持基于,Hash,的分布式聚合,在需要的时候再进行实际排序。,4,、任务调度的开销,MapReduce,上的不同作业在同一个节点运行时,会各自启动一个,JVM,。而,Spark,同一节点的所有任务都可以在一个,JVM,上运行。,5,一、,Spark,综述,Spark,发展现状,3,Spark,生态随着,BDAS,的完善,已经成型。,Spark,全面兼容,Hadoop,的数据持久层。从而让把计算
5、任务从原来的,MapReduce,计算任务迁移到,Spark,中更加简单。,目前,Spark,的工业应用在国内已经大范围落地。包括,BAT,在内的一众互联网公司都建立了自己的,Spark,集群,6,纲要,Spark,综述,1,核心技术,2,Spark,架构,3,BDAS,简介,4,函数式编程简介,7,Spark,应用实例,6,Spark,安装部署,5,7,二、,Spark,关键技术,RDD,的全称是弹性分布式数据集(,resilient distributed dataset,)是,Spark,的核心数据模型,,RDD,是,Spark,中待处理的数据的抽象,它是逻辑中的实体。,对于使用者来说,
6、你得到的数据操作接口就是,RDD,,在对,RDD,进行处理的时候不需要考虑底层的分布式集群,就像在单机上一样即可,这也正是,Spark,的优势之一。,什么是,RDD,1,8,二、,Spark,关键技术,从,Hadoop,文件系统输入(比如,HDFS,)创建。,从父,RDD,转换得到新的,RDD,。,将数组或者集合这样的数据结构并行化,转化成,RDD,。,通过,cache(),函数将计算后的,RDD,缓存到内存中。,RDD,创建方式,2,9,二、,Spark,关键技术,从逻辑上来看,,RDD,就是数据。而实际上,从物理上来看,,RDD,是一种分布式内存的抽象。,Spark,中的数据实际上是像,H
7、DFS,那样分块存储,RDD,存储结构,3,10,二、,Spark,关键技术,分区列表,计算每个分片的函数,对父,RDD,的依赖,对“键值对”数据类型,RDD,的分区器,控制分区策略和分区数。,每个数据分区的地址列表。,所以,RDD,实际上只是一个元数据对象,用于将对数据集的操作映射到物理存储之上。,RDD,的重要内部属性如下:,11,二、,Spark,关键技术,RDD,中的依赖关系,RDD,之间的依赖关系可以分为两类:,窄依赖:每个父,RDD,的分区都至多被一个子,RDD,的分区使用;,窄依赖允许在单个集群节点上流水线式执行,这个节点可以计算所有父级分区。,在窄依赖中,节点失败后的恢复更加高
8、效。因为只有丢失的父级分区需要重新计算,并且这些丢失的父级分区可以并行地在不同节点上重新计算。,宽依赖:多个子,RDD,的分区依赖一个父,RDD,的分区。,宽依赖需要所有的父,RDD,数据可用并且数据已经通过类,MapReduce,的操作,shuffle,完成。,在宽依赖的继承关系中,单个失败的节点可能导致一个,RDD,的所有先祖,RDD,中的一些分区丢失,导致计算的重新执行。,12,二、,Spark,关键技术,宽依赖和窄依赖的样例。每一个方框表示一个,RDD,,其内的阴影矩形表示,RDD,的分区。,13,二、,Spark,关键技术,Transformation,Transformation,
9、操作是延迟计算的,也就是说从一个,RDD,转换生成另一个,RDD,的转换操作不是立即执行的,而是需要等到,Action,操作是才真正出发运算。,Action,Action,算子会触发,Spark,提交作业,并将数据输出到,Spark,系统。,RDD,操作算子,,RDD,中的操作算子可以分为两类:,Transformation,(变换)算子,与,Action,(行动)算子。,RDD,算子,4,14,二、,Spark,关键技术,RDD,算子操作举例如下:,Val line=sc.textFile(Test.txt),line.map(n=Integer.parseInt(n)*Integer.pa
10、rseInt(n).reduce(_+_),15,二、,Spark,关键技术,运行逻辑,5,16,spark,的容错机制,6,二、,Spark,关键技术,基于血统的容错机制(,lineage,):,在,spark,中,RDD,具有不变性,在数据处理过程中,,spark,通过,lineage,图记录了各个,RDD,之间的变换关系,一旦某个数据处理过程出现错误,,spark,可以根据,lineage,图快速进行容错恢复。,特别是对于,map,操作来说,当某个节点的任务失败,,spark,只需要重新计算相应分区的数据,而不必将整个任务重新计算。,在很多分布式数据处理系统中通过备份来进行容错,相比于这
11、种会导致巨大存储消耗的容错方式,,spark,的,lineage,图只需要十几,kb,的存储空间。,Spark,允许用户将数据,cache,下来,对于将来可能频繁使用的某个计算结果,将这个,RDDcache,下来是明智的选择。,17,二、,Spark,关键技术,检查点支持:,虽然,lineage,可用于错误后,RDD,的恢复,但对于很长的,lineage,的,RDD,来说,这样的恢复耗时较长。由此,可以考虑将某些,RDD,进行检查点操作,(Checkpoint),保存到稳定存储上。,Spark,当前提供了为,RDD,设置检查点操作的,API,让用户自行决定需要为哪些数据设置检查点操作。,由于,
12、RDD,的只读特性使得比常用的共享内存更容易做,checkpoint.,由于不需要关心一致性的问题,,RDD,的写出可在后台进行,而不需要程序暂停或进行分布式快照,18,纲要,Spark,综述,1,核心技术,2,Spark,架构,3,BDAS,简介,4,Scala,简介,7,Spark,应用实例,6,Spark,安装部署,5,19,三、,Spark,体系架构,架构组成,1,Master,Worker,20,三、,Spark,体系架构,架构图,2,21,三、,Spark,体系架构,角色任务,3,Master,进程和,Worker,进程,对整个集群进行控制。,Driver,程序是应用逻辑执行的起点
13、,负责作业的调度,即,Task,任务的分发,Worker,用来管理计算节点和创建,Executor,并行处理任务。,Executor,对相应数据分区的任务进行处理。,22,三、,Spark,体系架构,执行流程,4,Client,提交应用,,Master,找到一个,Worker,启动,Driver,Driver,向,Master,或者资源管理器申请资源,之后将应用转化为,RDD Graph,DAGScheduler,将,RDD Graph,转化为,Stage,的有向无环图提交给,TaskScheduler,TaskScheduler,提交任务给,Executor,执行。,23,纲要,Spark,
14、综述,1,核心技术,2,Spark,架构,3,BDAS,简介,4,Scala,简介,7,Spark,应用实例,6,Spark,安装部署,5,24,四、,BDAS,简介,目前,,Spark,已经发展成为包含众多子项目的大数据计算平台。伯克利将,Spark,的整个生态系统称为伯克利数据分析栈(,BDAS,),目前包含四个已经比较成熟的组件。,25,四、,BDAS,简介,谈到,Spark SQL,:首先需要从,Shark,说起。,Spark SQL,1,.1,26,四、,BDAS,简介,Shark,起源,1,.,2,为了,给熟悉,RDBMS,但又不理解,MapReduce,的技术人员提供快速上手的工
15、具,,Hive,应运而生,它是当时唯一运行在,Hadoop,上的,SQL-on-Hadoop,工具。但是,MapReduce,计算过程中大量的中间磁盘落地过程消耗了大量的,I/O,,降低的运行效率,为了提高,SQL-on-Hadoop,的效率,大量的,SQL-on-Hadoop,工具开始产生。,其中就包括,Shark,27,四、,BDAS,简介,Shark,与,hive,1,.,3,Shark,基于,Hive,修改了内存管理、物理计划、执行三个模块,并使之能运行在,Spark,引擎上,从而使得,SQL,查询的速度得到,10-100,倍的提升,28,四、,BDAS,简介,Spark SQL,1,
16、.,4,Shark,缺陷:,Shark,对于,Hive,的太多依赖,制约了,Spark,的,One Stack Rule Them All,的既定方针,制约了,Spark,各个组件的相互集成,SparkSQL,抛弃原有,Shark,的代码,汲取了,Shark,的一些优点,如内存列存储(,In-Memory Columnar Storage,)、,Hive,兼容性等,重新开发了,SparkSQL,代码;,由于摆脱了对,Hive,的依赖性,,SparkSQL,无论在数据兼容、性能优化、组件扩展方面都得到了极大的方便,29,四、,BDAS,简介,Spark SQL,特点,1,.,5,*数据兼容方面
17、不但兼容,Hive,,还可以从,RDD,、,JSON,文件中获取数据,*性能优化方面 采取,In-Memory Columnar Storage,、,byte-code generation,等优化技术,*组件扩展方面 无论是,SQL,的语法解析器、分析器还是优化器都可以重新定义,进行扩展。,30,四、,BDAS,简介,Overview,1,.,6,Spark SQL,是一个用于结构化的数据处理的模块。,Spark SQL,和,Spark RDD API,的区别如下:,1,、,Spark SQL,的接口提供更多的关于数据以及操作的结构方面的信息。,2,、,Spark SQL,会利用这些信息对数
18、据操作进行额外的优化。,可以通过三种方式与,Spark SQL,进行交互:,SQL,、,DataFrames API,、,Datasets API,这三种,API/,语言最终都同一个执行引擎完成操作。所以你可以选择任何一种舒服的方式来书写自己的数据处理逻辑。,31,四、,BDAS,简介,SQL,1,.,7,Spark SQL,的使用方式之一是用来执行,SQL,查询。,特性如下:,同时支持标准的,SQL,语句和,HiveQL,能够从,Hive,表中读取数据(需要进行配置),查询结果将返回一个,DataFrame,支持在交互式环境中使用,SQL,语句,32,四、,BDAS,简介,DataFrame
19、s,1,.,7,DataFrame,用来描述结构化的数据。,Spark,官方给出的定义为:,A DataFrame is a distributed collection of data organized into named columns.,DataFrame,概念上等同于关系型数据库中的一个表或者,R/Python,语言中的,data frame,,,不同的是,Spark,提供更丰富的优化。,DataFrame,可从多种资源中构建:结构化的数据文件、,hive,中的表、外部数据库、现有的,RDD,等。,DataFrame,提供了丰富的,API,。,33,四、,BDAS,简介,Spark
20、 Streaming,2,Spark Streaming,是建立在,Spark,上的实时计算框架,通过它提供的丰富的,API,、基于内存的高速执行引擎,用户可以结合流式、批处理和交互试查询应用。,Spark Streaming,通过将流数据按指定时间片累积为,RDD,,然后将每个,RDD,进行批处理,进而实现大规模的流数据处理。其吞吐量能够超越现有主流流处理框架,Storm,,并提供丰富的,API,用于流数据计算。,34,四、,BDAS,简介,计算流程,2.1,Spark Streaming,是将流式计算分解成一系列短小的批处理作业。把,Spark Streaming,的输入数据按照,batc
21、h size,(如,1,秒)分成一段一段的数据,每一段数据都转换成,Spark,中的,RDD,将,Spark Streaming,中对,DStream,的,Transformation,操作变为针对,Spark,中对,RDD,的,Transformation,操作,将,RDD,经过操作变成中间结果保存在内存中。整个流式计算根据业务的需求可以对中间的结果进行叠加,或者存储到外部设备。,35,四、,BDAS,简介,流程图,2.2,36,四、,BDAS,简介,spark,与,storm,2.3,处理模型,延迟,:,Storm,处理的是每次传入的一个事件,而,Spark Streaming,是处理某个
22、时间段窗口内的事件流,。,容错、数据保证,:,Spark Streaming,使用,Spark,的血统容错机制,,Storm,单独跟踪每条记录,在错误恢复时可能出错。,另一方面,,Spark Streaming,只需要在批级别进行跟踪处理,因此即便一个节点发生故障,也可以有效地保证每个,batch,将完全被处理一次。,简而言之,如果你需要秒内的延迟,,Storm,是一个不错的选择,而且没有数据丢失。如果你需要有状态的计算,而且要完全保证每个事件只被处理一次,,Spark Streaming,则更好。,37,四、,BDAS,简介,GraphX,3,Graphx,是,Spark,生态中的非常重要的
23、组件,可以对图这种数据结构进行并行的处理计算。,GraphX,基于,BSP,(整体同步并行计算模型)模型,在,Spark,之上封装类似,Pregel,(,google,的图计算框架)的接口,。,GraphX,通过引入*,Resilient Distributed Property Graph*,扩展了,Spark RDD,这种抽象数据结构,38,四、,BDAS,简介,GraphX,架构,3,.1,39,四、,BDAS,简介,GraphX,存储结构,3.2,graphx,借鉴,powerGraph,,使用的是,vertexcut(,点分割,),方式存储图。,优点:,任何一条边只会出现在一台机器上
24、,对边的操作进行起来比较简单。网络开销小,缺点:,每个点可能要存储多份,更新点要有数据同步开销,。,40,四、,BDAS,简介,GraphX,底层设计,3.3,1,、,对,Graph,视图的所有操作,最终都会转换成其关联的,Table,视图的,RDD,操作来完成。,2,、,两种视图底层共用的物理数据,由,RDDVertex-Partition,和,RDDEdgePartition,这两个,RDD,组成。,3,、,图的分布式存储采用点分割模式,而且使用,partitionBy,方法,由用户指定不同的划分策略,。,41,四、,BDAS,简介,MLlib,1,MLlib,是构建在,Spark,上的分
25、布式机器学习库,充分利用了,Spark,的内存计算和适合迭代型计算的优势,使性能大幅提升,同时,Spark,算子丰富的表现力,让大规模机器学习的算法开发不再复杂。,MLlib,包含了分类、回归、聚类、协同过滤、数据降维等基本机器学习算法的实现。使用者也能够根据自己的业务需要,在这些算法之上进行进一步开发。,42,纲要,Spark,综述,1,核心技术,2,Spark,架构,3,BDAS,简介,4,函数式编程简介,7,Spark,应用开发实战,6,Spark,安装部署,5,43,五、,Spark,安装部署,Spark,部署模式,1,Spark,有三种部署模式:,1,、,standalone,2,、
26、,Spark on Yarn,3,、,Spark on Mesos,44,五、,Spark,安装部署,Standalone,1,.1,自带完整的服务,包括资源调度和文件管理都由自己完成,可单独部署到一个集群中,。,无需依赖任何其他资源管理系统。,目前,Spark,在,standalone,模式下是没有任何单点故障问题的,这是借助,zookeeper,实现的,思想类似于,Hbase master,单点故障解决方案。,45,五、,Spark,安装部署,Spark,On Mesos,1,.2,Mesos,是,AMPlab,开发的资源调度器,,Spark,可以在其上以插件的形式运行。,正因为,Meso
27、s,与,Spark,同出一源,所以,Spark,运行在,Mesos,更加灵活,自然。,Spark On Mesos,有两种调度模式:,粗粒度模式,(,Coarse-grained Mode,),细粒度模式,(,Fine-grained Mode,),46,五、,Spark,安装部署,Spark On Yarn,1,.3,这是一种最有前景的部署模式。但限于,YARN,自身的发展,目前仅支持粗粒度模式(,Coarse-grained Mode,)。,YARN,上的,Container,资源是不可以动态伸缩的,一旦,Container,启动之后,可使用的资源不能再发生变化,不过这个已经在,YARN,
28、计划中了。,47,五、,Spark,安装部署,Spark,部署实战,2,给大家演示,Spark on Yarn,的部署过程。,部署在最简单的集群之上:两个节点,一个,master,和一个,slave,服务器操作系统是,ubuntu12,Hadoop,版本:,2.2.0,Spark,版本:,1.0.2,JDK,版本:,1.7,Scala,版本:,2.10.4,Master,:,192.168.1.131,Slave,:,192.168.1.125,48,五、,Spark,安装部署,首先安装,Scala,:,下载地址:,www.scala-lang.org/download/,下载完成后将,Sca
29、la-2.10.4.tgz,上传至,linux,主机中,解压:,tar-zxvf Scala-2.10.4.tgz-C/cloud/,配置环境变量:,在,/etc/profile,文件中添加:,export SCALA_HOME=/cloud/scala-2.10.4,export PATH=$SCALA_HOME/bin:$PATH,保存退出,,source/etc/profile,使配置生效。,49,五、,Spark,安装部署,安装,Spark,进入官网下载,Spark,程序包,下载地址:,spark.apache.org/downloads.html,下载,spark-1.0.2-bin
30、-hadoop2.tgz,解压:,tar-zxvf spark-1.0.2-bin-hadoop2.tgz-C/cloud,接下来修改,Spark,的配置文件,这里对,Spark,进行简单配置,50,五、,Spark,安装部署,1,、修改,conf/spark-env.sh,在文件中添加以下参数:,export SCALA_HOME=/cloud/scala-2.10.4,export JAVA_HOME=/cloud/jdk1.7.0_80,export SPARK_WORKER_MEMORY=6g,export SPARK_MASTER_IP=192.168.1.131,export MA
31、STER=spark:/192.168.1.131:7077,2,、修改,conf/slaves,文件:,本次示例集群有两个节点,一个,master,节点和一个,slave1,节点。所以在,slaves,文件中只需要添加:,slave1,51,五、,Spark,安装部署,接下来同步至,slave,节点:,首先,同步,scala,。,scp-r/cloud/scala-2.10.4usernamemaster:/cloud,然后是,spark,:,scp-r/cloud/spark-1.0.2-bin-hadoop2/usernamemaster:/cloud/,最后修改,slave1,上的,/
32、etc/profile,文件和,master,节点一致。记得,source/etc/profile,。,提示:如果有多个从节点,这样同步会很麻烦,可以用,pssh,批量操作。,52,五、,Spark,安装部署,启动,Spark,首先启动,Hadoop:,Start-all.sh,然后启动,Spark,cd/cloud/spark-1.0.2-bin-hadoop2/sbin,./start-all.sh,正常情况下,,master,节点会出现,master,进程,可以用,jps,查看:,#jps,23489 Jps,1258 Worker,1364 DataNode,24587 NodeMan
33、ager,#jps,23526 Jps,2112 Master,7235 NameNode,7598 SecondaryNameNode,7569 ResourceManager,worker,节点会有,worker,进程:,53,纲要,Spark,综述,1,核心技术,2,Spark,架构,3,BDAS,简介,4,函数式编程简介,7,Spark,应用实例,6,Spark,安装部署,5,54,六、,Spark,应用开发实战,Wordcount,相当于大数据应用程序中的“,Hello World,”,本次演示的,WordCount,是在,eclipse,下编写,目前大部分的,Scala,开发者都比
34、较推崇,IntelliJ IDEA,。,如果电脑配置还不错的话,推荐用这个,IDEA.,以上开发工具都可以在,Scala,官网找到下载链接,scala-ide.org/,55,六、,Spark,应用开发实战,编程准备,1,首先,FIle-New-Scala project,:新建一个,Scala,工程,名称就叫,TestSpark_01,好了。,JRE,选择,1.7/1.8,都可以。,然后在工程中的,src,文件夹上面右击,-new-Package,,建立一个包。,最后在包上面右击,-New-Scala Object,,这里要注意一下,选择的是,Scala Object,,而不是,Scala
35、Class,。,56,六、,Spark,应用开发实战,编程准备,2,注意在写代码之前一定要先导入相关的依赖。,首先要将工程中自动生成的,Scala library container,文件夹删除,否则工程会由于,Scala,版本冲突出现错误。,然后在,Spark,安装目录的,lib,目录下找到,spark-assembly-1.3.0-hadoop2.3.0.jar,这个文件,以,“spark-assembly-”,开头,后面的因版本而异。,这个就是,Spark,程序的依赖,jar,包。在工程上右击,新建一个名为,lib,的文件夹,将,jar,包复制过来,然后在,jar,包上右击,-build
36、path-add to buildpath,即可。,57,六、,Spark,应用开发实战,写代码,3,1.package cn.hunan,2.,3.import org.apache.spark._,4.import org.apache.spark.SparkContext._,5.,6.object WordCount,7.def main(args:ArrayString),8.val conf=new SparkConf(),9.val sc=new SparkContext(conf),10.val line=sc.textFile(args(0),11.,val result=l
37、ine.flatMap(_.split(a-zA-Z+).map(_,1).reduceByKey(_+_),13.result.saveAsTextFile(args(1),14.sc.stop(),15.,16.,58,六、,Spark,应用开发实战,生成,jar,包,4,接下来就可以导出,jar,包了。在,WordCount.Scala,文件上右击,-Export,然后选择,JAR file,包名为,WC.jar,存放在,E,:,myjar,目录下。接下来需要把,Jar,包上传至,Spark,集群。我用的是,SecureCRT,这个工具,用这个工具链接,master,节点后,按,alt+
38、p,即可调出,SFTP,文件传输窗口。,59,六、,Spark,应用开发实战,运行,Jar,5,在,HDFS,上传一个测试文本,用于,wordcount,。,hadoop fs-put Jane1.txt/Spark/Jane1.txt,切换到目录,SPARK_HOME/bin,目录下:在,linux shell,中执行以下命令:,./spark-submit-classcn.hunan.WordCount-,masteryarn/HunanJar/WC.jar/Spark/Jane1.txt,/Spark/out,60,六、,Spark,应用开发实战,运行结果,6,等待执行结束后就可以看到在
39、,HDFS:/Spark/out,目录下生成了以下文件:,61,七、函数式编程简介,为什么要学,Scala,?,1,Scala,是,Spark,的原生语言。而,Spark,又是一个开源项目,开源项目一般是免费供大家使用,源代码也是完全公开。这是开源的优势。,但是开源软件正因为是免费的,所以在遇到问题的时候,软件作者并没有义务为你解决问题,如果用的是收费的商业软件,就有很多的售后支持。所以,对于开源使用者来说,了解源码是必须要做的功课。而且这些源码都是世界顶尖的程序猿所写,在阅读源代码的过程中也能够学到很多编程的技巧。,62,Scala,特点,2,Scala,是一门多范式的编程语言,并集成面向对
40、象编程和函数式编程的各种特性。,这种语言和,Java,语言一样,运行在,Java,虚拟机,JVM,之上所以,,Scala,能够和,Java,无缝集成,只要将,jar,包导进来,里面的类可以随便用。,所以,Java,程序猿能够很快上手,Scala,。对于熟悉,Python,的同学来说也同样。,七、函数式编程简介,63,函数式编程,3,Scala,作为一个多范式编程语言。虽然,Scala,不强求开发者使用函数式编程,不强求变量都是不可变的(通过,val,定义的),但是还是鼓励使用函数式编程。,现在的计算机都是多核,CPU,,想充分利用其多核处理,我们需要写可并行计算的代码。而函数式编程在并行操作性
41、有着天生的优势,函数式编程没有可变变量,那么就不会有内存共享的问题,也不会产生副作用,(side effect),的函数。下面介绍函数式编程的五大特性,。,七、函数式编程简介,64,闭包和高阶函数,3.1,在面向对象编程中,我们把对象作为编程中的第一类对象,所有代码的编写都是围绕对象来编程。那么函数式编程中,我们的第一类对象就是函数,也叫做 闭包 或者 仿函数,(functor),对象。而高阶函数的意思则是用另一个函数作为参数,甚至可以返回一个函数的叫做 高阶函数。,七、函数式编程简介,65,无副作用,3.2,无副作用,函数副作用维基百科的解释是:指當調用函數時,除了返回函數值之外,還對主調用
42、函數產生附加的影響。简单来说就是调用函数时,函数执行过程中不会改变参数的值。,在函数式编程中需要极力避免可变变量,因此才能彻底避免函数的副作用。,Var x=1,Def XplusY(y:Int)=x+=y;x,七、函数式编程简介,66,递归与尾递归,3.3,七、函数式编程简介,尾递归是递归的一种优化方法。因为递归的空间效率很低,而且如果递归深度很深,容易产生栈溢出的情况。尾递归就是将递归语句写在函数的最底部,这样尾递归的每次调用的时候,不需要保存当前状态,而是把当前的状态值直接传给下次一次调用,然后清空当前的状态。那么占用的栈空间就是常量值了,不会出现栈的溢出。,67,惰性计算,3.4,惰性
43、 求值 特别用于 函数式编程语言 中。在使用延迟求值的时候,表达式不在它被绑定到变量之后就立即求值,而是在该值被取用的时候求值。,除可以得到性能的提升外,惰性计算的最重要的好处是它可以构造一个无限的数据类型。,七、函数式编程简介,68,引用透明,3.5,引用透明,(Referential Transparent),的概念与函数的副作用相关,且受其影响。,如果程序中两个相同值得表达式能在该程序的任何地方互相替换,而不影响程序的动作,那么该程序就具有引用透明性。,它的优点是比非引用透明的语言的语义更容易理解,不那么晦涩。纯函数式语言没有变量,所以它们都具有引用透明性。,七、函数式编程简介,69,八、,相关资源,参考资料,1,An Architecture for Fast and General Data Processing on Large Clusters,spark.apache.org/docs/latest/,70,Q1,:请叙述,RDDs,之间的两种依赖方式及特性。,Q2:,简述在,Spark,框架中应用的执行流程。,71,Thank You!,欢迎批评指正!,南京邮电大学,-,综合科研大楼,72,