Spark 快速入門

janlle發表於2019-04-24

Spark

Spark 背景

什麼是 Spark

官網:spark.apache.org

Spark是一種快速、通用、可擴充套件的大資料分析引擎,2009年誕生於加州大學伯克利分校AMPLab,2010年開源,2013年6月成為Apache孵化專案,2014年2月成為Apache頂級專案。目前,Spark生態系統已經發展成為一個包含多個子專案的集合,其中包含SparkSQL、Spark Streaming、GraphX、MLlib等子專案,Spark是基於記憶體計算的大資料平行計算框架。Spark基於記憶體計算,提高了在大資料環境下資料處理的實時性,同時保證了高容錯性和高可伸縮性,允許使用者將Spark部署在大量廉價硬體之上,形成叢集。

Spark與Hadoop

Spark是一個計算框架,而Hadoop中包含計算框架MapReduce和分散式檔案系統HDFS,Hadoop更廣泛地說還包括在其生態系統上的其他系統.

為什麼使用Spark?

Hadoop的MapReduce計算模型存在問題: Hadoop的MapReduce的核心是Shuffle(洗牌).在整個Shuffle的過程中,至少產生6次I/O流.基於MapReduce計算引擎通常會將結果輸出到次盤上,進行儲存和容錯.另外,當一些查詢(如:hive)翻譯到MapReduce任務是,往往會產生多個Stage,而這些Stage有依賴底層檔案系統來儲存每一個Stage的輸出結果,而I/O的效率往往較低,從而影響MapReduce的執行速度.

Spark的特點

與Hadoop的MapReduce相比,Spark基於記憶體的運算要快100倍以上,基於硬碟的運算也要快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 可以非常方便地與其他的開源產品進行融合。比如,Spark 可以使用Hadoop 的 YARN 和 Apache Mesos 作為它的資源管理和排程器.並且可以處理所有 Hadoop 支援的資料,包括 HDFS、HBase 和 Cassandra 等。這對於已經部署Hadoop 叢集的使用者特別重要,因為不需要做任何資料遷移就可以使用 Spark 的強大處理能力。Spark 也可以不依賴於第三方的資源管理和排程器,它實現了Standalone 作為其內建的資源管理和排程框架,這樣進一步降低了 Spark 的使用門檻,使得所有人都可以非常容易地部署和使用 Spark。此外,Spark 還提供了在EC2 上部Standalone 的 Spark 叢集的工具。

Spark的生態系統

  • Spark Core:

實現了 Spark 的基本功能,包含任務排程、記憶體管理、錯誤恢復、與儲存系統 互動等模組。Spark Core 中還包含了對彈性分散式資料集(resilient distributed dataset,簡稱RDD)的 API 定義。

  • Spark Streaming:

Spark Streaming基於微批量方式的計算和處理,可以用於處理實時的流資料.它使用DStream,簡單來說是一個彈性分散式資料集(RDD)系列,處理實時資料.資料可以從Kafka,Flume,Kinesis或TCP套接字等眾多來源獲取,並且可以使用由高階函式(如 map,reduce,join 和 window)開發的複雜演算法進行流資料處理。最後,處理後的資料可以被推送到檔案系統,資料庫和實時儀表板。

  • Spark SQL

SPark SQL可以通過JDBC API將Spark資料集暴露出去,而且還可以用傳統的BI和視覺化工具在Spark資料上執行類似SQL的查詢,使用者哈可以用Spark SQL對不同格式的資料(如Json, Parque以及資料庫等)執行ETl,將其轉化,然後暴露特定的查詢.

  • Spark MLlib

MLlib是一個可擴充套件的Spark機器學習庫,由通用的學習演算法和工具組成,包括二元分類、線性迴歸、聚類、協同過濾、梯度下降以及底層優化原語。

  • Spark Graphx:

GraphX是用於圖計算和並行圖計算的新的(alpha)Spark API。通過引入彈性分散式屬性圖(Resilient Distributed Property Graph),一種頂點和邊都帶有屬性的有向多重圖,擴充套件了Spark RDD。為了支援圖計算,GraphX暴露了一個基礎操作符集合(如subgraph,joinVertices和aggregateMessages)和一個經過優化的Pregel API變體。此外,GraphX還包括一個持續增長的用於簡化圖分析任務的圖演算法和構建器集合。

  • 叢集管理器:

Spark 設計為可以高效地在一個計算節點到數千個計算節點之間伸縮計 算。為了實現這樣的要求,同時獲得最大靈活性,Spark 支援在各種叢集管理器(cluster manager)上執行,包括 Hadoop YARN、Apache Mesos,以及 Spark 自帶的一個簡易排程 器,叫作獨立排程器。

Spark得到了眾多大資料公司的支援,這些公司包括Hortonworks、IBM、Intel、Cloudera、MapR、Pivotal、百度、阿里、騰訊、京東、攜程、優酷土豆。當前百度的Spark已應用於鳳巢、大搜尋、直達號、百度大資料等業務;阿里利用GraphX構建了大規模的圖計算和圖挖掘系統,實現了很多生產系統的推薦演算法;騰訊Spark叢集達到8000臺的規模,是當前已知的世界上最大的Spark叢集。

Spark 的使用者和用途

我們大致把Spark的用例分為兩類:資料科學應用和資料處理應用。也就對應的有兩種人群:資料科學家和工程師。

資料科學任務

主要是資料分析領域,資料科學家要負責分析資料並建模,具備 SQL、統計、預測建模(機器學習)等方面的經驗,以及一定的使用 Python、 Matlab 或 R 語言進行程式設計的能力。

資料處理應用

工程師定義為使用 Spark 開發 生產環境中的資料處理應用的軟體開發者,通過對接Spark的API實現對處理的處理和轉換等任務。

Spark架構中的基本元件:

  • Driver:執行Application的main() 函式並建立SparkContext

  • Worker:從節點,負責控制計算節點,啟動Ex而粗投入或Driver

  • SparkContext: 整個應用的上下文,監控應用的生命週期

  • SparkConf:負責儲存配置資訊。

  • Executor: 執行器,在worker node上執行任務元件,用於啟動執行緒執行任務.每個Application擁有獨立的一組Executors

  • ClusterManager:在standlone模式中即為Master(主節點),控制整個叢集.監控Worker.在Yarn模式中為資源管理器.

  • RDD:彈性分散式集合,spark的基本計算單元,一組RDD可形成執行的有向無環圖RDD Graph

  • DAG Scheduler: 根據作業(Job)構建基於Stage的DAG,並交給Stage給TaskScheduler

  • TaskScheduler:將任務(Task)分發給Executor執行

  • SparkEnv:執行緒級別的上下文,儲存執行時的重要元件的引用。SparkEnv內建立幷包含如下一些重要元件的引用。

  • MapOutPutTracker:負責Shuffle元資訊的儲存。

  • BroadcastManager:負責廣播變數的控制與元資訊的儲存。

  • BlockManager:負責儲存管理、建立和查詢塊。

  • MetricsSystem:監控執行時效能指標資訊。

Spark的整體流程:client提交應用,Master找到一個Worker啟動Driver,Driver向Master或者向資源管理器申請資源,之後將應用轉化為RDD Graph,再由DAGScheduler將RDD Graph轉化為Stage的有向無環圖提交給TaskScheduler,由TaskScheduler提交任務給Executor執行。在任務執行的過程中,其他元件協同工作,確保整個應用順利執行。

搭建 Spark 叢集

Spark的部署模式有Local、Local-Cluster、Standalone、Yarn、Mesos,我們選擇最具代表性的Standalone叢集部署模式。安裝java環境,Spark自動會把scala SDK打包到Spark中無需安裝scala環境

環境

linux: CentOS-7.5_x64 hadoop: hadoop-3.2.0 spark: spark-2.3.3 zookeeper: zookeeper-3.4.10

機器規劃

主機名 IP 安裝軟體 執行程式
node-1 192.168.91.11 spark Master
node-2 192.168.91.12 spark,zookeeper Worker,QuorumPeerMain
node-3 192.168.91.13 spark,zookeeper Worker,QuorumPeerMain
node-4 192.168.91.14 spark,zookeeper Worker,QuorumPeerMain

配置 Spark 環境


# 下載對應的Spark安裝包
$ wget http://mirrors.hust.edu.cn/apache/spark/spark-2.3.3/spark-2.3.3-bin-hadoop2.7.tgz

# 解壓縮
$ tar -zxvf spark-2.3.3-bin-hadoop2.7.tgz

# 進入spark解壓目錄
$ cd $SPARK_HOME

# 修改Spark的環境配置檔案
$ cp conf/spark-env.sh.template spark-env.sh
$ vim conf/spark-env.sh

# 新增如下配置
export JAVA_HOME=/usr/java/jdk1.8.0_191

# 修改slave的配置
$ cp $SPARK_HOME/conf/slaves.template slaves
$ vi slaves

# 在該檔案中新增子節點所在的位置(Worker節點)
node-2
node-3
node-4

# 將配置好的spark 複製到其他機器上(node-2,node-3,node-4)
$ scp -r spark-2.3.2-bin-hadoop2.7 root@node-2:/xxx/xxx

# 啟動spark叢集
$ sbin/start-master.sh
$ sbin/start-slaves.sh

# 也可以是用這個指令碼啟動所有機器
$ sbin/start-all.sh

複製程式碼

啟動後執行jps命令,主節點上有Master程式,其他子節點上有Work進行,登入Spark管理介面檢視叢集狀態(主節點):http://node-1:8080/

Spark 叢集 HA

機器規劃

主機名 IP 安裝軟體 執行程式
node-1 192.168.91.11 spark Master
node-2 192.168.91.12 spark,zookeeper Master,QuorumPeerMain
node-3 192.168.91.13 spark,zookeeper Worker,QuorumPeerMain
node-4 192.168.91.14 spark,zookeeper Worker,QuorumPeerMain

1.安裝配置zk叢集,並啟動zk叢集zookeeper安裝

2.修改spark的配置檔案新增如下配置

export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=node-2:2181,node-3:2181,node-4:2181 -Dspark.deploy.zookeeper.dir=/spark"
複製程式碼

3.修改所有節點的slaves檔案改為(node-3,node-4)節點

4.在node1上執行 sbin/start-all.sh,然後在 node-2 上啟動第二個 Master(sbin/start-master.sh )

執行第一個spark程式

$SPARK_HOME/bin/spark-submit --class org.apache.spark.examples.SparkPi --master spark://master-ip:7077 --executor-memory 1G --total-executor-cores 2 $SPARK_HOME/examples/jars/spark-examples_2.11-2.3.3.jar 100
複製程式碼

spark Shell

spark-shell是Spark自帶的互動式Shell程式,方便使用者進行互動式程式設計,使用者可以在該命令列下用scala編寫spark程式。

$SPARK_HOME/bin/spark-shell --master spark://node-1:7077 --executor-memory 2g --total-executor-cores 2
複製程式碼

引數說明:

# 指定Master的地址
--master spark://node-1:7077

# 指定每個worker可用記憶體為2G
--executor-memory 2g

# 指定整個叢集使用的cup核數為2個
--total-executor-cores 2

複製程式碼

注意

如果啟動spark shell時沒有指定master地址,但是也可以正常啟動spark shell和執行spark shell中的程式,其實是啟動了spark的local模式,該模式僅在本機啟動一個程式,沒有與叢集建立聯絡。 Spark Shell中已經預設將SparkContext類初始化為物件sc。使用者程式碼如果需要用到,則直接應用sc即可

spark shell中編寫WordCount

在spark shell中用scala語言編寫spark程式


# sc是SparkContext物件,該物件時提交spark程式的入口
sc.textFile("file:///root/data/words.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).saveAsTextFile("file:///root/data/output1")

# 從本地檔案系統中讀取資料
textFile("file:///root/data/words.txt")

# 讀取每一行資料並切分
flatMap(_.split(" "))

# 將資料切分對映將單詞和1構成元組
map((_,1))

# 按照key進行reduce,並將value累加
reduceByKey(_+_)

# 將結果寫入到指定位置
saveAsTextFile("file:///root/data/output1")

複製程式碼

相關文章