《大數(shù)據(jù)技術(shù)實(shí)戰(zhàn)案例教程》課件實(shí)驗(yàn)指導(dǎo)書-實(shí)驗(yàn)8Spark集群部署和基本編程_第1頁(yè)
《大數(shù)據(jù)技術(shù)實(shí)戰(zhàn)案例教程》課件實(shí)驗(yàn)指導(dǎo)書-實(shí)驗(yàn)8Spark集群部署和基本編程_第2頁(yè)
《大數(shù)據(jù)技術(shù)實(shí)戰(zhàn)案例教程》課件實(shí)驗(yàn)指導(dǎo)書-實(shí)驗(yàn)8Spark集群部署和基本編程_第3頁(yè)
《大數(shù)據(jù)技術(shù)實(shí)戰(zhàn)案例教程》課件實(shí)驗(yàn)指導(dǎo)書-實(shí)驗(yàn)8Spark集群部署和基本編程_第4頁(yè)
《大數(shù)據(jù)技術(shù)實(shí)戰(zhàn)案例教程》課件實(shí)驗(yàn)指導(dǎo)書-實(shí)驗(yàn)8Spark集群部署和基本編程_第5頁(yè)
已閱讀5頁(yè),還剩25頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

《大數(shù)據(jù)技術(shù)實(shí)戰(zhàn)案例教程》實(shí)驗(yàn)指導(dǎo)書實(shí)驗(yàn)8Spark集群部署和基本編程編寫者:徐魯輝實(shí)驗(yàn)8Spark集群部署和基本編程8.1實(shí)驗(yàn)?zāi)康?.理解Spark運(yùn)行架構(gòu)。2.理解RDD的設(shè)計(jì)思想,掌握RDD的創(chuàng)建和操作。3.理解Spark部署要點(diǎn)包括運(yùn)行環(huán)境、運(yùn)行模式、配置文件spark-env.sh。4.熟練掌握在Linux環(huán)境下部署Spark集群,掌握交互式編程pyspark、運(yùn)行獨(dú)立應(yīng)用程序spark-submit的使用方法,使用Python、Java或Scala進(jìn)行RDD編程、SparkStreaming編程,實(shí)現(xiàn)海量數(shù)據(jù)的離線處理和實(shí)時(shí)處理。8.2實(shí)驗(yàn)環(huán)境本實(shí)驗(yàn)所需的軟件環(huán)境包括全分布模式Hadoop集群、Python安裝包、Spark安裝包。8.3實(shí)驗(yàn)內(nèi)容1.規(guī)劃Spark集群。2.部署Spark集群。3.啟動(dòng)Spark集群。4.驗(yàn)證Spark集群。5.使用SparkShell命令“pyspark”進(jìn)行交互式編程,使用Python語(yǔ)言編寫代碼,實(shí)現(xiàn)對(duì)HDFS文件的英文詞頻統(tǒng)計(jì),并按詞頻降序排序,最后輸出結(jié)果,要求通過(guò)終端和SparkWebUI觀察該應(yīng)用程序的運(yùn)行過(guò)程。6.使用Python語(yǔ)言編寫SparkStreaming獨(dú)立應(yīng)用程序,將Flume作為SparkStreaming輸入源,實(shí)現(xiàn)對(duì)Flume消息的實(shí)時(shí)詞頻統(tǒng)計(jì)。要求從終端上不斷給FlumeSource(netcat類型)發(fā)送各種消息,F(xiàn)lume把消息匯集到Sink(avro類型),由Sink把消息推送給SparkStreaming。7.關(guān)閉Spark集群。8.4實(shí)驗(yàn)原理8.4.1初識(shí)SparkSpark是基于內(nèi)存計(jì)算的大數(shù)據(jù)并行計(jì)算框架。Spark基于內(nèi)存計(jì)算的特性,減少了迭代計(jì)算I/O開銷,提高了在大數(shù)據(jù)環(huán)境下數(shù)據(jù)處理的實(shí)時(shí)性,同時(shí)保證了高容錯(cuò)性、高可伸縮性,允許用戶將Spark部署在大量的廉價(jià)硬件之上形成集群,提高了并行計(jì)算能力。Spark于2009年誕生于美國(guó)加州大學(xué)伯克利分校AMP實(shí)驗(yàn)室,AMP實(shí)驗(yàn)室的研究人員發(fā)現(xiàn)在機(jī)器學(xué)習(xí)迭代算法場(chǎng)景下,HadoopMapReduce表現(xiàn)得效率低下,為了迭代算法和交互式查詢兩種典型的場(chǎng)景,MateiZaharia和合作伙伴開發(fā)了Spark系統(tǒng)的最初版本。2009年Spark論文發(fā)布,2010年Spark正式開源,2013年伯克利將其捐贈(zèng)給Apache基金會(huì),2014年成為Apache基金會(huì)的頂級(jí)項(xiàng)目,目前已廣泛應(yīng)用于工業(yè)界。Spark于2014年打破了Hadoop保持的基準(zhǔn)排序紀(jì)錄,它使用206個(gè)節(jié)點(diǎn)在23分鐘里完成了100TB數(shù)據(jù)的排序,而Hadoop使用2000個(gè)節(jié)點(diǎn)在72分鐘里完成同樣數(shù)據(jù)的排序。也就是說(shuō),Spark僅使用了1/10Hadoop的計(jì)算資源,獲得了Hadoop的3倍速度。新紀(jì)錄的誕生,使得Spark獲得多方追捧,也表明了Spark可以作為一個(gè)更加快速、高效的大數(shù)據(jù)計(jì)算平臺(tái)。在實(shí)際應(yīng)用型項(xiàng)目中,絕大多數(shù)公司都會(huì)選擇Spark。Spark正以其結(jié)構(gòu)一體化、功能多元化的優(yōu)勢(shì),逐漸成為當(dāng)今大數(shù)據(jù)領(lǐng)域最熱門的大數(shù)據(jù)計(jì)算平臺(tái)。盡管Spark相對(duì)于Hadoop而言具有較大優(yōu)勢(shì),但Spark并不能完全替代Hadoop,Spark主要用于替代Hadoop中的MapReduce計(jì)算模型,Hadoop生態(tài)系統(tǒng)中的HDFS和YARN仍是許多大數(shù)據(jù)體系的核心架構(gòu)。Spark已經(jīng)很好地融入了Hadoop生態(tài)圈,并成為其中的重要一員,它可以借助YARN實(shí)現(xiàn)資源調(diào)度管理,借助HDFS實(shí)現(xiàn)分布式存儲(chǔ)。8.4.2Spark生態(tài)系統(tǒng)目前,Spark生態(tài)系統(tǒng)主要包括SparkCore和基于SparkCore的獨(dú)立組件SparkSQL、SparkStreaming、MLlib、GraphX,使得開發(fā)者可以在同一個(gè)Spark體系中方便地組合使用這些庫(kù),其生態(tài)系統(tǒng)如圖8-1所示。SparkSparkSQLSparkStreamingMLlib(machinelearning)GraphX(graph)ApacheSparkHDFSTachyonYARNMesos應(yīng)用接口層計(jì)算引擎層集群資源管理層存儲(chǔ)層StandaloneKubernetes圖8-1Spark生態(tài)系統(tǒng)SparkCore是Spark的核心基礎(chǔ),包含了彈性分布式數(shù)據(jù)集(RDD)等核心組件。但需要注意的是,SparkCore是離線計(jì)算的,這點(diǎn)類似于MapReduce的處理過(guò)程。而SparkStreaming則是將連續(xù)的數(shù)據(jù)轉(zhuǎn)換為不連續(xù)的離散流(DStream),從而實(shí)現(xiàn)了快速的數(shù)據(jù)處理功能。SparkSQL則用于簡(jiǎn)化Spark庫(kù),就好比可以使用Hive簡(jiǎn)化MapReduce一樣,我們也可以使用SparkSQL快速實(shí)現(xiàn)Spark開發(fā),具體地講,SparkSQL可以將DataFrame轉(zhuǎn)為Spark處理時(shí)的RDD,然后運(yùn)行RDD程序。MLlib是Spark上的一個(gè)機(jī)器學(xué)習(xí)庫(kù),其設(shè)計(jì)目標(biāo)是開發(fā)一套高可用、高擴(kuò)展的并行機(jī)器學(xué)習(xí)庫(kù),以方便用戶直接調(diào)用。GraphX是Spark上一個(gè)圖處理和圖并行化計(jì)算的組件,圖計(jì)算主要應(yīng)用于社交網(wǎng)絡(luò)分析等場(chǎng)景。需要說(shuō)明的是,無(wú)論是SparkSQL、SparkStreaming、MLlib還是GraphX,都可以使用SparkCore的API處理問(wèn)題,它們的方法幾乎是通用的,處理的數(shù)據(jù)也可以共享,不同應(yīng)用之間的數(shù)據(jù)可以無(wú)縫集成。8.4.3Spark運(yùn)行架構(gòu)SparkCore是一個(gè)計(jì)算引擎,當(dāng)提及Spark運(yùn)行架構(gòu)時(shí),就是指SparkCore的運(yùn)行架構(gòu)。整體來(lái)說(shuō),它采用了標(biāo)準(zhǔn)的Master/Slave架構(gòu),如圖8-2所示,其展示了一個(gè)Spark應(yīng)用程序運(yùn)行時(shí)的基本架構(gòu)。圖8-2中的Driver為Master,負(fù)責(zé)管理整個(gè)集群中作業(yè)任務(wù)調(diào)度,Executor為Slave,負(fù)責(zé)執(zhí)行任務(wù)。Spark運(yùn)行架構(gòu)包括集群資源管理器(ClusterManager)、運(yùn)行作業(yè)任務(wù)的工作節(jié)點(diǎn)(WorkerNode)、每個(gè)應(yīng)用的任務(wù)控制節(jié)點(diǎn)(Driver)和每個(gè)工作節(jié)點(diǎn)上負(fù)責(zé)具體任務(wù)的執(zhí)行進(jìn)程(Executor)。其中,集群資源管理器可以是Spark自帶的資源管理器,也可以是YARN或Mesos等第三方資源管理框架。DriverDriverSparkContextClusterManagerWorkerNodeExcutorTaskTaskCacheWorkerNodeExcutorTaskTaskCache圖8-2Spark運(yùn)行架構(gòu)與HadoopMapReduce計(jì)算框架相比,Spark所采用的Executor有兩個(gè)優(yōu)點(diǎn):一是利用多線程來(lái)執(zhí)行具體的任務(wù)(HadoopMapReduce采用的是進(jìn)程模型),減少任務(wù)的啟動(dòng)開銷;二是Executor中有一個(gè)BlockManager存儲(chǔ)模塊,會(huì)將內(nèi)存和磁盤共同作為存儲(chǔ)設(shè)備,當(dāng)需要多輪迭代計(jì)算時(shí),可以將中間結(jié)果存儲(chǔ)到這個(gè)存儲(chǔ)模塊里,下次需要時(shí),就可以直接讀該存儲(chǔ)模塊里的數(shù)據(jù),而不需要讀寫到HDFS等文件系統(tǒng)里,因而有效減少了I/O開銷;或者在交互式查詢場(chǎng)景下,預(yù)先將表緩存到該存儲(chǔ)系統(tǒng)上,從而可以提高讀寫I/O性能。8.4.4RDD的設(shè)計(jì)與操作1.RDD簡(jiǎn)介許多迭代式算法(比如機(jī)器學(xué)習(xí)、圖算法等)和交互式數(shù)據(jù)挖掘工具的共同之處是:不同計(jì)算階段之間會(huì)重用中間結(jié)果。MapReduce框架是把中間結(jié)果寫入到HDFS中,帶來(lái)了大量的數(shù)據(jù)復(fù)制、磁盤I/O和序列化開銷。RDD就是為了滿足這種需求而出現(xiàn)的,它提供了一個(gè)抽象的數(shù)據(jù)架構(gòu),不必?fù)?dān)心底層數(shù)據(jù)的分布式特性,只需將具體的應(yīng)用邏輯表達(dá)為一系列轉(zhuǎn)換處理,不同RDD之間的轉(zhuǎn)換操作形成依賴關(guān)系,可以實(shí)現(xiàn)管道化,避免中間數(shù)據(jù)存儲(chǔ)。Spark的核心數(shù)據(jù)模型是RDD,一個(gè)RDD就是一個(gè)分布式對(duì)象集合,本質(zhì)上是一個(gè)只讀的分區(qū)記錄集合,每個(gè)RDD可分成多個(gè)分區(qū),每個(gè)分區(qū)就是一個(gè)數(shù)據(jù)集片段,并且一個(gè)RDD的不同分區(qū)可以被保存到集群中不同的節(jié)點(diǎn)上,從而可以在集群中的不同節(jié)點(diǎn)上進(jìn)行并行計(jì)算。Spark將常用的大數(shù)據(jù)操作都轉(zhuǎn)化稱為RDD的子類(RDD是抽象類,具體操作由各子類實(shí)現(xiàn)如MappedRDD、ShuffledRDD),可以從以下三個(gè)方面來(lái)理解RDD。(1)數(shù)據(jù)集:抽象地說(shuō),RDD是一種元素集合。單從邏輯上的表現(xiàn)來(lái)看,RDD是一個(gè)數(shù)據(jù)集合,可以簡(jiǎn)單地將RDD理解為Java中的List集合或數(shù)據(jù)庫(kù)中的一張表。(2)分布式:RDD是可以分區(qū)的,每個(gè)分區(qū)可以分布在集群中不同的節(jié)點(diǎn)上,從而可以對(duì)RDD中的數(shù)據(jù)進(jìn)行并行操作。(3)彈性:RDD默認(rèn)情況下存放在內(nèi)存中,但是當(dāng)內(nèi)存資源不足時(shí)Spark會(huì)自動(dòng)將RDD數(shù)據(jù)寫入磁盤進(jìn)行保存。對(duì)于用戶來(lái)說(shuō),不必知道RDD的數(shù)據(jù)是存儲(chǔ)在內(nèi)存還是磁盤,因?yàn)檫@些都有Spark底層來(lái)完成,用戶只需針對(duì)RDD來(lái)進(jìn)行計(jì)算和處理。RDD自動(dòng)進(jìn)行內(nèi)存和磁盤之間權(quán)衡和切換的機(jī)制是基于RDD彈性的特點(diǎn)。2.RDD數(shù)據(jù)存儲(chǔ)模型通常RDD很大,會(huì)被劃分成很多個(gè)分區(qū),分別保存在集群中的不同節(jié)點(diǎn)上,分區(qū)是邏輯概念。在物理上,RDD對(duì)象實(shí)質(zhì)上是一個(gè)元數(shù)據(jù)結(jié)構(gòu),存儲(chǔ)這Block、Node等的映射關(guān)系以及其它元數(shù)據(jù)信息。一個(gè)RDD就是一組分區(qū),在物理數(shù)據(jù)存儲(chǔ)上,RDD的每個(gè)分區(qū)對(duì)應(yīng)的就是一個(gè)Block,Block可以存儲(chǔ)在內(nèi)存中,當(dāng)內(nèi)存不足時(shí)存儲(chǔ)到磁盤中。3.RDD創(chuàng)建Spark提供了兩種創(chuàng)建RDD的方式:從文件系統(tǒng)中加載數(shù)據(jù)創(chuàng)建RDD、通過(guò)并行集合創(chuàng)建RDD。1)從文件系統(tǒng)中加載數(shù)據(jù)創(chuàng)建RDDSpark采用textFile()方法來(lái)從文件系統(tǒng)中加載數(shù)據(jù)創(chuàng)建RDD。該方法把文件的URI作為參數(shù),這個(gè)URI可以是:本地文件系統(tǒng)的地址,或者是分布式文件系統(tǒng)HDFS的地址,或者是AmazonS3的地址等。例如,在pyspark交互式環(huán)境中,從本地文件系統(tǒng)中加載數(shù)據(jù)創(chuàng)建RDD的代碼如下所示。>>>lines=sc.textFile("file:///usr/local/spark-2.4.7-bin-without-hadoop-scala-2.12/HelloData/file1.txt")例如,在pyspark交互式環(huán)境中,從分布式文件系統(tǒng)HDFS中加載數(shù)據(jù)創(chuàng)建RDD的代碼如下所示。>>>lines=sc.textFile("hdfs://30:9000/InputData/file1.txt")2)通過(guò)并行集合(列表)創(chuàng)建RDD可以調(diào)用SparkContext的parallelize()方法,在Driver中一個(gè)已經(jīng)存在的集合(列表)上創(chuàng)建。例如,在pyspark交互式環(huán)境中,通過(guò)并行集合(列表)創(chuàng)建RDD的代碼如下所示。>>>array=[1,2,3,4,5]>>>rdd=sc.parallelize(array)4.RDD操作RDD主要支持兩種操作:轉(zhuǎn)換操作(Transformation)和行動(dòng)操作(Action)。RDD的轉(zhuǎn)換操作是返回一個(gè)新的RDD的操作,而行動(dòng)操作則是向Driver返回結(jié)果或把結(jié)果寫入外部系統(tǒng)的操作,會(huì)觸發(fā)實(shí)際的計(jì)算。RDD典型執(zhí)行過(guò)程為:首先RDD讀入外部數(shù)據(jù)源進(jìn)行創(chuàng)建;其次RDD經(jīng)過(guò)一系列的轉(zhuǎn)換操作,每一次都會(huì)產(chǎn)生不同的RDD,供給下一個(gè)轉(zhuǎn)換操作使用;最后一個(gè)RDD經(jīng)過(guò)行動(dòng)操作進(jìn)行轉(zhuǎn)換,并輸出到外部數(shù)據(jù)源。這一系列處理稱為一個(gè)Lineage(血緣關(guān)系),即DAG拓?fù)渑判虻慕Y(jié)果。其優(yōu)點(diǎn)為惰性調(diào)用、管道化、避免同步等待、不需要保存中間結(jié)果、每次操作變得簡(jiǎn)單。1)轉(zhuǎn)換操作對(duì)于RDD而言,每一次轉(zhuǎn)換操作都會(huì)產(chǎn)生不同的RDD,供給下一個(gè)“轉(zhuǎn)換”使用。轉(zhuǎn)換得到的RDD是惰性求值的,也就是說(shuō),整個(gè)轉(zhuǎn)換過(guò)程只是記錄了轉(zhuǎn)換的軌跡,并不會(huì)發(fā)生真正的計(jì)算,只有遇到行動(dòng)操作時(shí),才會(huì)發(fā)生真正的計(jì)算,開始從血緣關(guān)系源頭進(jìn)行物理的轉(zhuǎn)換操作。常用的RDD轉(zhuǎn)換操作API如表8-1所示。表8-1常用的RDD轉(zhuǎn)換操作API操作含義filter(func)篩選出滿足函數(shù)func的元素,并返回一個(gè)新的數(shù)據(jù)集map(func)將每個(gè)元素傳遞到函數(shù)func中,并將結(jié)果返回為一個(gè)新的數(shù)據(jù)集flatMap(func)與map()相似,但每個(gè)輸入元素都可以映射到0或多個(gè)輸出結(jié)果groupByKey()應(yīng)用于(K,V)鍵值對(duì)的數(shù)據(jù)集時(shí),返回一個(gè)新的(K,Iterable)形式的數(shù)據(jù)集reduceByKey(func)應(yīng)用于(K,V)鍵值對(duì)的數(shù)據(jù)集時(shí),返回一個(gè)新的(K,V)形式的數(shù)據(jù)集,其中每個(gè)值是將每個(gè)key傳遞到函數(shù)func中進(jìn)行聚合后的結(jié)果2)行動(dòng)操作行動(dòng)操作是真正觸發(fā)計(jì)算的操作。Spark程序執(zhí)行到行動(dòng)操作時(shí),才會(huì)執(zhí)行真正的計(jì)算,從文件中加載數(shù)據(jù),完成一次又一次轉(zhuǎn)換操作,最終完成行動(dòng)操作得到結(jié)果。常用的RDD行動(dòng)操作API如表8-2所示。表8-2常用的RDD行動(dòng)操作API操作含義count()返回?cái)?shù)據(jù)集中的元素個(gè)數(shù)collect()以數(shù)組的形式返回?cái)?shù)據(jù)集中的所有元素first()返回?cái)?shù)據(jù)集中的第一個(gè)元素take(n)以數(shù)組的形式返回?cái)?shù)據(jù)集中的前n個(gè)元素reduce(func)通過(guò)函數(shù)func(輸入兩個(gè)參數(shù)并返回一個(gè)值)聚合數(shù)據(jù)集中的元素foreach(func)將數(shù)據(jù)集中的每個(gè)元素傳遞到函數(shù)func中運(yùn)行例如,上文中的語(yǔ)句“pairRDD.foreach(print)”的foreach()方法就是一個(gè)行動(dòng)操作,其功能是打印輸出RDD對(duì)象pairRDD中的每一個(gè)元素。8.4.5Spark部署要點(diǎn)1.Spark運(yùn)行環(huán)境部署與運(yùn)行Spark所需要的系統(tǒng)環(huán)境,主要包括操作系統(tǒng)、Java環(huán)境和SSH三部分。1)操作系統(tǒng)Spark支持Windows和類UNIX(例如Linux、MacOS)操作系統(tǒng)。編者采用的操作系統(tǒng)為L(zhǎng)inux發(fā)行版CentOS7。2)Java環(huán)境Spark采用Scala語(yǔ)言編寫,而Scala語(yǔ)言是基于Java的一個(gè)腳本化語(yǔ)言,運(yùn)行在JVM上,因此Spark運(yùn)行需要Java環(huán)境的支持。Spark2.4.7運(yùn)行在Java8+、Python2.7+/3.4+和R3.5+環(huán)境上。對(duì)于ScalaAPI,Spark2.4.7使用Scala2.12。編者采用的Java為OracleJDK1.8。需要說(shuō)明的是,Spark2.2.0及以后版本不再支持Java7、Python2.6和Hadoop2.6.5之前版本。Spark2.3.0不再支持Scala2.10,Spark3.0不再支持Scala2.11。3)SSHSpark集群若想運(yùn)行,其運(yùn)行平臺(tái)Linux上必須安裝SSH,且sshd服務(wù)必須運(yùn)行,只有這樣,才能使Spark集群中的主節(jié)點(diǎn)與集群中所有節(jié)點(diǎn)建立通信。本章選用的CentOS7自帶有SSH。另外,若Spark采用HDFS存儲(chǔ)數(shù)據(jù),或采用YARN管理集群資源,則還需要安裝Hadoop。2.Spark運(yùn)行模式目前,Spark支持兩種運(yùn)行模式:本地模式和集群模式。其中,本地模式常用于本地開發(fā)測(cè)試,包括Local、Local[*]、Local[K];集群模式常用于企業(yè)的實(shí)際生產(chǎn)環(huán)境,根據(jù)集群資源管理器的類型主要有SparkStandalone模式、SparkonYARN模式、SparkonMesos模式、SparkonKubernetes模式等。在部署Spark集群時(shí),根據(jù)集群資源管理器的類型,可以將Spark部署分為Standalone模式和ThirdPlatform模式;根據(jù)部署工具的不同,可以將Spark部署分為手工部署和工具部署,具體部署方式如表8-3所示。表8-3Spark集群部署模式部署工具集群資源管理器手工部署模式工具部署模式AmbariClouderaManagerStandalone手工部署SparkStandaloneAmbari部署SparkStandaloneClouderaManager部署SparkStandaloneThirdPlatform模式HadoopYARN手工部署SparkonYARNAmbari部署SparkonYARNClouderaManager部署SparkonYARNApacheMesos手工部署SparkonMesosAmbari部署SparkonMesosClouderaManager部署SparkonMesosKubernetes手工部署SparkonKubernetesAmbari部署SparkonKubernetesClouderaManager部署SparkonKubernetes這里,我們需要說(shuō)明一下SparkonYARN集群模式(YARNCluster)和SparkonYARN客戶端模式(YARNClient)的區(qū)別。我們知道,當(dāng)在YARN上運(yùn)行Spark作業(yè)時(shí),每個(gè)SparkExecutor作為一個(gè)YARN容器(Container)運(yùn)行,Spark可以使得多個(gè)Tasks在同一個(gè)容器(Container)里運(yùn)行。YARNCluster和YARNClient模式的區(qū)別其實(shí)就在于ApplicationMaster進(jìn)程的區(qū)別,在YARNCluster模式下,Driver運(yùn)行在AM(ApplicationMaster)中,它負(fù)責(zé)向YARN申請(qǐng)資源,并監(jiān)督作業(yè)的運(yùn)行狀況,當(dāng)用戶提交了作業(yè)之后,就可以關(guān)掉Client,作業(yè)會(huì)繼續(xù)在YARN上運(yùn)行。然而YARNClient模式不適合運(yùn)行交互類型的作業(yè),在YARNClient模式下,ApplicationMaster僅僅向YARN請(qǐng)求Executor,Client會(huì)和請(qǐng)求的Container通信一起來(lái)調(diào)度它們工作,也就是說(shuō)Client不能離開。3.Spark配置文件Spark配置文件數(shù)量不多,都存放在${SPARK_HOME}/conf,具體的配置文件如圖8-3所示。圖8-3Spark配置文件模板列表圖中顯示的所有文件均是Spark配置文件的模板,Spark配置文件中最重要的是slaves和spark-env.sh。其中,配置文件slaves用于指定Spark集群的從節(jié)點(diǎn),配置簡(jiǎn)單;環(huán)境配置文件spark-env.sh用于指定Spark運(yùn)行時(shí)的各種參數(shù),主要包括Java安裝路徑JAVA_HOME、Spark安裝路徑SPARK_HOME等,部分參數(shù)及其說(shuō)明如表8-4所示,但參數(shù)較多,具體參數(shù)及其說(shuō)明讀者可以查閱spark-env.sh.template文件。表8-4spark-env.sh配置參數(shù)(部分)參數(shù)名說(shuō)明JAVA_HOME指定Java安裝路徑SPARK_HOME指定Spark安裝路徑SPARK_CONF_DIR指定Spark集群配置文件位置,默認(rèn)為${SPARK_HOME}/confSPARK_LOG_DIR指定Spark日志文件的保存位置,默認(rèn)為${SPARK_HOME}/logsSPARK_PID_DIR指定Spark守護(hù)進(jìn)程號(hào)的保存位置,默認(rèn)為/tmpSPARK_MASTER_HOST指定Spark集群主節(jié)點(diǎn)的主機(jī)名或IP地址SPARK_WORKER_CORES指定作業(yè)可用的CPU內(nèi)核數(shù)量SPARK_WORKER_MEMORY指定作業(yè)可使用的內(nèi)存容量HADOOP_CONF_DIR指定Hadoop集群配置文件位置YARN_CONF_DIR當(dāng)使用YARN作為集群資源管理器時(shí),指定YARN集群配置文件位置8.4.6Spark接口Spark接口指的是用戶取得Spark服務(wù)的途徑,針對(duì)不同的上層應(yīng)用,Spark框架提供了7類統(tǒng)一訪問(wèn)接口。1.SparkWebUISparkWebUI主要面向管理員,從該頁(yè)面上,管理員可以看到正在執(zhí)行的和已完成的所有Spark應(yīng)用程序執(zhí)行過(guò)程中的統(tǒng)計(jì)信息,該頁(yè)面只支持讀,不支持寫操作。SparkWebUI地址默認(rèn)為http://MasterIP:8080,效果如圖8-4所示。圖8-4SparkWebUI效果圖2.SparkShellSparkShell主要針對(duì)Spark程序員和Spark數(shù)據(jù)分析師的,通過(guò)Shell接口,程序員能夠向Spark集群提交Spark應(yīng)用程序、查看正在運(yùn)行的Spark應(yīng)用程序;數(shù)據(jù)分析師可以通過(guò)Shell接口以交互式方式對(duì)數(shù)據(jù)進(jìn)行分析。Shell接口是Spark功能的實(shí)際體現(xiàn),用戶可以使用SparkShell命令完成集群管理和任務(wù)管理。1)集群管理集群管理的命令位于“sbin”目錄下,可以通過(guò)此類命令啟動(dòng)或關(guān)閉集群中的某服務(wù)或者整個(gè)集群,“sbin”目錄下的所有集群管理命令如圖8-5所示。圖8-5SparkShell集群管理命令在此,編者僅選擇幾個(gè)集群管理Shell命令進(jìn)行功能說(shuō)明,具體如表8-5所示。表8-5SparkShell集群管理命令功能說(shuō)明(部分)集群管理Shell命令功能start-all.sh啟動(dòng)Spark集群,注意該命令在Spark主節(jié)點(diǎn)機(jī)器上執(zhí)行,且命令執(zhí)行的前提條件是主節(jié)點(diǎn)到本身和其他從節(jié)點(diǎn)ssh時(shí)皆無(wú)需密鑰stop-all.sh關(guān)閉Spark集群start-master.sh在Spark主節(jié)點(diǎn)機(jī)器上執(zhí)行,啟動(dòng)Master進(jìn)程start-slaves.sh在Spark主節(jié)點(diǎn)機(jī)器上執(zhí)行,啟動(dòng)所有Worker進(jìn)程start-slave.sh在Spark所有從節(jié)點(diǎn)機(jī)器上執(zhí)行,啟動(dòng)Worker進(jìn)程stop-master.sh在Spark主節(jié)點(diǎn)機(jī)器上執(zhí)行,關(guān)閉Master進(jìn)程stop-slaves.sh在Spark主節(jié)點(diǎn)機(jī)器上執(zhí)行,關(guān)閉所有Worker進(jìn)程stop-slave.sh在Spark所有從節(jié)點(diǎn)機(jī)器上執(zhí)行,關(guān)閉Worker進(jìn)程2)任務(wù)管理任務(wù)管理的命令位于“bin”目錄下,可以通過(guò)此類命令向Spark集群提交、管理Spark應(yīng)用程序,“bin”目錄下的所有任務(wù)管理命令如圖8-6所示,其中,“cmd”后綴的文件為Windows平臺(tái)腳本。圖8-6SparkShell任務(wù)管理命令在此,編者也僅選擇幾個(gè)任務(wù)管理Shell命令進(jìn)行功能說(shuō)明,具體如表8-6所示。表8-6SparkShell任務(wù)管理命令功能說(shuō)明(部分)任務(wù)管理Shell命令功能spark-submit向Spark集群提交Spark應(yīng)用程序pyspark以交互式方式編寫并執(zhí)行Spark應(yīng)用程序,且書寫語(yǔ)法為PythonsparkR以交互式方式編寫并執(zhí)行Spark應(yīng)用程序,且書寫語(yǔ)法為Rspark-shell以交互式方式編寫并執(zhí)行Spark應(yīng)用程序,且書寫語(yǔ)法為Scalaspark-sql以交互式方式編寫并執(zhí)行SparkSQL,且書寫語(yǔ)法為類SQLrun-example運(yùn)行Spark示例程序,實(shí)際上,該腳本內(nèi)部調(diào)用了spark-submit,讀者不必掌握該命令關(guān)于SparkShell任務(wù)管理命令的具體用法編者僅列出“spark-submit”和“pyspark”。其中,“spark-submit”命令幫助完整文字版如下所示。$./bin/spark-submit--helpUsage:spark-submit[options]<appjar|pythonfile|Rfile>[apparguments]Usage:spark-submit--kill[submissionID]--master[spark://...]Usage:spark-submit--status[submissionID]--master[spark://...]Usage:spark-submitrun-example[options]example-class[exampleargs]Options:--masterMASTER_URL spark://host:port,mesos://host:port,yarn, k8s://https://host:port,orlocal(Default:local[*]).--deploy-modeDEPLOY_MODE Whethertolaunchthedriverprogramlocally("client")or ononeoftheworkermachinesinsidethecluster("cluster") (Default:client).--classCLASS_NAME Yourapplication'smainclass(forJava/Scalaapps).--nameNAME Anameofyourapplication.--jarsJARS Comma-separatedlistofjarstoincludeonthedriver andexecutorclasspaths.--packages Comma-separatedlistofmavencoordinatesofjarstoinclude onthedriverandexecutorclasspaths.Willsearchthelocal mavenrepo,thenmavencentralandanyadditionalremote repositoriesgivenby--repositories.Theformatforthe coordinatesshouldbegroupId:artifactId:version.--exclude-packages Comma-separatedlistofgroupId:artifactId,toexcludewhile resolvingthedependenciesprovidedin--packagestoavoid dependencyconflicts.--repositories Comma-separatedlistofadditionalremoterepositoriesto searchforthemavencoordinatesgivenwith--packages.--py-filesPY_FILES Comma-separatedlistof.zip,.egg,or.pyfilestoplace onthePYTHONPATHforPythonapps.--filesFILES Comma-separatedlistoffilestobeplacedintheworking directoryofeachexecutor.Filepathsofthesefiles inexecutorscanbeaccessedviaSparkFiles.get(fileName).--conf,-cPROP=VALUE ArbitrarySparkconfigurationproperty.--properties-fileFILE Pathtoafilefromwhichtoloadextraproperties.Ifnot specified,thiswilllookforconf/spark-defaults.conf.--driver-memoryMEM Memoryfordriver(e.g.1000M,2G)(Default:1024M).--driver-java-options ExtraJavaoptionstopasstothedriver.--driver-library-path Extralibrarypathentriestopasstothedriver.--driver-class-path Extraclasspathentriestopasstothedriver.Notethat jarsaddedwith--jarsareautomaticallyincludedinthe classpath.--executor-memoryMEM Memoryperexecutor(e.g.1000M,2G)(Default:1G).--proxy-userNAME Usertoimpersonatewhensubmittingtheapplication. Thisargumentdoesnotworkwith--principal/--keytab.--help,-h Showthishelpmessageandexit.--verbose,-v Printadditionaldebugoutput.--version, PrinttheversionofcurrentSpark.Clusterdeploymodeonly:--driver-coresNUM Numberofcoresusedbythedriver,onlyinclustermode (Default:1).SparkstandaloneorMesoswithclusterdeploymodeonly:--supervise Ifgiven,restartsthedriveronfailure.--killSUBMISSION_ID Ifgiven,killsthedriverspecified.--statusSUBMISSION_ID Ifgiven,requeststhestatusofthedriverspecified.SparkstandaloneandMesosonly:--total-executor-coresNUM Totalcoresforallexecutors.SparkstandaloneandYARNonly:--executor-coresNUM Numberofcoresperexecutor.(Default:1inYARNmode, orallavailablecoresontheworkerinstandalonemode)YARN-only:--queueQUEUE_NAME TheYARNqueuetosubmitto(Default:"default").--num-executorsNUM Numberofexecutorstolaunch(Default:2). Ifdynamicallocationisenabled,theinitialnumberof executorswillbeatleastNUM.--archivesARCHIVES Commaseparatedlistofarchivestobeextractedintothe workingdirectoryofeachexecutor.--principalPRINCIPAL PrincipaltobeusedtologintoKDC,whilerunningon secureHDFS.--keytabKEYTAB Thefullpathtothefilethatcontainsthekeytabforthe principalspecifiedabove.Thiskeytabwillbecopiedto thenoderunningtheApplicationMasterviatheSecure DistributedCache,forrenewingtheloginticketsandthe delegationtokensperiodically.Spark程序由誰(shuí)來(lái)調(diào)度執(zhí)行,是由Spark程序提交時(shí)MASTER_URL值決定的。上述“spark-submit”命令中,選項(xiàng)“--masterMASTER_URL”決定了集群資源調(diào)度方式:如果該選項(xiàng)的值以spark://開頭,則使用Spark自帶的集群資源管理器來(lái)調(diào)度;如果其值是yarn,則是使用YARN來(lái)調(diào)度。關(guān)于選項(xiàng)--master的具體取值如下所示:--masterMASTER_URL spark://host:port,mesos://host:port,yarn, k8s://https://host:port,orlocal(Default:local[*]).<MASTER_URL>參數(shù)值含義如表8-7所示,其中l(wèi)ocal[*]為默認(rèn)值。表8-7<MASTER_URL>參數(shù)值含義<MASTER_URL>參數(shù)值含義local使用1個(gè)Worker線程本地化運(yùn)行Spark(完全不并行)local[*]使用與邏輯CPU個(gè)數(shù)相同數(shù)量的線程來(lái)本地化運(yùn)行Spark(邏輯CPU個(gè)數(shù)=物理CPU個(gè)數(shù)*每個(gè)物理CPU包含的CPU核數(shù))local[K]使用K個(gè)Worker線程本地化運(yùn)行Spark(理想情況下,K應(yīng)該根據(jù)運(yùn)行機(jī)器的CPU核數(shù)設(shè)定)spark://HOST:PORTSpark采用Standalone集群模式,連接到指定的Spark集群,默認(rèn)端口是7077yarn-clientSpark采用YARN集群模式,以客戶端模式連接YARN集群,集群的位置可以在HADOOP_CONF_DIR環(huán)境變量中找到。用戶提交作業(yè)后,不能關(guān)掉Client,DriverProgram駐留在Client中,適合運(yùn)行交互類型作業(yè),常用于開發(fā)測(cè)試yarn-clusterSpark采用YARN集群模式,以集群模式連接YARN集群,集群的位置可以在HADOOP_CONF_DIR環(huán)境變量中找到。用戶提交作業(yè)后,可以關(guān)掉Client,作業(yè)繼續(xù)在YARN上執(zhí)行,不適合運(yùn)行交互類型作業(yè),常用于企業(yè)生產(chǎn)環(huán)境mesos://HOST:PORTSpark采用Mesos集群模式,連接到指定的Mesos集群,默認(rèn)接口是5050讀者也可以通過(guò)“pyspark--help”命令來(lái)查看“pyspark”命令的幫助文檔,其完整文字版如下所示,可以看出,其選項(xiàng)參數(shù)多數(shù)均與“spark-submit”相同。$./bin/pyspark--helpUsage:./bin/pyspark[options]Options:--masterMASTER_URL spark://host:port,mesos://host:port,yarn, k8s://https://host:port,orlocal(Default:local[*]).--deploy-modeDEPLOY_MODE Whethertolaunchthedriverprogramlocally("client")or ononeoftheworkermachinesinsidethecluster("cluster") (Default:client).--classCLASS_NAME Yourapplication'smainclass(forJava/Scalaapps).--nameNAME Anameofyourapplication.--jarsJARS Comma-separatedlistofjarstoincludeonthedriver andexecutorclasspaths.--packages Comma-separatedlistofmavencoordinatesofjarstoinclude onthedriverandexecutorclasspaths.Willsearchthelocal mavenrepo,thenmavencentralandanyadditionalremote repositoriesgivenby--repositories.Theformatforthe coordinatesshouldbegroupId:artifactId:version.--exclude-packages Comma-separatedlistofgroupId:artifactId,toexcludewhile resolvingthedependenciesprovidedin--packagestoavoid dependencyconflicts.--repositories Comma-separatedlistofadditionalremoterepositoriesto searchforthemavencoordinatesgivenwith--packages.--py-filesPY_FILES Comma-separatedlistof.zip,.egg,or.pyfilestoplace onthePYTHONPATHforPythonapps.--filesFILES Comma-separatedlistoffilestobeplacedintheworking directoryofeachexecutor.Filepathsofthesefiles inexecutorscanbeaccessedviaSparkFiles.get(fileName).--conf,-cPROP=VALUE ArbitrarySparkconfigurationproperty.--properties-fileFILE Pathtoafilefromwhichtoloadextraproperties.Ifnot specified,thiswilllookforconf/spark-defaults.conf.--driver-memoryMEM Memoryfordriver(e.g.1000M,2G)(Default:1024M).--driver-java-options ExtraJavaoptionstopasstothedriver.--driver-library-path Extralibrarypathentriestopasstothedriver.--driver-class-path Extraclasspathentriestopasstothedriver.Notethat jarsaddedwith--jarsareautomaticallyincludedinthe classpath.--executor-memoryMEM Memoryperexecutor(e.g.1000M,2G)(Default:1G).--proxy-userNAME Usertoimpersonatewhensubmittingtheapplication. Thisargumentdoesnotworkwith--principal/--keytab.--help,-h Showthishelpmessageandexit.--verbose,-v Printadditionaldebugoutput.--version, PrinttheversionofcurrentSpark.Clusterdeploymodeonly:--driver-coresNUM Numberofcoresusedbythedriver,onlyinclustermode (Default:1).SparkstandaloneorMesoswithclusterdeploymodeonly:--supervise Ifgiven,restartsthedriveronfailure.--killSUBMISSION_ID Ifgiven,killsthedriverspecified.--statusSUBMISSION_ID Ifgiven,requeststhestatusofthedriverspecified.SparkstandaloneandMesosonly:--total-executor-coresNUM Totalcoresforallexecutors.SparkstandaloneandYARNonly:--executor-coresNUM Numberofcoresperexecutor.(Default:1inYARNmode, orallavailablecoresontheworkerinstandalonemode)YARN-only:--queueQUEUE_NAME TheYARNqueuetosubmitto(Default:"default").--num-executorsNUM Numberofexecutorstolaunch(Default:2). Ifdynamicallocationisenabled,theinitialnumberof executorswillbeatleastNUM.--archivesARCHIVES Commaseparatedlistofarchivestobeextractedintothe workingdirectoryofeachexecutor.--principalPRINCIPAL PrincipaltobeusedtologintoKDC,whilerunningon secureHDFS.--keytabKEYTAB Thefullpathtothefilethatcontainsthekeytabforthe principalspecifiedabove.Thiskeytabwillbecopiedto thenoderunningtheApplicationMasterviatheSecure DistributedCache,forrenewingtheloginticketsandthe delegationtokensperiodically.3.SparkAPISparkAPI面向Java、Scala、Python、R、SQL工程師和分析師,程序員可以通過(guò)這些接口編寫Spark應(yīng)用程序用戶層代碼ApplicationBusinessLogic。具體的API接口請(qǐng)參考官方文檔,各網(wǎng)址如表8-8所示。表8-8SparkAPI官方參考網(wǎng)址APIDocs網(wǎng)址SparkScalaAPI(Scaladoc)/docs/latest/api/scala/org/apache/spark/index.htmlSparkJavaAPI(Javadoc)/docs/latest/api/java/index.htmlSparkPythonAPI(Sphinx)/docs/latest/api/python/index.htmlSparkRAPI(Roxygen2)/docs/latest/api/R/index.htmlSparkSQL,Built-inFunctions(MkDocs)/docs/latest/api/sql/index.html由于篇幅所限,接口SparkSQL、SparkStreaming、SparkMLlib、SparkGraphX不再介紹,讀者可以參考官網(wǎng)/docs/latest、。8.5實(shí)驗(yàn)步驟8.5.1規(guī)劃Spark集群1.Spark集群架構(gòu)規(guī)劃本實(shí)驗(yàn)選用手工方式部署SparkStandalone集群模式,同時(shí)也介紹了SparkonYARN集群模式及其實(shí)踐內(nèi)容,關(guān)于其它第三方集群資源管理器如Mesos、Kubernetes下的Spark集群部署讀者可參考其它資料自行實(shí)踐,本書不做敘述。受所用硬件資源限制,本實(shí)驗(yàn)的Spark集群欲使用三臺(tái)安裝有Linux操作系統(tǒng)的虛擬機(jī)器,機(jī)器名分別為master、slave1、slave2。編者做出如下規(guī)劃:master機(jī)器充當(dāng)主節(jié)點(diǎn),部署主服務(wù)Master進(jìn)程;slave1和slave2機(jī)器充當(dāng)從節(jié)點(diǎn),部署從服務(wù)Worker進(jìn)程;受節(jié)點(diǎn)數(shù)量限制,編者同時(shí)將master機(jī)器作為向集群提交Spark應(yīng)用程序的客戶端使用。另外,本實(shí)驗(yàn)的Spark集群直接使用HDFS作為分布式底層存儲(chǔ)系統(tǒng),所以也需要搭建好Hadoop集群,并啟動(dòng)HDFS相關(guān)進(jìn)程。具體部署規(guī)劃如表8-9所示。表8-9SparkStandalone集群模式部署規(guī)劃表主機(jī)名IP地址運(yùn)行服務(wù)軟硬件配置master30Master(Spark主進(jìn)程)NameNode(HDFS主進(jìn)程)SecondaryNameNode(與NameNode協(xié)同工作)內(nèi)存:4GCPU:1個(gè)2核硬盤:40G操作系統(tǒng):CentOS7.6.1810Java:OracleJDK8u191Hadoop:Hadoop2.9.2Python:Python3.6.7Spark:Spark2.4.7slave131Worker(Spark從進(jìn)程)DataNode(HDFS從進(jìn)程)內(nèi)存:1GCPU:1個(gè)1核硬盤:20G操作系統(tǒng):CentOS7.6.1810Java:OracleJDK8u191Hadoop:Hadoop2.9.2Python:Python3.6.7Spark:Spark2.4.7slave232Worker(Spark從進(jìn)程)DataNode(HDFS從進(jìn)程)內(nèi)存:1GCPU:1個(gè)1核硬盤:20G操作系統(tǒng):CentOS7.6.1810Java:OracleJDK8u191Hadoop:Hadoop2.9.2Python:Python3.6.7Spark:Spark2.4.72.軟件選擇本實(shí)驗(yàn)部署Spark集群所使用各種軟件的名稱、版本、發(fā)布日期及下載地址如表8-10所示。表8-10本實(shí)驗(yàn)部署Spark集群使用的軟件名稱、版本、發(fā)布日期及下載地址軟件名稱軟件版本發(fā)布日期下載地址VMwareWorkstationProVMwareWorkstation14.5.7ProforWindows2017年6月22日/products/workstation-pro.htmlCentOSCentOS7.6.18102018年11月26日/download/JavaOracleJDK8u1912018年10月16日/technetwork/java/javase/downloads/index.htmlHadoopHadoop2.9.22018年11月19日/releases.htmlPythonPython3.6.72018年10月20日/downloads/source/SparkSpark2.4.72020年9月12日/downloads.html注意,本實(shí)驗(yàn)采用的是Spark版本是2.4.7,組成集群的三個(gè)節(jié)點(diǎn)的機(jī)器名分別為master、slave1、slave2,IP地址依次為30、31、32,后續(xù)內(nèi)容均在表8-9規(guī)劃基礎(chǔ)上完成,讀者務(wù)必與之對(duì)照確認(rèn)自己的Spark版本、機(jī)器名等信息。8.5.2部署Spark集群本實(shí)驗(yàn)采用的Spark版本是2.4.7,因此本實(shí)驗(yàn)的講解都是針對(duì)這個(gè)版本進(jìn)行的。盡管如此,由于Spark各個(gè)版本在部署和運(yùn)行方式上的變化不大,因此本實(shí)驗(yàn)的大部分內(nèi)容都適用于Spark其它版本。1.初始軟硬件環(huán)境準(zhǔn)備(1)準(zhǔn)備三臺(tái)機(jī)器,安裝操作系統(tǒng),編者使用CentOS7.6.1810。(2)對(duì)集群內(nèi)每一臺(tái)機(jī)器,配置靜態(tài)IP、修改機(jī)器名、添加集群級(jí)別域名映射、關(guān)閉防火墻。(3)對(duì)集群內(nèi)每一臺(tái)機(jī)器,安裝和配置Java,要求Java8或更高版本,編者使用OracleJDK8u191。(4)安裝和配置Linux集群中各節(jié)點(diǎn)間的SSH免密登錄。(5)在Linux集群上部署全分布模式Hadoop集群(可選,若Spark底層存儲(chǔ)采用HDFS,資源管理器采用YARN,則需要部署Hadoop集群)。(6)對(duì)集群內(nèi)每一臺(tái)機(jī)器,安裝和配置Python3。(CentOS7.6.1810自帶Python2.7.5,本書使用Python3編寫Spark應(yīng)用程序)以上步驟(1)-(5)已在本書第1章中詳細(xì)介紹,此處不再贅述。接下來(lái)以master機(jī)器為例,詳細(xì)介紹如何安裝和配置Python3,這里以Python3.6.7為例,請(qǐng)注意以下步驟需要在集群中所有機(jī)器上完成。(1)使用命令“whichpython”查看系統(tǒng)有無(wú)安裝Python及其位置,使用命令“python-V”查看Python版本,如圖8-7所示。由于CentOS7.6.1810自帶Python2.7.5,從圖中可知,master機(jī)器已經(jīng)安裝和配置好了Python2.7.5。圖8-7查看系統(tǒng)有無(wú)安裝Python及其位置(2)切換到root用戶下,安裝依賴包。要求計(jì)算機(jī)聯(lián)網(wǎng),依次執(zhí)行以下命令。[root@masterxuluhui]#yum-ygroupinstall'Developmenttools'[root@masterxuluhui]#yum-yinstallopenssl-develbzip2-develexpat-develgdbm-develreadline-develsqlite-devel[root@masterxuluhui]#yuminstalllibffi-devel-y上述依賴包安裝成功后會(huì)有“Complete!”提示信息。(3)下載Python3。使用命令“wget/ftp/python/3.6.7/Python-3.6.7.tgz”,將PythonLinux安裝包下載到例如目錄/home/xuluhui/Downloads下,依次使用的命令如下所示。[root@masterxuluhui]#cd/home/xuluhui/Downloads[root@masterDownloads]#wget/ftp/python/3.6.7/Python-3.6.7.tgz(4)解壓Python3。使用以下命令將Python解壓到例如目錄/home/xuluhui/Downloads下。[root@masterDownloads]#tar-zxvfPython-3.6.7.tgz(5)創(chuàng)建編譯安裝目錄。使用以下命令創(chuàng)建目錄/usr/local/python3,Python3.6.7將安裝到此目錄下,當(dāng)然,讀者也可以選擇其它目錄。[root@masterDownloads]#mkdir/usr/local/python3(6)源碼編譯和安裝。切換到目錄/home/xuluhui/Downloads/Python-3.6.7下,依次執(zhí)行以下命令進(jìn)行編譯和安裝。[root@masterDownloads]#cd/home/xuluhui/Downloads/Python-3.6.7[root@masterPython-3.6.7]#./configure--prefix=/usr/local/python3--enable-optimizations[root@masterPython-3.6.7]#make&&makeinstall其中第二條命令的第一個(gè)參數(shù)--prefix指定安裝路徑,若不指定,安裝過(guò)程中軟件所需要的文件可能會(huì)復(fù)制到其他不同目錄,從而導(dǎo)致刪除軟件和復(fù)制軟件都不方便。第二個(gè)參數(shù)--enable-optimizations可以提高10%-~20%代碼運(yùn)行速度。(7)使用“l(fā)n”命令創(chuàng)建軟鏈接,具體命令如下所示。[root@masterPython-3.6.7]#ln-s/usr/local/python3/bin/python3/usr/bin/python3(8)驗(yàn)證Python3,使用命令“python3-V”測(cè)試是否安裝成功,如圖8-8所示,說(shuō)明已成功安裝Python3。圖8-8驗(yàn)證Python32.獲取SparkSpark官方下載地址為/downloads.html,建議讀者到官網(wǎng)下載穩(wěn)定版,編者采用2020年9月12日發(fā)布的穩(wěn)定版Spark2.4.7,安裝包名稱為“spark-2.4.7-bin-without-hadoop-scala-2.12.tgz”,屬于“Hadoopfree”版,可應(yīng)用到任意ApacheHadoop版本,例如存放在master機(jī)器的/home/xuluhui/Downloads中。3.主節(jié)點(diǎn)上安裝Spark并設(shè)置屬主在master機(jī)器上,使用root用戶解壓spark-2.4.7-bin-without-hadoop-scala-2.12.tgz到安裝目錄如/usr/local下,依次使用的命令如下所示。[xuluhui@master~]$suroot[root@masterxuluhui]#cd/usr/local[root@masterlocal]#tar-zxvf/home/xuluhui/Downloads/spark-2.4.7-bin-without-hadoop-scala-2.12.tgz為了在普通用戶下使用Spark集群,將Spark安裝目錄的屬主設(shè)置為L(zhǎng)inux普通用戶例如xuluhui,使用以下命令完成。[root@masterlocal]#chown-Rxuluhui/usr/local/spark-2.4.7-bin-without-hadoop-scala-2.12當(dāng)然,由于目錄名“spark-2.4.7-bin-without-hadoop-scala-2.12”過(guò)長(zhǎng),為了使用方便,讀者也可以將此目錄重命名為“spark-2.4.7”,可以通過(guò)命令“mvspark-2.4.7-bin-without-hadoop-scala-2.12spark-2.4.7”。編者保留了原名,并未修改。4.主節(jié)點(diǎn)上配置SparkSpark配置文件數(shù)量不多,都存放在目錄${SPARK_HOME}/conf下,具體的配置文件如上文圖8-10所示。本書中編者僅修改slaves和spark-env.sh兩個(gè)配置文件。假設(shè)當(dāng)前目錄為“/usr/local/spark-2.4.7-bin-without-hadoop-scala-2.12/conf”,切換到普通用戶如xuluhui下,在主節(jié)點(diǎn)master上配置Spark的具體過(guò)程如下所示。1)配置slaves配置文件slaves用于指定Spark集群的從節(jié)點(diǎn)。(1)使用命令“cpslaves.templateslaves”復(fù)制模板配置文件slaves.template并命名為“slaves”。(2)使用命令“vimslaves”編輯配置文件slaves,將其中的“l(fā)ocalhost”替換為如下內(nèi)容。slave1slave2上述內(nèi)容表示當(dāng)前的Spark集群共有2個(gè)從節(jié)點(diǎn),這2個(gè)從節(jié)點(diǎn)的機(jī)器名分別為slave1、slave2。Spark配置文件中無(wú)需指定主節(jié)點(diǎn)是哪臺(tái)機(jī)器,這是因?yàn)镾park默認(rèn)為執(zhí)行命令“start-all.sh”的那臺(tái)機(jī)器就是主節(jié)點(diǎn)。2)配置spark-env.sh環(huán)境配置文件spark-env.sh用于指定Spark運(yùn)行時(shí)的各種參數(shù),主要包括Java安裝路徑JAVA_HOME、Spark安裝路徑SPARK_HOME等,另外,Spark集群若要存取HDFS文件,必須設(shè)置Spark使用HDFS,需要配置Hadoop集群配置文件位置HADOOP_CONF_DIR。(1)使用命令“cpspark-env.sh.templatespark-env.sh”復(fù)制模板配置文件spark-env.sh.template并命名為“spark-env.sh”。(2)使用命令“vimspark-env.sh”編輯配置文件spark-env.sh,將以下內(nèi)容追加到文件最后。exportJAVA_HOME=/usr/java/jdk1.8.0_191exportSPARK_HOME=/usr/local/spark-2.4.7-bin-without-hadoop-scala-2.12exportSPARK_MASTER_HOST=masterexportSPARK_PID_DIR=${SPARK_HOME}/pidsexportPYSPARK_PYTHON=python3exportSPARK_DIST_CLASSPATH=$(/usr/local/hadoop-2.9.2/bin/hadoopclasspath)exportHADOOP_CONF_DIR=/usr/local/hadoop-2.9.2/etc/hadoop其中,參數(shù)SPARK_DIST_CLASSPATH是否要設(shè)置取決于下載的Spark是否為帶Hadoop的版本,由于本章選擇下載的是不帶Hadoop的Spark版本,因此必須設(shè)置該參數(shù),否則會(huì)在啟動(dòng)時(shí)出現(xiàn)“AJNIerrorhasoccurred,pleasecheckyourinstallationandtryagain”問(wèn)題。另外,參數(shù)HADOOP_CONF_DIR非必須,只有Spark集群存取HDFS文件時(shí)才需要配置,由于本書的下文需要讀取HDFS上的文件,所以此處配置了該參數(shù)。參數(shù)SPARK_PID_DIR用于指定Spark守護(hù)進(jìn)程號(hào)的保存位置,默認(rèn)為“/tmp”,由于該文件夾用以存放臨時(shí)文件,系統(tǒng)定時(shí)會(huì)自動(dòng)清理,因此本書將“SPARK_PID_DIR”設(shè)置為Spark安裝目錄下的目錄pids,其中目錄pids會(huì)隨著Spark守護(hù)進(jìn)程的啟動(dòng)而由系統(tǒng)自動(dòng)創(chuàng)建,無(wú)需用戶手工創(chuàng)建。若使用/tmp作為Spark守護(hù)進(jìn)程號(hào)的保存位置,則需要將此目錄的寫權(quán)限賦予給普通用戶xuluhui,否則在啟動(dòng)Spark集群時(shí)會(huì)出現(xiàn)“PermissionDenied”問(wèn)題。5.同步Spark文件至所有從節(jié)點(diǎn)并設(shè)置屬主切換到root下,使用“scp”命令將master機(jī)器中配置好的目錄“spark-2.4.7-bin-without-hadoop-scala-2.12”及下屬子目錄和文件全部拷貝至所有從節(jié)點(diǎn)slave1和slave2上,依次使用的命令如下所示,以slave1為例,使用的命令如下所示。[root@masterconf]#scp-r/usr/local/spark-2.4.7-bin-without-hadoop-scala-2.12root@slave1:/usr/local/spark-2.4.7-bin-without-hadoop-scala-2.12[root@masterconf]#scp-r/usr/local/spark-2.4.7-bin-without-hadoop-scala-2.12root@slave2:/usr/local/spark-2.4.7-bin-without-hadoop-scala-2.12然后,依次將所有從節(jié)點(diǎn)slave1、slave2上的Spark安裝目錄的屬主也設(shè)置為L(zhǎng)inux普通用戶例如xuluhui,如在slave1機(jī)器上使用以下命令完成。[root@slave1xuluhui]#chown-Rxuluhui/usr/local/spark-2.4.7-bin-without-hadoop-scala-2.12至此,Linux集群中各個(gè)節(jié)點(diǎn)的Spark均已安裝和配置完畢。8.5.3啟動(dòng)Spark集群在master機(jī)器上使用命令“start-all.sh”啟動(dòng)集群,具體效果如圖8-9所示。圖8-9使用命令“start-all.sh”啟動(dòng)Spark集群過(guò)程應(yīng)當(dāng)注意的是,此命令只能在master機(jī)器上執(zhí)行,不可以在其他slave機(jī)器和客戶端機(jī)器上執(zhí)行,腳本默認(rèn)本機(jī)即為Spark主節(jié)點(diǎn)。8.5.4驗(yàn)證Spark集群?jiǎn)?dòng)Spark集群后,可通過(guò)以下三種方法驗(yàn)證Spark集群是否成功部署。

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論