版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、Spark入門及實戰(zhàn),綱要,,Spark架構(gòu),3,,BDAS簡介,4,,函數(shù)式編程簡介,7,,Spark應(yīng)用實例,6,,Spark安裝部署,5,一、Spark綜述,Spark是基于內(nèi)存計算的大數(shù)據(jù)并行計算框架。Spark基于內(nèi)存計算,提高了在大數(shù)據(jù)環(huán)境下數(shù)據(jù)處理的實時性,同時保證了高容錯性和高可伸縮性,允許用戶將Spark部署在大量廉價硬件之上,形成集群。Spark于2009年誕生于加州大學(xué)伯克利分校AMPLab。并且于2010年開源
2、。2013年6月Spark進入Apache孵化器。目前,已經(jīng)成為Apache軟件基金會旗下的頂級開源項目。,http://people.csail.mit.edu/matei/,Matai zaharia,一、Spark綜述,Spark相比HadoopMapRedue的優(yōu)勢如下:1、中間結(jié)果輸出 基于MapReduce的計算模型會將中間結(jié)果序列化到磁盤上。而Spark將執(zhí)行模型抽象為通用的有向無環(huán)圖執(zhí)行計劃。且可以將中
3、間結(jié)果緩存內(nèi)存中。2、數(shù)據(jù)格式和內(nèi)存布局 Spark抽象出分布式內(nèi)存存儲結(jié)構(gòu)RDD,進行數(shù)據(jù)存儲。Spark能夠控制數(shù)據(jù)在不同節(jié)點上的分區(qū),用戶可以自定義分區(qū)策略。,一、Spark綜述,3、執(zhí)行策略 MapReduce在數(shù)據(jù)shuffle之前總是花費大量時間來排序。Spark支持基于Hash的分布式聚合,在需要的時候再進行實際排序。4、任務(wù)調(diào)度的開銷 MapReduce上的不同作業(yè)在
4、同一個節(jié)點運行時,會各自啟動一個JVM。而Spark同一節(jié)點的所有任務(wù)都可以在一個JVM上運行。,一、Spark綜述,Spark生態(tài)隨著BDAS的完善,已經(jīng)成型。Spark全面兼容Hadoop的數(shù)據(jù)持久層。從而讓把計算任務(wù)從原來的MapReduce計算任務(wù)遷移到Spark中更加簡單。目前Spark的工業(yè)應(yīng)用在國內(nèi)已經(jīng)大范圍落地。包括BAT在內(nèi)的一眾互聯(lián)網(wǎng)公司都建立了自己的Spark集群,綱要,,Spark架構(gòu),3,,BDAS簡介,4
5、,,函數(shù)式編程簡介,7,,Spark應(yīng)用實例,6,,Spark安裝部署,5,二、Spark關(guān)鍵技術(shù),RDD的全稱是彈性分布式數(shù)據(jù)集(resilient distributed dataset)是Spark的核心數(shù)據(jù)模型,RDD是Spark中待處理的數(shù)據(jù)的抽象,它是邏輯中的實體。對于使用者來說,你得到的數(shù)據(jù)操作接口就是RDD,在對RDD進行處理的時候不需要考慮底層的分布式集群,就像在單機上一樣即可,這也正是Spark的優(yōu)勢之一。,二、
6、Spark關(guān)鍵技術(shù),從Hadoop文件系統(tǒng)輸入(比如HDFS)創(chuàng)建。從父RDD轉(zhuǎn)換得到新的RDD。將數(shù)組或者集合這樣的數(shù)據(jù)結(jié)構(gòu)并行化,轉(zhuǎn)化成RDD。通過cache()函數(shù)將計算后的RDD緩存到內(nèi)存中。,二、Spark關(guān)鍵技術(shù),,從邏輯上來看,RDD就是數(shù)據(jù)。而實際上,從物理上來看,RDD是一種分布式內(nèi)存的抽象。Spark中的數(shù)據(jù)實際上是像HDFS那樣分塊存儲,二、Spark關(guān)鍵技術(shù),分區(qū)列表計算每個分片的函數(shù)對父RDD的依賴
7、對“鍵值對”數(shù)據(jù)類型RDD的分區(qū)器,控制分區(qū)策略和分區(qū)數(shù)。每個數(shù)據(jù)分區(qū)的地址列表。,所以RDD實際上只是一個元數(shù)據(jù)對象,用于將對數(shù)據(jù)集的操作映射到物理存儲之上。RDD的重要內(nèi)部屬性如下:,二、Spark關(guān)鍵技術(shù),RDD中的依賴關(guān)系RDD之間的依賴關(guān)系可以分為兩類:窄依賴:每個父 RDD 的分區(qū)都至多被一個子 RDD 的分區(qū)使用;窄依賴允許在單個集群節(jié)點上流水線式執(zhí)行,這個節(jié)點可以計算所有父級分區(qū)。在窄依賴中,節(jié)點失敗后的恢
8、復(fù)更加高效。因為只有丟失的父級分區(qū)需要重新計算,并且這些丟失的父級分區(qū)可以并行地在不同節(jié)點上重新計算。 寬依賴:多個子 RDD 的分區(qū)依賴一個父 RDD 的分區(qū)。寬依賴需要所有的父 RDD 數(shù)據(jù)可用并且數(shù)據(jù)已經(jīng)通過類 MapReduce 的操作shuffle 完成。在寬依賴的繼承關(guān)系中,單個失敗的節(jié)點可能導(dǎo)致一個 RDD 的所有先祖 RDD 中的一些分區(qū)丟失,導(dǎo)致計算的重新執(zhí)行。,二、Spark關(guān)鍵技術(shù),寬依賴和窄依賴的樣例。
9、每一個方框表示一個 RDD,其內(nèi)的陰影矩形表示 RDD 的分區(qū)。,二、Spark關(guān)鍵技術(shù),TransformationTransformation操作是延遲計算的,也就是說從一個RDD轉(zhuǎn)換生成另一個RDD的轉(zhuǎn)換操作不是立即執(zhí)行的,而是需要等到Action操作是才真正出發(fā)運算。ActionAction算子會觸發(fā)Spark提交作業(yè),并將數(shù)據(jù)輸出到Spark系統(tǒng)。,RDD操作算子,RDD中的操作算子可以分為兩類:Transforma
10、tion(變換)算子 與 Action(行動)算子。,二、Spark關(guān)鍵技術(shù),RDD算子操作舉例如下:,Val line = sc.textFile(Test.txt)line.map(n=>Integer.parseInt(n)*Integer.parseInt(n)).reduce(_+_),二、Spark關(guān)鍵技術(shù),二、Spark關(guān)鍵技術(shù),基于血統(tǒng)的容錯機制(lineage):在spark中RDD具有不變性,在數(shù)據(jù)處理過程
11、中,spark通過lineage圖記錄了各個RDD之間的變換關(guān)系,一旦某個數(shù)據(jù)處理過程出現(xiàn)錯誤,spark可以根據(jù)lineage圖快速進行容錯恢復(fù)。特別是對于map操作來說,當某個節(jié)點的任務(wù)失敗,spark只需要重新計算相應(yīng)分區(qū)的數(shù)據(jù),而不必將整個任務(wù)重新計算。在很多分布式數(shù)據(jù)處理系統(tǒng)中通過備份來進行容錯,相比于這種會導(dǎo)致巨大存儲消耗的容錯方式,spark的lineage圖只需要十幾kb的存儲空間。Spark允許用戶將數(shù)據(jù)c
12、ache下來,對于將來可能頻繁使用的某個計算結(jié)果,將這個RDDcache下來是明智的選擇。,二、Spark關(guān)鍵技術(shù),檢查點支持:雖然 lineage 可用于錯誤后 RDD 的恢復(fù),但對于很長的 lineage 的 RDD 來說,這樣的恢復(fù)耗時較長。由此,可以考慮將某些 RDD 進行檢查點操作(Checkpoint)保存到穩(wěn)定存儲上。Spark 當前提供了為 RDD 設(shè)置檢查點操作的 API , 讓用戶自行決定需要為哪些數(shù)據(jù)設(shè)置檢
13、查點操作。由于 RDD 的只讀特性使得比常用的共享內(nèi)存更容易做 checkpoint.由于不需要關(guān)心一致性的問題,RDD 的寫出可在后臺進行,而不需要程序暫停或進行分布式快照,綱要,,BDAS簡介,4,,Scala簡介,7,,Spark應(yīng)用實例,6,,Spark安裝部署,5,三、Spark體系架構(gòu),MasterWorker,三、Spark體系架構(gòu),三、Spark體系架構(gòu),Master進程和Worker進程,對整個集群進行控制。
14、Driver 程序是應(yīng)用邏輯執(zhí)行的起點,負責作業(yè)的調(diào)度,即Task任務(wù)的分發(fā)Worker用來管理計算節(jié)點和創(chuàng)建Executor并行處理任務(wù)。Executor對相應(yīng)數(shù)據(jù)分區(qū)的任務(wù)進行處理。,三、Spark體系架構(gòu),Client 提交應(yīng)用,Master找到一個Worker啟動DriverDriver向Master或者資源管理器申請資源,之后將應(yīng)用轉(zhuǎn)化為RDD GraphDAGScheduler將RDD Graph轉(zhuǎn)化為Sta
15、ge的有向無環(huán)圖提交給TaskSchedulerTaskScheduler提交任務(wù)給Executor執(zhí)行。,綱要,,Spark架構(gòu),3,,Scala簡介,7,,Spark應(yīng)用實例,6,,Spark安裝部署,5,四、BDAS簡介,目前,Spark已經(jīng)發(fā)展成為包含眾多子項目的大數(shù)據(jù)計算平臺。伯克利將Spark的整個生態(tài)系統(tǒng)稱為伯克利數(shù)據(jù)分析棧(BDAS),目前包含四個已經(jīng)比較成熟的組件。,四、BDAS簡介,談到Spark SQL:首先需
16、要從Shark說起。,四、BDAS簡介,,為了給熟悉RDBMS但又不理解MapReduce的技術(shù)人員提供快速上手的工具,Hive應(yīng)運而生,它是當時唯一運行在Hadoop上的SQL-on-Hadoop工具。但是MapReduce計算過程中大量的中間磁盤落地過程消耗了大量的I/O,降低的運行效率,為了提高SQL-on-Hadoop的效率,大量的SQL-on-Hadoop工具開始產(chǎn)生。其中就包括Shark,四、BDAS簡介,Shark基于Hi
17、ve修改了內(nèi)存管理、物理計劃、執(zhí)行三個模塊,并使之能運行在Spark引擎上,從而使得SQL查詢的速度得到10-100倍的提升,四、BDAS簡介,Shark缺陷:Shark對于Hive的太多依賴,制約了Spark的One Stack Rule Them All的既定方針,制約了Spark各個組件的相互集成SparkSQL拋棄原有Shark的代碼,汲取了Shark的一些優(yōu)點,如內(nèi)存列存儲(In-Memory Columnar Stor
18、age)、Hive兼容性等,重新開發(fā)了SparkSQL代碼;由于擺脫了對Hive的依賴性,SparkSQL無論在數(shù)據(jù)兼容、性能優(yōu)化、組件擴展方面都得到了極大的方便,四、BDAS簡介,*數(shù)據(jù)兼容方面 不但兼容Hive,還可以從RDD、JSON文件中獲取數(shù)據(jù)*性能優(yōu)化方面 采取In-Memory Columnar Storage、byte-code generation等優(yōu)化技術(shù)*組件擴展方面 無論是SQL的語法解析器、分
19、析器還是優(yōu)化器都可以重新定義,進行擴展。,四、BDAS簡介,,Spark SQL是一個用于結(jié)構(gòu)化的數(shù)據(jù)處理的模塊。Spark SQL和Spark RDD API的區(qū)別如下:1、Spark SQL的接口提供更多的關(guān)于數(shù)據(jù)以及操作的結(jié)構(gòu)方面的信息。2、Spark SQL會利用這些信息對數(shù)據(jù)操作進行額外的優(yōu)化。可以通過三種方式與Spark SQL進行交互:SQL、DataFrames API 、Datasets API這三種API
20、/語言最終都同一個執(zhí)行引擎完成操作。所以你可以選擇任何一種舒服的方式來書寫自己的數(shù)據(jù)處理邏輯。,四、BDAS簡介,,Spark SQL的使用方式之一是用來執(zhí)行SQL查詢。特性如下:同時支持標準的SQL語句和HiveQL能夠從Hive表中讀取數(shù)據(jù)(需要進行配置)查詢結(jié)果將返回一個DataFrame支持在交互式環(huán)境中使用SQL語句,四、BDAS簡介,,DataFrame用來描述結(jié)構(gòu)化的數(shù)據(jù)。Spark官方給出的定義為:
21、A DataFrame is a distributed collection of data organized into named columns.DataFrame概念上等同于關(guān)系型數(shù)據(jù)庫中的一個表或者R/Python語言中的data frame, 不同的是Spark提供更豐富的優(yōu)化。DataFrame可從多種資源中構(gòu)建:結(jié)構(gòu)化的數(shù)據(jù)文件、hive中的表、外部數(shù)據(jù)庫、現(xiàn)有的RDD等。DataFrame提供
22、了豐富的API。,四、BDAS簡介,Spark Streaming是建立在Spark上的實時計算框架,通過它提供的豐富的API、基于內(nèi)存的高速執(zhí)行引擎,用戶可以結(jié)合流式、批處理和交互試查詢應(yīng)用。Spark Streaming通過將流數(shù)據(jù)按指定時間片累積為RDD,然后將每個RDD進行批處理,進而實現(xiàn)大規(guī)模的流數(shù)據(jù)處理。其吞吐量能夠超越現(xiàn)有主流流處理框架Storm,并提供豐富的API用于流數(shù)據(jù)計算。,四、BDAS簡介,Spark Str
23、eaming是將流式計算分解成一系列短小的批處理作業(yè)。把Spark Streaming的輸入數(shù)據(jù)按照batch size(如1秒)分成一段一段的數(shù)據(jù),每一段數(shù)據(jù)都轉(zhuǎn)換成Spark中的RDD將Spark Streaming中對DStream的Transformation操作變?yōu)獒槍park中對RDD的Transformation操作將RDD經(jīng)過操作變成中間結(jié)果保存在內(nèi)存中。整個流式計算根據(jù)業(yè)務(wù)的需求可以對中間的結(jié)果進行疊加,或者
24、存儲到外部設(shè)備。,四、BDAS簡介,四、BDAS簡介,處理模型,延遲:Storm處理的是每次傳入的一個事件,而Spark Streaming是處理某個時間段窗口內(nèi)的事件流。容錯、數(shù)據(jù)保證:Spark Streaming使用Spark的血統(tǒng)容錯機制,Storm單獨跟蹤每條記錄,在錯誤恢復(fù)時可能出錯。另一方面,Spark Streaming只需要在批級別進行跟蹤處理,因此即便一個節(jié)點發(fā)生故障,也可以有效地保證每個batch將完全被處
25、理一次。簡而言之,如果你需要秒內(nèi)的延遲,Storm是一個不錯的選擇,而且沒有數(shù)據(jù)丟失。如果你需要有狀態(tài)的計算,而且要完全保證每個事件只被處理一次,Spark Streaming則更好。,四、BDAS簡介,Graphx是Spark生態(tài)中的非常重要的組件,可以對圖這種數(shù)據(jù)結(jié)構(gòu)進行并行的處理計算。GraphX基于BSP(整體同步并行計算模型)模型,在Spark之上封裝類似Pregel(google的圖計算框架)的接口。GraphX
26、通過引入**Resilient Distributed Property Graph**擴展了Spark RDD這種抽象數(shù)據(jù)結(jié)構(gòu),四、BDAS簡介,四、BDAS簡介,graphx借鑒powerGraph,使用的是vertexcut(點分割)方式存儲圖。,優(yōu)點:任何一條邊只會出現(xiàn)在一臺機器上,對邊的操作進行起來比較簡單。網(wǎng)絡(luò)開銷小,缺點:每個點可能要存儲多份, 更新點要有數(shù)據(jù)同步開銷。,四、BDAS簡介,1、對Graph視圖的所有操作
27、,最終都會轉(zhuǎn)換成其關(guān)聯(lián)的Table視圖的RDD操作來完成。2、兩種視圖底層共用的物理數(shù)據(jù),由RDD[Vertex-Partition]和RDD[EdgePartition]這兩個RDD組成。3、圖的分布式存儲采用點分割模式,而且使用partitionBy方法,由用戶指定不同的劃分策略。,四、BDAS簡介,MLlib是構(gòu)建在Spark上的分布式機器學(xué)習(xí)庫,充分利用了Spark的內(nèi)存計算和適合迭代型計算的優(yōu)勢,使性能大幅提升,同時S
28、park算子豐富的表現(xiàn)力,讓大規(guī)模機器學(xué)習(xí)的算法開發(fā)不再復(fù)雜。MLlib包含了分類、回歸、聚類、協(xié)同過濾、數(shù)據(jù)降維等基本機器學(xué)習(xí)算法的實現(xiàn)。使用者也能夠根據(jù)自己的業(yè)務(wù)需要,在這些算法之上進行進一步開發(fā)。,綱要,,Spark架構(gòu),3,,BDAS簡介,4,,函數(shù)式編程簡介,7,,Spark應(yīng)用開發(fā)實戰(zhàn),6,五、Spark安裝部署,Spark有三種部署模式:1、standalone2、Spark on Yarn3、Spark o
29、n Mesos,五、Spark安裝部署,自帶完整的服務(wù),包括資源調(diào)度和文件管理都由自己完成,可單獨部署到一個集群中。無需依賴任何其他資源管理系統(tǒng)。目前Spark在standalone模式下是沒有任何單點故障問題的,這是借助zookeeper實現(xiàn)的,思想類似于Hbase master單點故障解決方案。,五、Spark安裝部署,Mesos是AMPlab開發(fā)的資源調(diào)度器,Spark可以在其上以插件的形式運行。正因為Mesos與Spar
30、k同出一源,所以Spark運行在Mesos更加靈活,自然。Spark On Mesos有兩種調(diào)度模式:粗粒度模式(Coarse-grained Mode)細粒度模式(Fine-grained Mode),五、Spark安裝部署,這是一種最有前景的部署模式。但限于YARN自身的發(fā)展,目前僅支持粗粒度模式(Coarse-grained Mode)。,YARN上的Container資源是不可以動態(tài)伸縮的,一旦Container啟動
31、之后,可使用的資源不能再發(fā)生變化,不過這個已經(jīng)在YARN計劃中了。,五、Spark安裝部署,給大家演示Spark on Yarn的部署過程。部署在最簡單的集群之上:兩個節(jié)點,一個master和一個slave服務(wù)器操作系統(tǒng)是ubuntu12Hadoop版本:2.2.0Spark版本:1.0.2JDK版本:1.7Scala版本:2.10.4Master:192.168.1.131Slave:192.168.1.125,五、S
32、park安裝部署,首先安裝Scala:下載地址:http://www.scala-lang.org/download/下載完成后將Scala-2.10.4.tgz上傳至linux主機中,解壓: tar -zxvf Scala-2.10.4.tgz -C /cloud/ 配置環(huán)境變量:在/etc/profile文件中添加: export SCALA_HOME=/cloud/scala-2.10.4 export P
33、ATH=${SCALA_HOME}/bin:$PATH 保存退出, source /etc/profile 使配置生效。,五、Spark安裝部署,安裝Spark進入官網(wǎng)下載Spark程序包,下載地址:http://spark.apache.org/downloads.html下載spark-1.0.2-bin-hadoop2.tgz解壓: tar-zxvf spark-1.0.2-bin-hadoop2.tgz -C /
34、cloud 接下來修改Spark的配置文件,這里對Spark進行簡單配置,五、Spark安裝部署,1、修改conf/spark-env.sh,在文件中添加以下參數(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=
35、192.168.1.131 export MASTER=spark://192.168.1.131:7077 2、修改conf/slaves文件:本次示例集群有兩個節(jié)點,一個master節(jié)點和一個slave1節(jié)點。所以在slaves文件中只需要添加: slave1,五、Spark安裝部署,接下來同步至slave節(jié)點:首先,同步scala。scp -r /cloud/scala-2.10.4username@master:
36、/cloud 然后是spark: scp -r /cloud/spark-1.0.2-bin-hadoop2/ username@master:/cloud/ 最后修改slave1上的 /etc/profile 文件和master節(jié)點一致。記得source /etc/profile。提示:如果有多個從節(jié)點,這樣同步會很麻煩,可以用pssh批量操作。,五、Spark安裝部署,啟動Spark首先啟動Hadoop:Sta
37、rt-all.sh然后啟動Sparkcd /cloud/spark-1.0.2-bin-hadoop2/sbin ./start-all.sh 正常情況下,master節(jié)點會出現(xiàn)master進程,可以用jps查看:,#jps23489 Jps1258 Worker1364 DataNode24587 NodeManager,#jps23526 Jps2112 Master7235 NameNode7598
38、SecondaryNameNode7569 ResourceManagerworker節(jié)點會有worker進程:,綱要,,Spark架構(gòu),3,,BDAS簡介,4,,函數(shù)式編程簡介,7,,Spark安裝部署,5,六、Spark應(yīng)用開發(fā)實戰(zhàn),Wordcount相當于大數(shù)據(jù)應(yīng)用程序中的“Hello World”本次演示的WordCount是在eclipse下編寫目前大部分的Scala開發(fā)者都比較推崇IntelliJ IDEA。如果
39、電腦配置還不錯的話,推薦用這個IDEA.以上開發(fā)工具都可以在Scala官網(wǎng)找到下載鏈接http://scala-ide.org/,六、Spark應(yīng)用開發(fā)實戰(zhàn),首先FIle->New->Scala project :新建一個Scala工程,名稱就叫TestSpark_01好了。JRE選擇1.7/1.8都可以。,然后在工程中的src文件夾上面右擊->new ->Package,建立一個包。最后在包上面右擊-
40、>New->Scala Object,這里要注意一下,選擇的是Scala Object,而不是 Scala Class。,六、Spark應(yīng)用開發(fā)實戰(zhàn),注意在寫代碼之前一定要先導(dǎo)入相關(guān)的依賴。首先要將工程中自動生成的Scala library container文件夾刪除,否則工程會由于Scala版本沖突出現(xiàn)錯誤。然后在Spark安裝目錄的lib目錄下找到spark-assembly-1.3.0-hadoop2.3.0
41、.jar這個文件,以“spark-assembly-”開頭,后面的因版本而異。這個就是Spark程序的依賴jar包。在工程上右擊,新建一個名為lib的文件夾,將jar包復(fù)制過來,然后在jar包上右擊->buildpath->add to buildpath即可。,六、Spark應(yīng)用開發(fā)實戰(zhàn),1.package cn.hunan 2. 3.import org.apache.spark._ 4.impo
42、rt org.apache.spark.SparkContext._ 5. 6.object WordCount { 7. def main(args: Array[String]){ 8. val conf = new SparkConf() 9. val sc = new SparkContext(conf) 10. val line = sc.textFile(args(0)
43、) 11. val result = line.flatMap(_.split("[^a-zA-Z]+")).map((_, 1)).reduceByKey(_+_) 13. result.saveAsTextFile(args(1)) 14. sc.stop() 15. } 16.},六、Spark應(yīng)用開發(fā)實戰(zhàn),接下來就可以導(dǎo)出jar包了。在Wor
44、dCount.Scala文件上右擊->Export,然后選擇JAR file,包名為WC.jar,存放在E:\myjar目錄下。接下來需要把Jar包上傳至Spark集群。我用的是SecureCRT這個工具,用這個工具鏈接master節(jié)點后,按alt+p即可調(diào)出SFTP文件傳輸窗口。,六、Spark應(yīng)用開發(fā)實戰(zhàn),在HDFS上傳一個測試文本,用于wordcount。hadoop fs -put Jane1.txt /Spark/Ja
45、ne1.txt,切換到目錄SPARK_HOME/bin目錄下:在linux shell中執(zhí)行以下命令:./spark-submit --class cn.hunan.WordCount --master yarn ~/HunanJar/WC.jar /Spark/Jane1.txt /Spark/out,六、Spark應(yīng)用開發(fā)實戰(zhàn),等待執(zhí)行結(jié)束后就可以看到在
46、HDFS://Spark/out目錄下生成了以下文件:,七、函數(shù)式編程簡介,Scala是Spark的原生語言。而Spark又是一個開源項目,開源項目一般是免費供大家使用,源代碼也是完全公開。這是開源的優(yōu)勢。但是開源軟件正因為是免費的,所以在遇到問題的時候,軟件作者并沒有義務(wù)為你解決問題,如果用的是收費的商業(yè)軟件,就有很多的售后支持。所以,對于開源使用者來說,了解源碼是必須要做的功課。而且這些源碼都是世界頂尖的程序猿所寫,在閱讀源代碼的
47、過程中也能夠?qū)W到很多編程的技巧。,Scala是一門多范式的編程語言,并集成面向?qū)ο缶幊毯秃瘮?shù)式編程的各種特性。這種語言和Java語言一樣,運行在Java虛擬機JVM之上所以,Scala能夠和Java無縫集成,只要將jar包導(dǎo)進來,里面的類可以隨便用。所以Java程序猿能夠很快上手Scala。對于熟悉Python的同學(xué)來說也同樣。,七、函數(shù)式編程簡介,Scala作為一個多范式編程語言。雖然Scala不強求開發(fā)者使用函數(shù)式編程,不強
48、求變量都是不可變的(通過val定義的),但是還是鼓勵使用函數(shù)式編程?,F(xiàn)在的計算機都是多核CPU,想充分利用其多核處理,我們需要寫可并行計算的代碼。而函數(shù)式編程在并行操作性有著天生的優(yōu)勢,函數(shù)式編程沒有可變變量,那么就不會有內(nèi)存共享的問題,也不會產(chǎn)生副作用(side effect)的函數(shù)。下面介紹函數(shù)式編程的五大特性。,七、函數(shù)式編程簡介,在面向?qū)ο缶幊讨校覀儼褜ο笞鳛榫幊讨械牡谝活悓ο?,所有代碼的編寫都是圍繞對象來編程。那么函數(shù)式
49、編程中,我們的第一類對象就是函數(shù),也叫做 閉包 或者 仿函數(shù) (functor)對象。而高階函數(shù)的意思則是用另一個函數(shù)作為參數(shù),甚至可以返回一個函數(shù)的叫做 高階函數(shù) 。,七、函數(shù)式編程簡介,無副作用函數(shù)副作用維基百科的解釋是:指當調(diào)用函數(shù)時,除了返回函數(shù)值之外,還對主調(diào)用函數(shù)產(chǎn)生附加的影響。簡單來說就是調(diào)用函數(shù)時,函數(shù)執(zhí)行過程中不會改變參數(shù)的值。在函數(shù)式編程中需要極力避免可變變量,因此才能徹底避免函數(shù)的副作用。 Var x
50、= 1 Def XplusY(y : Int) = { x += y; x },七、函數(shù)式編程簡介,七、函數(shù)式編程簡介,尾遞歸是遞歸的一種優(yōu)化方法。因為遞歸的空間效率很低,而且如果遞歸深度很深,容易產(chǎn)生棧溢出的情況。尾遞歸就是將遞歸語句寫在函數(shù)的最底部,這樣尾遞歸的每次調(diào)用的時候,不需要保存當前狀態(tài),而是把當前的狀態(tài)值直接傳給下次一次調(diào)用,然后清空當前的狀態(tài)。那么占用的??臻g就是常量值了,不會出現(xiàn)棧的溢出。,惰性 求值 特別用于
51、函數(shù)式編程語言 中。在使用延遲求值的時候,表達式不在它被綁定到變量之后就立即求值,而是在該值被取用的時候求值 。 除可以得到性能的提升外,惰性計算的最重要的好處是它可以構(gòu)造一個無限的數(shù)據(jù)類型。,七、函數(shù)式編程簡介,引用透明(Referential Transparent)的概念與函數(shù)的副作用相關(guān),且受其影響。 如果程序中兩個相同值得表達式能在該程序的任何地方互相替換,而不影響程序的動作,那么該程序就具有引用透明性。它的優(yōu)點是比非
52、引用透明的語言的語義更容易理解,不那么晦澀。純函數(shù)式語言沒有變量,所以它們都具有引用透明性。,七、函數(shù)式編程簡介,八、相關(guān)資源,An Architecture for Fast and General Data Processing on Large Clusters,http://spark.apache.org/docs/latest/,Q1:請敘述RDDs之間的兩種依賴方式及特性。Q2:簡述在Spark框架中應(yīng)用的執(zhí)行流程。,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 大數(shù)據(jù)技術(shù)及應(yīng)用培訓(xùn)
- 大數(shù)入門
- 基于Spark的情報大數(shù)據(jù)可視化分析.pdf
- 基于Spark平臺大數(shù)據(jù)推薦系統(tǒng)的研究.pdf
- 基于Spark的大數(shù)據(jù)挖掘技術(shù)的研究與實現(xiàn).pdf
- 基于Spark大數(shù)據(jù)平臺的火電廠節(jié)能分析.pdf
- 基于Spark的大數(shù)據(jù)清洗框架設(shè)計與實現(xiàn).pdf
- 基于Spark的大數(shù)據(jù)處理關(guān)鍵技術(shù)研究.pdf
- 基于Spark大數(shù)據(jù)平臺日志審計系統(tǒng)的設(shè)計與實現(xiàn).pdf
- 基于Spark的地理空間大數(shù)據(jù)查詢處理技術(shù)研究.pdf
- 基于Kubernetes的大數(shù)據(jù)流式計算Spark平臺設(shè)計與實現(xiàn).pdf
- 公需科目大數(shù)據(jù)培訓(xùn)考試
- 大數(shù)據(jù)時代數(shù)據(jù)安全防護最佳實踐
- 公需科目大數(shù)據(jù)培訓(xùn)考試試題及答案
- 2017年公需科目大數(shù)據(jù)培訓(xùn)考試及答案
- 公需科目大數(shù)據(jù)培訓(xùn)考試試題及答案
- 大數(shù)據(jù)研究論文翻譯實踐報告.pdf
- 《大數(shù)據(jù)銀行》(節(jié)選)翻譯實踐報告.pdf
- 公需科目大數(shù)據(jù)培訓(xùn)考試答案
- 省公需科目大數(shù)據(jù)培訓(xùn)考試
評論
0/150
提交評論