天天看點

一、spark--spark基本概述一、spark概述二、spark體系架構和部署三、spark的demo程式運作

[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 : 圖計算

一、spark--spark基本概述一、spark概述二、spark體系架構和部署三、spark的demo程式運作

​ 圖2.1 spark架構

spark大緻有幾個大元件,分别為:driver、master(cluster manager)、worker。

一、spark--spark基本概述一、spark概述二、spark體系架構和部署三、spark的demo程式運作

​ 圖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執行個體代碼: