[toc]
spark是一種快速、通用、可擴充的大資料分析引擎,2009年誕生于加州大學伯克利分校amplab,2010年開源,2013年6月成為apache孵化項目,2014年2月成為apache頂級項目。目前,spark生态系統已經發展成為一個包含多個子項目的集合,其中包含sparksql、spark streaming、graphx、mllib等子項目,spark是基于記憶體計算的大資料并行計算架構。spark基于記憶體計算,提高了在大資料環境下資料處理的實時性,同時保證了高容錯性和高可伸縮性,允許使用者将spark部署在大量廉價硬體之上,形成叢集。spark得到了衆多大資料公司的支援,這些公司包括hortonworks、ibm、intel、cloudera、mapr、pivotal、百度、阿裡、騰訊、京東、攜程、優酷洋芋。目前百度的spark已應用于鳳巢、大搜尋、直達号、百度大資料等業務;阿裡利用graphx建構了大規模的圖計算和圖挖掘系統,實作了很多生産系統的推薦算法;騰訊spark叢集達到8000台的規模,是目前已知的世界上最大的spark叢集。
在這裡必須對比mapreduce,mapreduce最大的性能短闆就在于shuffle過程中,會将中間結果輸出到磁盤上(也就是hdfs上),這個過程中至少會産生6次的io。也正是這些頻繁的io使得mr的性能不盡人意。
對于spark來說,中間結果是都在記憶體中的(checkpoint另說),就從這點來說,就少了很多io導緻的性能問題。當然這隻是其中一點,後面會細說
與hadoop的mapreduce相比,spark基于記憶體的運算速度要快100倍以上,即使,spark基于硬碟的運算也要快10倍。spark實作了高效的dag執行引擎,進而可以通過記憶體來高效處理資料流。
spark支援java、python和scala的api,還支援超過80種進階算法,使使用者可以快速建構不同的應用。而且spark支援互動式的python和scala的shell,可以非常友善地在這些shell中使用spark叢集來驗證解決問題的方法。
spark提供了統一的解決方案。spark可以用于批處理、互動式查詢(spark sql)、實時流處理(spark streaming)、機器學習(spark mllib)和圖計算(graphx)。這些不同類型的處理都可以在同一個應用中無縫使用。spark統一的解決方案非常具有吸引力,畢竟任何公司都想用統一的平台去處理遇到的問題,減少開發和維護的人力成本和部署平台的物力成本。
另外spark還可以很好的融入hadoop的體系結構中可以直接操作hdfs,并提供hive on spark、pig on spark的架構內建hadoop。
spark可以非常友善地與其他的開源産品進行融合。比如,spark可以使用hadoop的yarn和apache mesos作為它的資源管理和排程器,并且可以處理所有hadoop支援的資料,包括hdfs、hbase和cassandra等。這對于已經部署hadoop叢集的使用者特别重要,因為不需要做任何資料遷移就可以使用spark的強大處理能力。spark也可以不依賴于第三方的資源管理和排程器,它實作了standalone作為其内置的資源管理和排程架構,這樣進一步降低了spark的使用門檻,使得所有人都可以非常容易地部署和使用spark。此外,spark還提供了在ec2上部署standalone的spark叢集的工具。
spark生态圈:
spark core :最重要,其中最重要的是 rdd (彈性分布式資料集)
spark sql :類似于hive 使用sql語句操作rdd dataframe(表)
spark streaming : 流式計算
前面三個用到比較多,後面這兩個看需求吧
spark mllib :spark機器學習類庫
spark graphx : 圖計算
圖2.1 spark架構
spark大緻有幾個大元件,分别為:driver、master(cluster manager)、worker。
圖2.2 spark工作任務圖
上面這圖說明了每個元件的功能。
spark可以部署在以上幾種環境之上:
standalone:spark内置的資料總管
yarn:hadoop的資料總管
mesos
amazon ec2
使用scala版本為scala2.11.8,spark版本為spark-2.1.0-bin-hadoop2.7。
jdk版本1.8,hadoop版本2.8.4
解壓好spark程式之後,進入解壓目錄下。修改配置檔案:
配置完成後,啟動叢集:
基本和僞分布式是一樣的,也就是 conf/slaves檔案中配置多幾個worker節點而已,然後照樣啟動叢集就ok了。
搭建完成了可以進入 http://masterip:8080 檢視叢集狀态
在spark中,master節點作為整個叢集的管理者,是單點的,容易發生單點故障,是以為了保障master節點的可用性,需要給它實作ha
主要用于開發或測試環境。spark提供目錄儲存spark application和worker的注冊資訊,并将他們的恢複狀态資訊寫入該目錄中,這時,一旦master發生故障,就可以通過重新啟動master程序(sbin/start-master.sh),恢複已運作的spark application和worker的注冊資訊。
基于檔案系統的單點恢複,主要是在spark-env.sh裡spark_daemon_java_opts設定以下内容:
要注意的是,這種方式本質上還是隻有一個master節點,隻不過是重新開機master節點時可以自動還原worker以及application資訊,防止master挂了之後,所有任務都丢失執行狀态,然後master重新開機之後需要重新從頭到尾執行之前的任務。
zookeeper提供了一個leader election機制,利用這個機制可以保證雖然叢集存在多個master,但是隻有一個是active的,其他的都是standby。當active的master出現故障時,另外的一個standby master會被選舉出來。由于叢集的資訊,包括worker, driver和application的資訊都已經持久化到zookeeper,是以在切換的過程中隻會影響新job的送出,對于正在進行的job沒有任何的影響。
這裡分别用兩台主機配置master節點,而worker節點仍然是單節點(為了友善起見而已)。首先需保證zookeeper服務的正常運作。這裡不重複講,可以看之前zookeeper的文章。這裡直接講spark 的配置。
修改spark-env.sh配置檔案
以上配置需要保證在整個spark叢集的所有master和worker節點所在主機的配置一樣。
配置完成後,啟動叢集
啟動完成後,可以到兩個master的管理頁面上看對應的狀态:
接着我們看看zookeeper上存儲什麼資訊:
spark提供了一些執行個體程式,
spark提供了兩個工具用于送出執行spark任務,分别是spark-shell和spark-submit
一般用在生産環境中用于送出任務到叢集中執行
例子:蒙特卡羅求pi
一般在生産環境中,在ide中編寫完spark程式後,會打包成jar包,然後上傳到叢集中。通過上面的spark-submit指令,将任務送出至叢集中執行
spark-shell是spark自帶的互動式shell程式,友善使用者進行互動式程式設計,使用者可以在該指令行下用scala編寫spark程式。一般用于測試
有兩種運作模式:
例子:在spark shell中編寫wordcount程式
首先需要idea配置好scala開發環境。
到插件中心安裝scala插件。
建立maven工程,然後add framework support添加scala支援
到project structure添加scala源碼檔案夾
最後右鍵就可以看到可以建立scala class 的選項了。
注意:本地得安裝scala以及jdk
配置好scala環境後,需要添加spark對應的maven依賴,添加依賴到pom.xml中:
記住上面的關于build的配置千萬不要漏掉。這裡說說我之前的遇到的小坑。
小坑:
wordcount執行個體代碼: