1. 程式人生 > 其它 >大資料開發之Spark入門

大資料開發之Spark入門

什麼是Spark?

·大資料的電花火石。

·Spark類似於MapReduce的低延遲的互動式計算框架。

·Spark是UC Berkeley AMPLab開發的是一種計算框架,分散式資源工作交由叢集管理軟體(Mesos、YARN)。

·Spark是處理海量資料的快速通用引擎​大資料培訓​。

Spark發展歷程

·Hadoop在2003年從Nutch發展到Lucene,在Yahoo成長,進入Apache孵化,2008年獲得大量使用。但一直存在MR演算法少、每次Reduce都需要磁碟讀寫、MR需要成對出現、Master節點排程慢、單節點等等問題。

·Spark2007年在Yahoo起步,用於改善MR演算法。

2009年獨立為一個專案,2010年開源,2013年進入Apache孵化。被稱為以下一代計算平臺。

·Berkeley大學成為大資料技術中心,Berkeley Data Analysis Stack(BDAS)逐步形成大資料平臺。

·2009:Spark誕生於伯克利大學 AMPLab

·2010:開源

·2013.6:Apache孵化器專案

·2014.2:Apache頂級專案

目前為止,釋出的最新版本為Spark2.4.0

Spark在最近6年內發展迅速,相較於其他大資料平臺或框架而言,Spark的程式碼庫最為活躍。

截止2015年6月

·Spark的Contributor比2014年漲了3倍,達到730人;

·總程式碼行數也比2014年漲了2倍多,達到40萬行;

·Spark應用也越來越廣泛,最大的叢集來自騰訊——8000個節點,單個Job最大分別是阿里巴巴和Databricks——1PB;

Spark特點

1.先進架構

·Spark採用Scala語言編寫,底層採用了actor model的akka作為通訊框架,程式碼十分簡潔高效。

·基於DAG圖的執行引擎,減少多次計算之間中間結果寫到Hdfs的開銷。

·建立在統一抽象的RDD(分散式記憶體抽象)之上,使得它可以以基本一致的方式應對不同的大資料處理場景。

2.高效

·提供Cache機制來支援需要反覆迭代的計算或者多次資料共享,減少資料讀取的IO開銷。

·與Hadoop的MapReduce相比,Spark基於記憶體的運算比MR要快100倍;而基於硬碟的運算也要快10倍!

3.易用

·Spark提供廣泛的資料集操作型別(20+種),不像Hadoop只提供了Map和Reduce兩種操作。

·Spark支援Java,Python和Scala API,支援互動式的Python和Scala的shell。

4.提供整體 解決方案

·以其RDD模型的強大表現能力,逐漸形成了一套自己的生態圈,提供了full-stack的解決方案。

·主要包括Spark記憶體中批處理,Spark SQL互動式查詢,Spark Streaming流式計算, GraphX和MLlib提供的常用圖計算和機器學習演算法。

5.與Hadoop無縫銜接

·Spark可以使用YARN作為它的叢集管理器。

·讀取HDFS,HBase等一切Hadoop的資料。

Spark整體架構

·Spark提供了多種高階工具: Shark SQL應用於即席查詢(Ad-hoc query)、Spark Streaming應用於流式計算、 MLlib應用於機器學習、GraphX應用於圖處理。

·Spark可以基於自帶的standalone叢集管理器獨立執行,也可以部署在Apache Mesos 和 Hadoop YARN 等叢集管理器上執行。

·Spark可以訪問儲存在HDFS、 Hbase、Cassandra、Amazon S3、本地檔案系統等等上的資料,Spark支援文字檔案,序列檔案,以及任何Hadoop的InputFormat。

Spark優勢

輕量級快速處理。Spark允許Hadoop叢集中的應用程式在記憶體中以100倍的速度執行,即使在磁碟上執行也能快10倍。Spark通過減少磁碟IO來達到效能提升,它將中間處理的資料全部放到了記憶體中。

·易於使用,Spark支援多語言。Spark支援Java、Scala及Python,這允許開發者在自己熟悉的語言環境下進行工作。

·支援複雜查詢。在簡單的“map”及”reduce”操作之外,Spark還支援SQL查詢、流式查詢及複雜查詢。

·實時的流處理。對比MapReduce只能處理離線資料,Spark支援實時的流計算。

·可以與Hadoop和已存Hadoop資料整合。

·支援mysql資料庫和HBase資料庫。

Spark適用場景

·目前大資料在網際網路公司主要把Spark應用在廣告、報表、推薦系統等業務上。

·在廣告業務方面需要大資料做應用分析、效果分析、定向優化等。

·在推薦系統方面則需要大資料優化相關排名、個性化推薦以及熱點點選分析等。

這些應用場景的普遍特點是計算量大、效率要求高。Spark恰恰滿足了這些要求。

總的來說Spark的適用面比較廣泛且比較通用。

Spark部署

·安裝Scala

·配置檔案:spark-env.sh

·部署的四種模式:Standalone、Spark On Yarn、Spark On Mesos、Spark On Cloud

Spark程式執行方式

·執行自帶樣例:run-example

·互動式:spark-shell

·提交到叢集:spark-submit spark-class

spark-submit引數:

--class 應用程式類名

--master spark master地址

--jars 依賴庫檔案

--executor-memory 記憶體

--total-executor-cores CPU core

Spark執行模式

目前Apache Spark支援四種分散式部署方式,分別是standalonespark on mesosspark on YARNSpark on cloud。

standalone模式,即獨立模式,自帶完整的服務,可單獨部署到一個叢集中,無需依賴任何其他資源管理系統。Spark在standalone模式下單點故障問題是藉助zookeeper實現的,思想類似於Hbase master單點故障解決方案。

Spark On Mesos模式,Spark執行在Mesos上會比執行在YARN上更加靈活,更加自然。在Spark On Mesos環境中,使用者可選擇兩種排程模式之一執行自己的應用程式,粗粒度模式(Coarse-grained Mode)和細粒度模式(Fine-grained Mode)。

Spark On YARN模式,這是一種最有前景的部署模式。但限於YARN自身的發展,目前僅支援粗粒度模式(Coarse-grained Mode)。

Spark On cloud模式,比如AWS的EC2,使用這種模式,方便的訪問Amazon的S3。

Spark on Standalone

·Master和Worker是standalone的角色,Driver和Executor是Spark的角色。

·Master負責分配資源,分配Driver和Executor,讓Worker啟動driver和executor,只管理到executor層,不涉及任務;

·Driver負責生成task,並與executor通訊,進行任務的排程和結果跟蹤,不涉及資源。

執行流程描述:

1.客戶端把作業釋出到Master

2.Master讓一個Worker啟動Driver,並將作業推送給Driver

3. Driver程序生成一系列task

4.Driver向Master申請資源

5.Master讓排程的Worker啟動Exeuctor

6. Exeuctor啟動後向Driver註冊

7.Driver將task排程到Exeuctor執行

8. Executor執行結果寫入檔案或返回Driver

執行流程描述

1. 客戶端啟動後直接執行使用者程式,啟動Driver

2. Driver程序生成一系列task

3. Driver向Master申請資源

4. Master讓排程的Worker啟動Exeuctor

5. Exeuctor啟動後向Driver註冊

6. Driver將task排程到Exeuctor執行

7. Executor執行結果寫入檔案或返回Driver

Spark on Yarn

·與Standalone類似,不過YARN架構更通用,可以在同一叢集部署Hadoop、Spark等。

·RM、NM和AM是YARN的角色,Driver和Executor是Spark的角色。

·RM負責資源分配,分配App Master和Executor;AM負責向RM申請資源,啟動Driver和啟動Executor。

·Driver負責task的生成,task的排程和結果跟蹤。

Driver執行在AM(Application Master):

1.客戶端把作業釋出到YARN

2. RM為該job在某個NM上分配一個AM,NM啟動AppMaster,App Master啟動Driver

3.AM啟動後完成初始化作業。Driver生成一系列Task

4.AM向RM申請資源,RM返回Executor資訊

5.AM通過RPC啟動相應的SparkExecutor

6.Driver向Executor分配task

7. Executor執行結果寫入檔案或返回Driver

Driver執行在Cleint :

1.客戶端啟動後直接執行使用者程式,直接啟動Driver

2. Driver初始化並生成一系列Task

3.客戶端將App Commands釋出到YARN

4. RM為該job在某個NM上分配一個AM

5.AM向RM申請資源,RM返回Executor資訊

6.AM通過RPC啟動相應的SparkExecutor

7.Exeuctor啟動後向Driver註冊

8.Driver向Executor分配task

9.Executor執行結果寫入檔案或返回Driver