Chapter16-廈門大學(xué)-林子雨-大數(shù)據(jù)技術(shù)原理與應(yīng)用-第十六章-Spark(2016年4月20日版本)_第1頁
Chapter16-廈門大學(xué)-林子雨-大數(shù)據(jù)技術(shù)原理與應(yīng)用-第十六章-Spark(2016年4月20日版本)_第2頁
Chapter16-廈門大學(xué)-林子雨-大數(shù)據(jù)技術(shù)原理與應(yīng)用-第十六章-Spark(2016年4月20日版本)_第3頁
Chapter16-廈門大學(xué)-林子雨-大數(shù)據(jù)技術(shù)原理與應(yīng)用-第十六章-Spark(2016年4月20日版本)_第4頁
Chapter16-廈門大學(xué)-林子雨-大數(shù)據(jù)技術(shù)原理與應(yīng)用-第十六章-Spark(2016年4月20日版本)_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

廈門大學(xué)計算機科學(xué)系2016年版林子雨廈門大學(xué)計算機科學(xué)系E-mail:ziyulin@主頁:/linziyu

第十講Spark

(PPT版本號:2016年4月20日版本)

《大數(shù)據(jù)技術(shù)原理與應(yīng)用》/post/bigdata溫馨提示:編輯幻燈片母版,可以修改每頁PPT的廈大?;蘸偷撞课淖终n堂內(nèi)容與教材對應(yīng)關(guān)系說明廈門大學(xué)林子雨編著《大數(shù)據(jù)技術(shù)原理與應(yīng)用》2015年8月1日人民郵電出版社出版發(fā)行第1版教材共包含13章內(nèi)容第一章大數(shù)據(jù)概述第二章大數(shù)據(jù)處理架構(gòu)Hadoop第三章分布式文件系統(tǒng)HDFS第四章分布式數(shù)據(jù)庫HBase第五章NoSQL數(shù)據(jù)庫第六章云數(shù)據(jù)庫第七章MapReduce第八章流計算第九章圖計算第十章數(shù)據(jù)可視化第十一章大數(shù)據(jù)在互聯(lián)網(wǎng)領(lǐng)域的應(yīng)用第十二章大數(shù)據(jù)在生物醫(yī)學(xué)領(lǐng)域的應(yīng)用(自學(xué))第十三章大數(shù)據(jù)的其他應(yīng)用(自學(xué))2016年新增章節(jié)(將加入到第2版教材中)第14章基于Hadoop的數(shù)據(jù)倉庫Hive第15章Hadoop架構(gòu)再探討第16章Spark課堂內(nèi)容與教材對應(yīng)關(guān)系說明課堂章節(jié)對應(yīng)的《大數(shù)據(jù)技術(shù)原理與應(yīng)用》(第1版)教材章節(jié)第1講-大數(shù)據(jù)概述第1章-大數(shù)據(jù)概述第2講-大數(shù)據(jù)處理架構(gòu)Hadoop第2章-大數(shù)據(jù)處理架構(gòu)Hadoop第3講-分布式文件系統(tǒng)HDFS第3章-分布式文件系統(tǒng)HDFS第4講-分布式數(shù)據(jù)庫HBase第4章-分布式數(shù)據(jù)庫HBase第5講-NoSQL數(shù)據(jù)庫第5章-NoSQL數(shù)據(jù)庫第6講-云數(shù)據(jù)庫第6章-云數(shù)據(jù)庫第7講-MapReduce第7章-MapReduce第8講-基于Hadoop的數(shù)據(jù)倉庫Hive新增第14章,不在當(dāng)前第1版教材中,將放入第2版教材第9講-Hadoop架構(gòu)再探討新增第15章,不在當(dāng)前第1版教材中,將放入第2版教材第10講-Spark新增第16章,不在當(dāng)前第1版教材中,將放入第2版教材第11講-流計算第8章-流計算第12講-圖計算第9章-圖計算第13講-數(shù)據(jù)可視化第10章-數(shù)據(jù)可視化第14講-大數(shù)據(jù)在互聯(lián)網(wǎng)領(lǐng)域的應(yīng)用第11章-大數(shù)據(jù)在互聯(lián)網(wǎng)領(lǐng)域的應(yīng)用備注:教材的第12章大數(shù)據(jù)在生物醫(yī)學(xué)領(lǐng)域的應(yīng)用和第13章大數(shù)據(jù)在其他領(lǐng)域的應(yīng)用,為自學(xué)章節(jié),不錄制視頻

廈門大學(xué)計算機科學(xué)系2016年版林子雨廈門大學(xué)計算機科學(xué)系E-mail:ziyulin@主頁:/linziyu

第十六章Spark

(第1版教材出版后的2016年新增章節(jié))《大數(shù)據(jù)技術(shù)原理與應(yīng)用》/post/bigdata溫馨提示:編輯幻燈片母版,可以修改每頁PPT的廈大?;蘸偷撞课淖郑≒PT版本號:2016年4月20日版本)

中國高校大數(shù)據(jù)課程公共服務(wù)平臺/post/bigdata-teaching-platform/百度搜索“廈門大學(xué)數(shù)據(jù)庫實驗室”訪問平臺主頁課程教材講義PPT學(xué)習(xí)指南免費提供備課指南上機習(xí)題授課視頻技術(shù)資料全方位、一站式服務(wù)提綱本PPT是如下教材的配套講義:21世紀(jì)高等教育計算機規(guī)劃教材《大數(shù)據(jù)技術(shù)原理與應(yīng)用——概念、存儲、處理、分析與應(yīng)用》(2015年8月第1版)廈門大學(xué)林子雨編著,人民郵電出版社ISBN:978-7-115-39287-9歡迎訪問《大數(shù)據(jù)技術(shù)原理與應(yīng)用》教材官方網(wǎng)站:/post/bigdata歡迎訪問“中國高校大數(shù)據(jù)課程公共服務(wù)平臺”旗下子欄目“大數(shù)據(jù)課程學(xué)生服務(wù)站”,為學(xué)生學(xué)習(xí)大數(shù)據(jù)課程提供全方位、一站式免費服務(wù):/post/4331/16.1Spark概述16.2Spark生態(tài)系統(tǒng)16.3Spark運行架構(gòu)16.4SparkSQL16.5Spark的部署和應(yīng)用方式16.6Spark編程實踐16.1Spark概述16.1.1Spark簡介16.1.2Scala簡介16.1.3Spark與Hadoop的比較16.1.1Spark簡介Spark最初由美國加州伯克利大學(xué)(UCBerkeley)的AMP實驗室于2009年開發(fā),是基于內(nèi)存計算的大數(shù)據(jù)并行計算框架,可用于構(gòu)建大型的、低延遲的數(shù)據(jù)分析應(yīng)用程序2013年Spark加入Apache孵化器項目后發(fā)展迅猛,如今已成為Apache軟件基金會最重要的三大分布式計算系統(tǒng)開源項目之一(Hadoop、Spark、Storm)Spark在2014年打破了Hadoop保持的基準(zhǔn)排序紀(jì)錄Spark/206個節(jié)點/23分鐘/100TB數(shù)據(jù)Hadoop/2000個節(jié)點/72分鐘/100TB數(shù)據(jù)Spark用十分之一的計算資源,獲得了比Hadoop快3倍的速度16.1.1Spark簡介Spark具有如下幾個主要特點:運行速度快:使用DAG執(zhí)行引擎以支持循環(huán)數(shù)據(jù)流與內(nèi)存計算容易使用:支持使用Scala、Java、Python和R語言進(jìn)行編程,可以通過SparkShell進(jìn)行交互式編程通用性:Spark提供了完整而強大的技術(shù)棧,包括SQL查詢、流式計算、機器學(xué)習(xí)和圖算法組件運行模式多樣:可運行于獨立的集群模式中,可運行于Hadoop中,也可運行于AmazonEC2等云環(huán)境中,并且可以訪問HDFS、Cassandra、HBase、Hive等多種數(shù)據(jù)源

16.1.1Spark簡介圖16-1谷歌趨勢:Spark與Hadoop對比Spark如今已吸引了國內(nèi)外各大公司的注意,如騰訊、淘寶、百度、亞馬遜等公司均不同程度地使用了Spark來構(gòu)建大數(shù)據(jù)分析應(yīng)用,并應(yīng)用到實際的生產(chǎn)環(huán)境中16.1.2Scala簡介Scala是一門現(xiàn)代的多范式編程語言,運行于Java平臺(JVM,Java虛擬機),并兼容現(xiàn)有的Java程序Scala的特性:Scala具備強大的并發(fā)性,支持函數(shù)式編程,可以更好地支持分布式系統(tǒng)Scala語法簡潔,能提供優(yōu)雅的APIScala兼容Java,運行速度快,且能融合到Hadoop生態(tài)圈中

Scala是Spark的主要編程語言,但Spark還支持Java、Python、R作為編程語言Scala的優(yōu)勢是提供了REPL(Read-Eval-PrintLoop,交互式解釋器),提高程序開發(fā)效率16.1.3Spark與Hadoop的對比Hadoop存在如下一些缺點:表達(dá)能力有限磁盤IO開銷大延遲高任務(wù)之間的銜接涉及IO開銷在前一個任務(wù)執(zhí)行完成之前,其他任務(wù)就無法開始,難以勝任復(fù)雜、多階段的計算任務(wù)

16.1.3Spark與Hadoop的對比Spark在借鑒HadoopMapReduce優(yōu)點的同時,很好地解決了MapReduce所面臨的問題相比于HadoopMapReduce,Spark主要具有如下優(yōu)點:Spark的計算模式也屬于MapReduce,但不局限于Map和Reduce操作,還提供了多種數(shù)據(jù)集操作類型,編程模型比HadoopMapReduce更靈活Spark提供了內(nèi)存計算,可將中間結(jié)果放到內(nèi)存中,對于迭代運算效率更高Spark基于DAG的任務(wù)調(diào)度執(zhí)行機制,要優(yōu)于HadoopMapReduce的迭代執(zhí)行機制

16.1.3Spark與Hadoop的對比圖16-2Hadoop與Spark的執(zhí)行流程對比16.1.3Spark與Hadoop的對比圖16-3Hadoop與Spark執(zhí)行邏輯回歸的時間對比使用Hadoop進(jìn)行迭代計算非常耗資源Spark將數(shù)據(jù)載入內(nèi)存后,之后的迭代計算都可以直接使用內(nèi)存中的中間結(jié)果作運算,避免了從磁盤中頻繁讀取數(shù)據(jù)16.2Spark生態(tài)系統(tǒng)在實際應(yīng)用中,大數(shù)據(jù)處理主要包括以下三個類型:復(fù)雜的批量數(shù)據(jù)處理:通常時間跨度在數(shù)十分鐘到數(shù)小時之間基于歷史數(shù)據(jù)的交互式查詢:通常時間跨度在數(shù)十秒到數(shù)分鐘之間基于實時數(shù)據(jù)流的數(shù)據(jù)處理:通常時間跨度在數(shù)百毫秒到數(shù)秒之間當(dāng)同時存在以上三種場景時,就需要同時部署三種不同的軟件比如:MapReduce/Impala/Storm這樣做難免會帶來一些問題:不同場景之間輸入輸出數(shù)據(jù)無法做到無縫共享,通常需要進(jìn)行數(shù)據(jù)格式的轉(zhuǎn)換不同的軟件需要不同的開發(fā)和維護(hù)團隊,帶來了較高的使用成本比較難以對同一個集群中的各個系統(tǒng)進(jìn)行統(tǒng)一的資源協(xié)調(diào)和分配16.2Spark生態(tài)系統(tǒng)Spark的設(shè)計遵循“一個軟件棧滿足不同應(yīng)用場景”的理念,逐漸形成了一套完整的生態(tài)系統(tǒng)既能夠提供內(nèi)存計算框架,也可以支持SQL即席查詢、實時流式計算、機器學(xué)習(xí)和圖計算等Spark可以部署在資源管理器YARN之上,提供一站式的大數(shù)據(jù)解決方案因此,Spark所提供的生態(tài)系統(tǒng)足以應(yīng)對上述三種場景,即同時支持批處理、交互式查詢和流數(shù)據(jù)處理16.2Spark生態(tài)系統(tǒng)Spark的生態(tài)系統(tǒng)主要包含了SparkCore、SparkSQL、SparkStreaming、MLLib和GraphX等組件圖16-4BDAS架構(gòu)Spark生態(tài)系統(tǒng)已經(jīng)成為伯克利數(shù)據(jù)分析軟件棧BDAS(BerkeleyDataAnalyticsStack)的重要組成部分16.2Spark生態(tài)系統(tǒng)應(yīng)用場景時間跨度其他框架Spark生態(tài)系統(tǒng)中的組件復(fù)雜的批量數(shù)據(jù)處理小時級MapReduce、HiveSpark基于歷史數(shù)據(jù)的交互式查詢分鐘級、秒級Impala、Dremel、DrillSparkSQL基于實時數(shù)據(jù)流的數(shù)據(jù)處理毫秒、秒級Storm、S4SparkStreaming基于歷史數(shù)據(jù)的數(shù)據(jù)挖掘-MahoutMLlib圖結(jié)構(gòu)數(shù)據(jù)的處理-Pregel、HamaGraphX表1Spark生態(tài)系統(tǒng)組件的應(yīng)用場景16.3Spark運行架構(gòu)16.3.1基本概念16.3.2架構(gòu)設(shè)計16.3.3Spark運行基本流程16.3.4Spark運行原理16.3.1基本概念RDD:是ResillientDistributedDataset(彈性分布式數(shù)據(jù)集)的簡稱,是分布式內(nèi)存的一個抽象概念,提供了一種高度受限的共享內(nèi)存模型DAG:是DirectedAcyclicGraph(有向無環(huán)圖)的簡稱,反映RDD之間的依賴關(guān)系Executor:是運行在工作節(jié)點(WorkerNode)的一個進(jìn)程,負(fù)責(zé)運行TaskApplication:用戶編寫的Spark應(yīng)用程序Task:運行在Executor上的工作單元

Job:一個Job包含多個RDD及作用于相應(yīng)RDD上的各種操作Stage:是Job的基本調(diào)度單位,一個Job會分為多組Task,每組Task被稱為Stage,或者也被稱為TaskSet,代表了一組關(guān)聯(lián)的、相互之間沒有Shuffle依賴關(guān)系的任務(wù)組成的任務(wù)集16.3.2架構(gòu)設(shè)計圖16-5Spark運行架構(gòu)Spark運行架構(gòu)包括集群資源管理器(ClusterManager)、運行作業(yè)任務(wù)的工作節(jié)點(WorkerNode)、每個應(yīng)用的任務(wù)控制節(jié)點(Driver)和每個工作節(jié)點上負(fù)責(zé)具體任務(wù)的執(zhí)行進(jìn)程(Executor)資源管理器可以自帶或Mesos或YARN與HadoopMapReduce計算框架相比,Spark所采用的Executor有兩個優(yōu)點:一是利用多線程來執(zhí)行具體的任務(wù),減少任務(wù)的啟動開銷二是Executor中有一個BlockManager存儲模塊,會將內(nèi)存和磁盤共同作為存儲設(shè)備,有效減少IO開銷16.3.2架構(gòu)設(shè)計圖16-6Spark中各種概念之間的相互關(guān)系一個Application由一個Driver和若干個Job構(gòu)成,一個Job由多個Stage構(gòu)成,一個Stage由多個沒有Shuffle關(guān)系的Task組成當(dāng)執(zhí)行一個Application時,Driver會向集群管理器申請資源,啟動Executor,并向Executor發(fā)送應(yīng)用程序代碼和文件,然后在Executor上執(zhí)行Task,運行結(jié)束后,執(zhí)行結(jié)果會返回給Driver,或者寫到HDFS或者其他數(shù)據(jù)庫中16.3.3Spark運行基本流程圖16-7Spark運行基本流程圖(1)首先為應(yīng)用構(gòu)建起基本的運行環(huán)境,即由Driver創(chuàng)建一個SparkContext,進(jìn)行資源的申請、任務(wù)的分配和監(jiān)控(2)資源管理器為Executor分配資源,并啟動Executor進(jìn)程(3)SparkContext根據(jù)RDD的依賴關(guān)系構(gòu)建DAG圖,DAG圖提交給DAGScheduler解析成Stage,然后把一個個TaskSet提交給底層調(diào)度器TaskScheduler處理;Executor向SparkContext申請Task,TaskScheduler將Task發(fā)放給Executor運行,并提供應(yīng)用程序代碼(4)Task在Executor上運行,把執(zhí)行結(jié)果反饋給TaskScheduler,然后反饋給DAGScheduler,運行完畢后寫入數(shù)據(jù)并釋放所有資源

16.3.3Spark運行基本流程總體而言,Spark運行架構(gòu)具有以下特點:(1)每個Application都有自己專屬的Executor進(jìn)程,并且該進(jìn)程在Application運行期間一直駐留。Executor進(jìn)程以多線程的方式運行Task(2)Spark運行過程與資源管理器無關(guān),只要能夠獲取Executor進(jìn)程并保持通信即可(3)Task采用了數(shù)據(jù)本地性和推測執(zhí)行等優(yōu)化機制16.3.4RDD運行原理1.設(shè)計背景2.RDD概念3.RDD特性4.RDD之間的依賴關(guān)系5.Stage的劃分6.RDD運行過程16.3.4RDD運行原理1.設(shè)計背景許多迭代式算法(比如機器學(xué)習(xí)、圖算法等)和交互式數(shù)據(jù)挖掘工具,共同之處是,不同計算階段之間會重用中間結(jié)果目前的MapReduce框架都是把中間結(jié)果寫入到HDFS中,帶來了大量的數(shù)據(jù)復(fù)制、磁盤IO和序列化開銷RDD就是為了滿足這種需求而出現(xiàn)的,它提供了一個抽象的數(shù)據(jù)架構(gòu),我們不必?fù)?dān)心底層數(shù)據(jù)的分布式特性,只需將具體的應(yīng)用邏輯表達(dá)為一系列轉(zhuǎn)換處理,不同RDD之間的轉(zhuǎn)換操作形成依賴關(guān)系,可以實現(xiàn)管道化,避免中間數(shù)據(jù)存儲16.3.4RDD運行原理2.RDD概念一個RDD就是一個分布式對象集合,本質(zhì)上是一個只讀的分區(qū)記錄集合,每個RDD可分成多個分區(qū),每個分區(qū)就是一個數(shù)據(jù)集片段,并且一個RDD的不同分區(qū)可以被保存到集群中不同的節(jié)點上,從而可以在集群中的不同節(jié)點上進(jìn)行并行計算RDD提供了一種高度受限的共享內(nèi)存模型,即RDD是只讀的記錄分區(qū)的集合,不能直接修改,只能基于穩(wěn)定的物理存儲中的數(shù)據(jù)集創(chuàng)建RDD,或者通過在其他RDD上執(zhí)行確定的轉(zhuǎn)換操作(如map、join和groupby)而創(chuàng)建得到新的RDD16.3.4RDD運行原理RDD提供了一組豐富的操作以支持常見的數(shù)據(jù)運算,分為“動作”(Action)和“轉(zhuǎn)換”(Transformation)兩種類型RDD提供的轉(zhuǎn)換接口都非常簡單,都是類似map、filter、groupBy、join等粗粒度的數(shù)據(jù)轉(zhuǎn)換操作,而不是針對某個數(shù)據(jù)項的細(xì)粒度修改(不適合網(wǎng)頁爬蟲)表面上RDD的功能很受限、不夠強大,實際上RDD已經(jīng)被實踐證明可以高效地表達(dá)許多框架的編程模型(比如MapReduce、SQL、Pregel)Spark用Scala語言實現(xiàn)了RDD的API,程序員可以通過調(diào)用API實現(xiàn)對RDD的各種操作16.3.4RDD運行原理RDD典型的執(zhí)行過程如下:RDD讀入外部數(shù)據(jù)源進(jìn)行創(chuàng)建RDD經(jīng)過一系列的轉(zhuǎn)換(Transformation)操作,每一次都會產(chǎn)生不同的RDD,供給下一個轉(zhuǎn)換操作使用最后一個RDD經(jīng)過“動作”操作進(jìn)行轉(zhuǎn)換,并輸出到外部數(shù)據(jù)源

圖16-8RDD執(zhí)行過程的一個實例這一系列處理稱為一個Lineage(血緣關(guān)系),即DAG拓?fù)渑判虻慕Y(jié)果優(yōu)點:惰性調(diào)用、管道化、避免同步等待、不需要保存中間結(jié)果、每次操作變得簡單動作轉(zhuǎn)換轉(zhuǎn)換轉(zhuǎn)換轉(zhuǎn)換轉(zhuǎn)換創(chuàng)建創(chuàng)建16.3.4RDD運行原理Spark采用RDD以后能夠?qū)崿F(xiàn)高效計算的原因主要在于:(1)高效的容錯性現(xiàn)有容錯機制:數(shù)據(jù)復(fù)制或者記錄日志RDD:血緣關(guān)系、重新計算丟失分區(qū)、無需回滾系統(tǒng)、重算過程在不同節(jié)點之間并行、只記錄粗粒度的操作(2)中間結(jié)果持久化到內(nèi)存,數(shù)據(jù)在內(nèi)存中的多個RDD操作之間進(jìn)行傳遞,避免了不必要的讀寫磁盤開銷(3)存放的數(shù)據(jù)可以是Java對象,避免了不必要的對象序列化和反序列化3.RDD特性16.3.4RDD運行原理窄依賴表現(xiàn)為一個父RDD的分區(qū)對應(yīng)于一個子RDD的分區(qū)或多個父RDD的分區(qū)對應(yīng)于一個子RDD的分區(qū)寬依賴則表現(xiàn)為存在一個父RDD的一個分區(qū)對應(yīng)一個子RDD的多個分區(qū)圖16-9窄依賴與寬依賴的區(qū)別4.RDD之間的依賴關(guān)系16.3.4RDD運行原理Spark通過分析各個RDD的依賴關(guān)系生成了DAG,再通過分析各個RDD中的分區(qū)之間的依賴關(guān)系來決定如何劃分Stage,具體劃分方法是:在DAG中進(jìn)行反向解析,遇到寬依賴就斷開遇到窄依賴就把當(dāng)前的RDD加入到Stage中將窄依賴盡量劃分在同一個Stage中,可以實現(xiàn)流水線計算5.Stage的劃分16.3.4RDD運行原理圖16-10根據(jù)RDD分區(qū)的依賴關(guān)系劃分Stage5.Stage的劃分被分成三個Stage,在Stage2中,從map到union都是窄依賴,這兩步操作可以形成一個流水線操作流水線操作實例分區(qū)7通過map操作生成的分區(qū)9,可以不用等待分區(qū)8到分區(qū)10這個map操作的計算結(jié)束,而是繼續(xù)進(jìn)行union操作,得到分區(qū)13,這樣流水線執(zhí)行大大提高了計算的效率16.3.4RDD運行原理Stage的類型包括兩種:ShuffleMapStage和ResultStage,具體如下:(1)ShuffleMapStage:不是最終的Stage,在它之后還有其他Stage,所以,它的輸出一定需要經(jīng)過Shuffle過程,并作為后續(xù)Stage的輸入;這種Stage是以Shuffle為輸出邊界,其輸入邊界可以是從外部獲取數(shù)據(jù),也可以是另一個ShuffleMapStage的輸出,其輸出可以是另一個Stage的開始;在一個Job里可能有該類型的Stage,也可能沒有該類型Stage;(2)ResultStage:最終的Stage,沒有輸出,而是直接產(chǎn)生結(jié)果或存儲。這種Stage是直接輸出結(jié)果,其輸入邊界可以是從外部獲取數(shù)據(jù),也可以是另一個ShuffleMapStage的輸出。在一個Job里必定有該類型Stage。因此,一個Job含有一個或多個Stage,其中至少含有一個ResultStage。5.Stage的劃分16.3.4RDD運行原理通過上述對RDD概念、依賴關(guān)系和Stage劃分的介紹,結(jié)合之前介紹的Spark運行基本流程,再總結(jié)一下RDD在Spark架構(gòu)中的運行過程:(1)創(chuàng)建RDD對象;(2)SparkContext負(fù)責(zé)計算RDD之間的依賴關(guān)系,構(gòu)建DAG;(3)DAGScheduler負(fù)責(zé)把DAG圖分解成多個Stage,每個Stage中包含了多個Task,每個Task會被TaskScheduler分發(fā)給各個WorkerNode上的Executor去執(zhí)行。圖16-11RDD在Spark中的運行過程16.4SparkSQL16.4.1從Shark說起16.4.2SparkSQL設(shè)計16.4.1從Shark說起Shark即HiveonSpark,為了實現(xiàn)與Hive兼容,Shark在HiveQL方面重用了Hive中HiveQL的解析、邏輯執(zhí)行計劃翻譯、執(zhí)行計劃優(yōu)化等邏輯,可以近似認(rèn)為僅將物理執(zhí)行計劃從MapReduce作業(yè)替換成了Spark作業(yè),通過Hive的HiveQL解析,把HiveQL翻譯成Spark上的RDD操作。Shark的設(shè)計導(dǎo)致了兩個問題:一是執(zhí)行計劃優(yōu)化完全依賴于Hive,不方便添加新的優(yōu)化策略;二是因為Spark是線程級并行,而MapReduce是進(jìn)程級并行,因此,Spark在兼容Hive的實現(xiàn)上存在線程安全問題,導(dǎo)致Shark不得不使用另外一套獨立維護(hù)的打了補丁的Hive源碼分支Hive中SQL查詢的MapReduce作業(yè)轉(zhuǎn)化過程16.4.2SparkSQL設(shè)計SparkSQL在Hive兼容層面僅依賴HiveQL解析、Hive元數(shù)據(jù),也就是說,從HQL被解析成抽象語法樹(AST)起,就全部由SparkSQL接管了。SparkSQL執(zhí)行計劃生成和優(yōu)化都由Catalyst(函數(shù)式關(guān)系查詢優(yōu)化框架)負(fù)責(zé)圖16-12SparkSQL架構(gòu)16.4.2SparkSQL設(shè)計圖16-13SparkSQL支持的數(shù)據(jù)格式和編程語言SparkSQL增加了SchemaRDD(即帶有Schema信息的RDD),使用戶可以在SparkSQL中執(zhí)行SQL語句,數(shù)據(jù)既可以來自RDD,也可以是Hive、HDFS、Cassandra等外部數(shù)據(jù)源,還可以是JSON格式的數(shù)據(jù)SparkSQL目前支持Scala、Java、Python三種語言,支持SQL-92規(guī)范16.5Spark的部署和應(yīng)用方式16.5.1Spark三種部署方式16.5.2從Hadoop+Storm架構(gòu)轉(zhuǎn)向Spark架構(gòu)16.5.3Hadoop和Spark的統(tǒng)一部署16.5.1Spark三種部署方式Spark支持三種不同類型的部署方式,包括:Standalone(類似于MapReduce1.0,slot為資源分配單位)SparkonMesos(和Spark有血緣關(guān)系,更好支持Mesos)SparkonYARN圖16-17SparkonYarn架構(gòu)16.5.2從Hadoop+Storm架構(gòu)轉(zhuǎn)向Spark架構(gòu)圖16-18采用Hadoop+Storm部署方式的一個案例這種架構(gòu)部署較為繁瑣16.5.2從Hadoop+Storm架構(gòu)轉(zhuǎn)向Spark架構(gòu)用Spark架構(gòu)具有如下優(yōu)點:實現(xiàn)一鍵式安裝和配置、線程級別的任務(wù)監(jiān)控和告警降低硬件集群、軟件維護(hù)、任務(wù)監(jiān)控和應(yīng)用開發(fā)的難度便于做成統(tǒng)一的硬件、計算平臺資源池需要說明的是,SparkStreaming無法實現(xiàn)毫秒級的流計算,因此,對于需要毫秒級實時響應(yīng)的企業(yè)應(yīng)用而言,仍然需要采用流計算框架(如Storm)圖16-19用Spark架構(gòu)滿足批處理和流處理需求16.5.3Hadoop和Spark的統(tǒng)一部署不同的計算框架統(tǒng)一運行在YARN中,可以帶來如下好處:計算資源按需伸縮不用負(fù)載應(yīng)用混搭,集群利用率高共享底層存儲,避免數(shù)據(jù)跨集群遷移圖16-20Hadoop和Spark的統(tǒng)一部署由于Hadoop生態(tài)系統(tǒng)中的一些組件所實現(xiàn)的功能,目前還是無法由Spark取代的,比如,Storm現(xiàn)有的Hadoop組件開發(fā)的應(yīng)用,完全轉(zhuǎn)移到Spark上需要一定的成本16.6Spark編程實踐16.6.1Spark安裝16.6.2啟動SparkShell16.6.3SparkRDD基本操作16.6.4Spark應(yīng)用程序

Spark上機實踐詳細(xì)過程,請參考廈門大學(xué)數(shù)據(jù)庫實驗室建設(shè)的“中國高校大數(shù)據(jù)課程公共服務(wù)平臺”中的“大數(shù)據(jù)課程學(xué)生服務(wù)站”中的“學(xué)習(xí)指南”欄目:學(xué)生服務(wù)站地址:/post/4331/學(xué)習(xí)指南欄目中包含了《第十六章Spark學(xué)習(xí)指南》/blog/778-2/掃一掃訪問學(xué)生服務(wù)站16.6.1Spark安裝安裝Spark之前需要安裝Java環(huán)境和Hadoop環(huán)境。下載地址:

進(jìn)入下載頁面后,點擊主頁右側(cè)的“DownloadSpark”按鈕進(jìn)入下載頁面,下載頁面中提供了幾個下載選項,主要是Sparkrelease及Packagetype的選擇,如下圖所示。第1項Sparkrelease一般默認(rèn)選擇最新的發(fā)行版本,如截止至2016年3月份的最新版本為1.6.0。第2項packagetype則選擇“Pre-buildwithuser-providedHadoop[canusewithmostHadoopdistributions]”,可適用于多數(shù)Hadoop版本。選擇好之后,再點擊第4項給出的鏈接就可以下載Spark了。圖Spark下載選項16.6.1Spark安裝解壓安裝包spark-1.6.0-bin-without-hadoop.tgz至路徑/usr/local:

$cd/usr/local$sudomv./spark-1.6.0-bin-without-hadoop/./spark#更改文件夾名$sudochown-Rhadoop./spark#此處的hadoop為系統(tǒng)用戶名

配置Spark的Classpath。

編輯該配置文件,在文件最后面加上如下一行內(nèi)容:

保存配置文件后,就可以啟動、運行Spark了。Spark包含多種運行模式:單機模式、偽分布式模式、完全分布式模式。本章使用單機模式運行Spark。若需要使用HDFS中的文件,則在使用Spark前需要啟動Hadoop。$sudotar-zxf~/下載/spark-1.6.0-bin-without-hadoop.tgz-C/usr/local/$cd/usr/local/spark$cp./conf/spark-env.sh.template./conf/spark-env.sh#拷貝配置文件exportSPARK_DIST_CLASSPATH=$(/usr/local/hadoop/bin/hadoopclasspath)16.6.2啟動SparkShellSparkShell提供了簡單的方式來學(xué)習(xí)SparkAPISparkShell可以以實時、交互的方式來分析數(shù)據(jù)SparkShell支持Scala和Python

啟動SparkShell成功后在輸出信息的末尾可以看到“Scala>”的命令提示符,如下圖所示。圖6可通過Yarn進(jìn)行資源管理的應(yīng)用本章節(jié)內(nèi)容選擇使用Scala進(jìn)行編程實踐,了解Scala有助于更好地掌握Spark。執(zhí)行如下命令啟動SparkShell:$./bin/spark-shell16.6.3SparkRDD基本操作Spark的主要操作對象是RDD,RDD可以通過多種方式靈活創(chuàng)建,可通過導(dǎo)入外部數(shù)據(jù)源建立,或者從其他的RDD轉(zhuǎn)化而來。在Spark程序中必須創(chuàng)建一個SparkContext對象,該對象是Spark程序的入口,負(fù)責(zé)創(chuàng)建RDD、啟動任務(wù)等。在啟動SparkShell后,該對象會自動創(chuàng)建,可以通過變量sc進(jìn)行訪問。作為示例,我們選擇以Spark安裝目錄中的“README.md”文件作為數(shù)據(jù)源新建一個RDD,代碼如下:

SparkRDD支持兩種類型的操作:動作(action):在數(shù)據(jù)集上進(jìn)行運算,返回計算值轉(zhuǎn)換(transformation):基于現(xiàn)有的數(shù)據(jù)集創(chuàng)建一個新的數(shù)據(jù)集

Scala>valtextFile=sc.textFile("file:///usr/local/spark/README.md")//通過file:前綴指定讀取本地文件16.6.3SparkRDD基本操作Spark提供了非常豐富的API,下面兩表格列出了幾個常用的動作、轉(zhuǎn)換API,更詳細(xì)的API及說明可查閱官方文檔。

ActionAPI說明count()返回數(shù)據(jù)集中的元素個數(shù)collect()以數(shù)組的形式返回數(shù)據(jù)集中的所有元素first()返回數(shù)據(jù)集中的第一個元素take(n)以數(shù)組的形式返回數(shù)據(jù)集中的前n個元素reduce(func)通過函數(shù)func(輸入兩個參數(shù)并返回一個值)聚合數(shù)據(jù)集中的元素foreach(func)將數(shù)據(jù)集中的每個元素傳遞到函數(shù)func中運行TransformationAPI說明filter(func)篩選出滿足函數(shù)func的元素,并返回一個新的數(shù)據(jù)集map(func)將每個元素傳遞到函數(shù)func中,并將結(jié)果返回為一個新的數(shù)據(jù)集flatMap(func)與map()相似,但每個輸入元素都可以映射到0或多個輸出結(jié)果groupByKey()應(yīng)用于(K,V)鍵值對的數(shù)據(jù)集時,返回一個新的(K,Iterable<V>)形式的數(shù)據(jù)集reduceByKey(func)應(yīng)用于(K,V)鍵值對的數(shù)據(jù)集時,返回一個新的(K,V)形式的數(shù)據(jù)集,其中的每個值是將每個key傳遞到函數(shù)func中進(jìn)行聚合7-1常用的幾個ActionAPI介紹7-2常用的幾個TransformationAPI介紹16.6.3SparkRDD基本操作使用actionAPI-count()可以統(tǒng)計該文本文件的行數(shù),命令如下:

輸出結(jié)果Long=95(“Long=95”表示該文件共有95行內(nèi)容)。

Scala>textFile.count()使用transformationAPI-filter()可以篩選出只包含Spark的行,命令如下:

第一條命令會返回一個新的RDD;輸出結(jié)果Long=17(表示該文件中共有17行內(nèi)容包含“Spark”)。Scala>vallinesWithSpark=textFile.filter(line=>line.contains("Spark"))Scala>linesWithSpark.count()也可以在同一條代碼中同時使用多個API,連續(xù)進(jìn)行運算,稱為鏈?zhǔn)讲僮?。不僅可以使Spark代碼更加簡潔,也優(yōu)化了計算過程。如上述兩條代碼可合并為如下一行代碼:

假設(shè)我們只需要得到包含“Spark”的行數(shù),那么存儲篩選后的文本數(shù)據(jù)是多余的,因為這部分?jǐn)?shù)據(jù)在計算得到行數(shù)后就不再使用到了。Spark基于整個操作鏈,僅儲存、計算所需的數(shù)據(jù),提升了運行效率。Scala>vallinesCountWithSpark=textFile.filter(line=>line.contains("Spark")).count()16.6.3SparkRDD基本操作Spark屬于MapReduce計算模型,因此也可以實現(xiàn)MapReduce的計算流程,如實現(xiàn)單詞統(tǒng)計,可以使用如下的命令實現(xiàn):首先使用flatMap()將每一行的文本內(nèi)容通過空格進(jìn)行劃分為單詞;再使用map()將單詞映射為(K,V)的鍵值對,其中K為單詞,V為1;最后使用reduceByKey()將相同單詞的計數(shù)進(jìn)行相加,最終得到該單詞總的出現(xiàn)的次數(shù)。

輸出結(jié)果Long=95(“Long=95”表示該文件共有95行內(nèi)容)。

Scala>valwordCounts=textFile.flatMap(line=>line.split("")).map(word=>(word,1)).reduceByKey((a,b)=>a+b)Scala>wordCounts.collect()//輸出單詞統(tǒng)計結(jié)果//Array[(String,Int)]=Array((package,1),(For,2),(Programs,1),(processing.,1),(Because,1),(The,1)...)16.6.4Spark應(yīng)用程序在SparkShell中進(jìn)行編程主要是方便對代碼進(jìn)行調(diào)試,但需要以逐行代碼的方式運行。一般情況下,會選擇將調(diào)試后代碼打包成獨立的Spark應(yīng)用程序,提交到Spark中運行。采用Scala編寫的程序需要使用sbt(SimpleBuildTool)進(jìn)行打包,sbt的安裝配置步驟如下:下載sbt-launch.jar(下載地址/s/1eRyFddw)將下載后的文件拷貝至安裝目錄/usr/local/sbt中,命令如下:在安裝目錄中創(chuàng)建一個Shell腳本文件(文件路徑:/usr/local/sbt/sbt)用于啟動sbt,腳本文件中的代碼如下:保存后,還需要為該Shell腳本文件增加可執(zhí)行權(quán)限,命令如下:sudomkdir/usr/local/sbt#創(chuàng)建安裝目錄cp~/下載/sbt-launch.jar/usr/local/sbtsudochown-Rhadoop/usr/local/sbt#此處的hadoop為系統(tǒng)當(dāng)前用戶名#!/bin/bashSBT_OPTS="-Xms512M-Xmx1536M-Xss1M-XX:+CMSClassUnloadingEnabled-XX:MaxPermSize=256M"java$SBT_OPTS-jar`dirname$0`/sbt-launch.jar"$@"chmodu+x/usr/local/sbt/sbt16.6.4Spark應(yīng)用程序我們以一個簡單的程序為例,介紹如何打包并運行Spark程序,該程序的功能是統(tǒng)計文本文件中包含字母a和字b的各有多少行,具體步驟如下:

創(chuàng)建程序根目錄,并創(chuàng)建程序所需的文件夾結(jié)構(gòu),命令如下:創(chuàng)建一個SimpleApp.scala文件(文件路徑:~/sparkapp/src/main/scala/SimpleApp.scala),文件中的代碼內(nèi)容如下:importorg.apache.spark.SparkContextimportorg.apache.spark.SparkContext._importorg.apache.spark.SparkConf

objectSimpleApp{defmain(args:Array[String]){vallogFile="file:///usr/local/spark/README.md"http://用于統(tǒng)計的文本文件valconf=newSparkConf().setAppName("SimpleApplication")valsc=newSparkContext(conf)vallogData=sc.textFile(logFile,2).cache()valnumAs=logData.filter(line=>line.contains("a")).count()valnumBs=logData.filter(line=>line.contains("b")).count()println("Lineswitha:%s,Lineswithb:%s".format(numAs,numBs))}}mkdir~/sparkapp#創(chuàng)建程序根目錄mkdir-p~/sparkapp/src/main/scala#創(chuàng)建程序所需的文件夾結(jié)構(gòu)16.6.4Spark應(yīng)用程序然后創(chuàng)建一個simple.sbt文件(文件路徑:~/sparkapp/simple.sbt),用于聲明該應(yīng)用程序的信息以及與Spark的依賴關(guān)系,具體內(nèi)容如下:使用sbt對該應(yīng)用程序進(jìn)行打包,命令如下:打包成功后,會輸出程序jar包的位置以

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論