(一)并行計(jì)算的簡(jiǎn)介
并行計(jì)算:?簡(jiǎn)單來(lái)講粉铐,并行計(jì)算就是同時(shí)使用多個(gè)計(jì)算資源來(lái)解決一個(gè)計(jì)算問題让蕾,具有以下特點(diǎn):
一個(gè)問題被分解成為一系列可以并發(fā)執(zhí)行的離散部分睛约;
每個(gè)部分可以進(jìn)一步被分解成為一系列離散指令叫惊;
來(lái)自每個(gè)部分的指令可以在不同的處理器上被同時(shí)執(zhí)行;
需要一個(gè)總體的控制/協(xié)作機(jī)制來(lái)負(fù)責(zé)對(duì)不同部分的執(zhí)行情況進(jìn)行調(diào)度似舵。
這里的計(jì)算資源可以是分布式的計(jì)算機(jī)晶伦,也可以是多核CPU或多處理器的計(jì)算機(jī)。而計(jì)算的問題需要可以分解成可并發(fā)執(zhí)行的的離散片段啄枕,并且不同離散片段可以在任意時(shí)間被執(zhí)行。因此對(duì)于并行計(jì)算需要關(guān)心兩方面的內(nèi)容:計(jì)算資源的并行組織與.并行程序的設(shè)計(jì)族沃。
(二)計(jì)算資源的并行組織
1.分布式架構(gòu)的結(jié)構(gòu)
以分布式集群為例频祝,并行計(jì)算任務(wù)中,最常用的是主從架構(gòu)方案脆淹,具體根據(jù)功能的不同抽象為兩種角色:
一類負(fù)責(zé)整體的資源調(diào)度常空,存儲(chǔ)地址的管理等,不執(zhí)行具體的任務(wù)盖溺,稱為集群的主節(jié)點(diǎn)漓糙;另一類則只負(fù)責(zé)分配到的任務(wù)的具體執(zhí)行和數(shù)據(jù)的實(shí)際存儲(chǔ),稱為從節(jié)點(diǎn)烘嘱。主從節(jié)點(diǎn)各司其職昆禽,配合完成并行計(jì)算任務(wù)蝗蛙。下面介紹主從節(jié)點(diǎn)的具體配置。
2.分布式架構(gòu)的配置
(1)網(wǎng)絡(luò)互通醉鳖、SSH免密登錄
對(duì)于分布式集群來(lái)說(shuō)捡硅,首先要保證不同計(jì)算單元可以相互通信,可以是物理的連接也可以是通過網(wǎng)絡(luò)的連接盗棵。配置網(wǎng)絡(luò)保證ping通壮韭,并且為了后期訪問的方便,安裝SSH服務(wù)纹因,相互傳遞公鑰喷屋,保證可以相互免密碼登錄。
(2)配置JDK瞭恰、Scala
Hadoop屯曹,Spark是運(yùn)行在JAVA虛擬機(jī)上面的,所以要對(duì)所有的節(jié)點(diǎn)配置JDK環(huán)境寄疏,Spark為Scala語(yǔ)言原生編寫是牢,并且Scala的函數(shù)式編程更合適進(jìn)行并行計(jì)算,所以安裝Scala陕截。
(3)配置Hadoop
分布式計(jì)算必然涉及分布式儲(chǔ)存的問題驳棱,Hadoop的HDFS分布式文件系統(tǒng),Hbase分布式數(shù)據(jù)庫(kù)农曲,Hive分布式數(shù)據(jù)倉(cāng)庫(kù)等組件是一個(gè)比較好的解決方案社搅。安裝配置Hadoop。
HDFS分布式文件系統(tǒng)和MapReduce計(jì)算框架為Hadoop的兩個(gè)個(gè)核心設(shè)計(jì)乳规。
HDFS的架構(gòu)圖如下形葬,采用主從架構(gòu)(master/slave)。一個(gè)典型的HDFS集群包含一個(gè)NameNode節(jié)點(diǎn)和多個(gè)DataNode節(jié)點(diǎn)暮的。NameNode節(jié)點(diǎn)負(fù)責(zé)整個(gè)HDFS文件系統(tǒng)中的文件的元數(shù)據(jù)保管和管理笙以,集群中通常只有一臺(tái)機(jī)器上運(yùn)行NameNode實(shí)例,DataNode節(jié)點(diǎn)保存文件中的數(shù)據(jù)冻辩,集群中的機(jī)器分別運(yùn)行一個(gè)DataNode實(shí)例猖腕。在HDFS中,NameNode節(jié)點(diǎn)被稱為名稱節(jié)點(diǎn)恨闪,DataNode節(jié)點(diǎn)被稱為數(shù)據(jù)節(jié)點(diǎn)倘感。DataNode節(jié)點(diǎn)通過心跳機(jī)制與NameNode節(jié)點(diǎn)進(jìn)行定時(shí)的通信。
(4)配置Spark
最初采用Hadoop自有MapReduce計(jì)算框架可以解決大多數(shù)問題咙咽,但相比Spark計(jì)算框架就略遜一籌老玛。Spark框架相比MR來(lái)說(shuō)更加的高效,有如下幾個(gè)原因:
1.相對(duì)于Hadoop的MR計(jì)算,Spark支持DAG蜡豹,能緩存中間數(shù)據(jù)麸粮,減少數(shù)據(jù)落盤數(shù),Spark基于內(nèi)存的計(jì)算更高效
2.可以支持使用多線程啟動(dòng)task余素,更輕量豹休,啟動(dòng)速度快;
3.API高度抽象桨吊,開發(fā)效率高威根,功能不局限于MapReduce的傳統(tǒng)模式,可以根據(jù)實(shí)際的需求設(shè)計(jì)程序视乐。
但Spark沒有自帶的文件系統(tǒng)洛搀,所以使用Hadoop的HDFS配合進(jìn)行相關(guān)計(jì)算,具體結(jié)構(gòu)圖如上佑淀。
在分布式環(huán)境中安裝Spark留美,并配置相關(guān)文件。
本節(jié)具體配置參考:https://www.cnblogs.com/NextNight/p/6703362.html
(三)并行程序的選擇
至此分布式計(jì)算的集群搭建好伸刃,具備了分布式計(jì)算的基本條件谎砾。通過對(duì)Spark進(jìn)一步剖析,理解分布式程序的開發(fā)捧颅。
RDD的使用
Spark的核心為RDD(Resilient Distributed Datasets)景图,即彈性分布式數(shù)據(jù)集。
它是對(duì)數(shù)據(jù)的高度抽象概念碉哑,彈性可理解為數(shù)據(jù)存儲(chǔ)彈性挚币,可內(nèi)存,可磁盤; 分布式可理解為數(shù)據(jù)分布在不同節(jié)點(diǎn)扣典。RDD是分布式數(shù)據(jù)的邏輯抽象妆毕,物理數(shù)據(jù)存儲(chǔ)在不同的節(jié)點(diǎn)上,但對(duì)用戶透明贮尖,用戶不需要知道數(shù)據(jù)實(shí)際存在哪臺(tái)機(jī)器笛粘。
RDD包括以下部分:
? ??只讀分區(qū)集合:這保證了RDD的一致性,在計(jì)算過程中更安全可靠湿硝,此外RDD可能包含多個(gè)分區(qū)闰蛔,數(shù)據(jù)分布在不同分區(qū)中,這些分區(qū)可能在不同的機(jī)器上图柏。對(duì)數(shù)據(jù)的計(jì)算函數(shù):RDD包含了對(duì)所表示數(shù)據(jù)的計(jì)算函數(shù),也就是得到這個(gè)RDD所要經(jīng)過的計(jì)算任连。計(jì)算數(shù)據(jù)的位置:對(duì)用戶而言不需要知道數(shù)據(jù)在哪里蚤吹,這些信息隱含在RDD的結(jié)構(gòu)中。分區(qū)器:對(duì)數(shù)據(jù)分區(qū)依賴的分區(qū)算法,如hash分區(qū)器依賴的RDD信息:該RDD可能依賴的父RDD信息裁着,用于失敗重算或計(jì)算的DAG劃分繁涂。
RDD的計(jì)算與依賴
RDD計(jì)算
RDD的計(jì)算分為transformation和action兩類。
transformation有 flatMap二驰、map扔罪、union、reduceByKey等桶雀。
action有count矿酵、collect、saveAsTextFile等表示輸出的操作矗积。
RDD的計(jì)算是lazy的全肮,transformation算子不會(huì)引發(fā)計(jì)算,只是邏輯操作action算子才會(huì)引發(fā)實(shí)際的計(jì)算棘捣。
RDD依賴
RDD的依賴分為寬依賴和窄依賴兩種辜腺,如果依賴過程含有一對(duì)多則為寬依賴,否則為窄依賴乍恐。
Spark的計(jì)算流程
Spark的計(jì)算核心為RDD评疗,理解了RDD才能理解其相關(guān)計(jì)算流程。
上圖是一個(gè)Spark的wordcount例子茵烈,根據(jù)上述stage劃分原則百匆,這個(gè)job劃分為2個(gè)stage,有三行瞧毙,分別是數(shù)據(jù)讀取胧华、計(jì)算和存儲(chǔ)過程。
僅看代碼宙彪,用戶根本體會(huì)不到數(shù)據(jù)在背后是并行計(jì)算矩动。從圖中能看出數(shù)據(jù)分布在不同分區(qū)(也可以理解不同機(jī)器上),數(shù)據(jù)經(jīng)過flapMap释漆、map和reduceByKey算子在不同RDD的分區(qū)中流轉(zhuǎn)悲没。(這些算子就是上面所說(shuō)對(duì)RDD進(jìn)行計(jì)算的函數(shù))
更抽象的層次來(lái)看:Spark的運(yùn)行架構(gòu)由Driver(可理解為master)和Executor(可理解為worker或slave)組成,Driver負(fù)責(zé)把用戶代碼進(jìn)行DAG切分男图,劃分為不同的Stage示姿,然后把每個(gè)Stage對(duì)應(yīng)的task調(diào)度提交到Executor進(jìn)行計(jì)算,這樣Executor就并行執(zhí)行同一個(gè)Stage的task逊笆。
Application就是用戶submit提交的整體代碼栈戳,代碼中又有很多action操作,action算子把Application劃分為多個(gè)job难裆,job根據(jù)寬依賴劃分為不同Stage子檀,Stage內(nèi)劃分為許多(數(shù)量由分區(qū)決定镊掖,一個(gè)分區(qū)的數(shù)據(jù)由一個(gè)task計(jì)算)功能相同的task,然后這些task提交給Executor進(jìn)行計(jì)算執(zhí)行褂痰,把結(jié)果返回給Driver匯總或存儲(chǔ)亩进。
這體現(xiàn)了 Driver端總規(guī)劃–Executor端分計(jì)算–結(jié)果最后匯總回Driver 的思想,也就是分布式并行計(jì)算的思想缩歪。
(四)并行計(jì)算實(shí)例
采用Spark計(jì)算框架归薛,對(duì)矢量點(diǎn)進(jìn)行高斯核密度估計(jì)。
單機(jī)環(huán)境測(cè)試匪蝙,采用不同的線程數(shù)對(duì)程序進(jìn)行計(jì)算主籍,模擬并行計(jì)算的結(jié)果比較計(jì)算結(jié)果。使用Geotrellis.Spark框架下的瓦片處理技術(shù)將點(diǎn)分配到不同的瓦片Tile骗污,并將其導(dǎo)入RDDtile中崇猫,進(jìn)行并行計(jì)算。
初始化Sparkconf設(shè)置setMaster參數(shù)為L(zhǎng)ocal[線程數(shù)]進(jìn)行試驗(yàn)需忿,計(jì)算其核心步驟的時(shí)間诅炉,結(jié)果如下:
線程數(shù)????瓦片切割????使用時(shí)間(ms)
1????????????7*4????????????64455
2????????????7*4????????????46455
4????????????7*4????????????35583
基本可以說(shuō)明在數(shù)據(jù)量較大的情況下,并行計(jì)算的效率要較高一些屋厘。但是線程數(shù)的增加使得并行計(jì)算的通行網(wǎng)絡(luò)成本與時(shí)間網(wǎng)絡(luò)成本增加涕烧,所以不同的任務(wù)有最高值,需要配置服務(wù)器汗洒,使用更多數(shù)據(jù)通過更多的線程數(shù)來(lái)進(jìn)行進(jìn)一步計(jì)算得到议纯。