天天看點

《深入了解Spark:核心思想與源碼分析》——2.3節Spark基本設計思想

本節書摘來自華章社群《深入了解spark:核心思想與源碼分析》一書中的第2章,第2.3節spark基本設計思想,作者耿嘉安,更多章節内容可以通路雲栖社群“華章社群”公衆号檢視

2.3 spark基本設計思想

2.3.1 spark子產品設計

整個spark主要由以下子產品組成:

spark core:spark的核心功能實作,包括:sparkcontext的初始化(driver application通過sparkcontext送出)、部署模式、存儲體系、任務送出與執行、計算引擎等。

spark sql:提供sql處理能力,便于熟悉關系型資料庫操作的工程師進行互動查詢。此外,還為熟悉hadoop的使用者提供hive sql處理能力。

spark streaming:提供流式計算處理能力,目前支援kafka、flume、twitter、mqtt、zeromq、kinesis和簡單的tcp套接字等資料源。此外,還提供視窗操作。

graphx:提供圖計算處理能力,支援分布式,pregel提供的api可以解決圖計算中的常見問題。

mllib:提供機器學習相關的統計、分類、回歸等領域的多種算法實作。其一緻的api接口大大降低了使用者的學習成本。

spark sql、spark streaming、graphx、mllib的能力都是建立在核心引擎之上,如圖2-4所示。

《深入了解Spark:核心思想與源碼分析》——2.3節Spark基本設計思想

spark核心功能

spark core提供spark最基礎與最核心的功能,主要包括以下功能。

sparkcontext:通常而言,driver application的執行與輸出都是通過sparkcontext來完成的,在正式送出application之前,首先需要初始化sparkcontext。sparkcontext隐藏了網絡通信、分布式部署、消息通信、存儲能力、計算能力、緩存、測量系統、檔案服務、web服務等内容,應用程式開發者隻需要使用sparkcontext提供的api完成功能開發。sparkcontext内置的dagscheduler負責建立job,将dag中的rdd劃分到不同的stage,送出stage等功能。内置的taskscheduler負責資源的申請、任務的送出及請求叢集對任務的排程等工作。

存儲體系:spark優先考慮使用各節點的記憶體作為存儲,當記憶體不足時才會考慮使用磁盤,這極大地減少了磁盤i/o,提升了任務執行的效率,使得spark适用于實時計算、流式計算等場景。此外,spark還提供了以記憶體為中心的高容錯的分布式檔案系統tachyon供使用者進行選擇。tachyon能夠為spark提供可靠的記憶體級的檔案共享服務。

計算引擎:計算引擎由sparkcontext中的dagscheduler、rdd以及具體節點上的executor負責執行的map和reduce任務組成。dagscheduler和rdd雖然位于sparkcontext内部,但是在任務正式送出與執行之前會将job中的rdd組織成有向無關圖(簡稱dag),并對stage進行劃分,決定了任務執行階段任務的數量、疊代計算、shuffle等過程。

部署模式:由于單節點不足以提供足夠的存儲及計算能力,是以作為大資料處理的spark在sparkcontext的taskscheduler元件中提供了對standalone部署模式的實作和yarn、mesos等分布式資源管理系統的支援。通過使用standalone、yarn、mesos等部署模式為task配置設定計算資源,提高任務的并發執行效率。除了可用于實際生産環境的standalone、yarn、mesos等部署模式外,spark還提供了local模式和local-cluster模式便于開發和調試。

spark擴充功能

為了擴大應用範圍,spark陸續增加了一些擴充功能,主要包括:

spark sql:sql具有普及率高、學習成本低等特點,為了擴大spark的應用面,增加了對sql及hive的支援。spark sql的過程可以總結為:首先使用sql語句解析器(sqlparser)将sql轉換為文法樹(tree),并且使用規則執行器(ruleexecutor)将一系列規則(rule)應用到文法樹,最終生成實體執行計劃并執行。其中,規則執行器包括文法分析器(analyzer)和優化器(optimizer)。hive的執行過程與sql類似。

spark streaming:spark streaming與apache storm類似,也用于流式計算。spark streaming支援kafka、flume、twitter、mqtt、zeromq、kinesis和簡單的tcp套接字等多種資料輸入源。輸入流接收器(receiver)負責接入資料,是接入資料流的接口規範。dstream是spark streaming中所有資料流的抽象,dstream可以被組織為dstream graph。dstream本質上由一系列連續的rdd組成。

graphx:spark提供的分布式圖計算架構。graphx主要遵循整體同步并行(bulk synchronous parallell,bsp)計算模式下的pregel模型實作。graphx提供了對圖的抽象graph,graph由頂點(vertex)、邊(edge)及繼承了edge的edgetriplet(添加了srcattr和dstattr用來儲存源頂點和目的頂點的屬性)三種結構組成。graphx目前已經封裝了最短路徑、網頁排名、連接配接元件、三角關系統計等算法的實作,使用者可以選擇使用。

mllib:spark提供的機器學習架構。機器學習是一門涉及機率論、統計學、逼近論、凸分析、算法複雜度理論等多領域的交叉學科。mllib目前已經提供了基礎統計、分類、回歸、決策樹、随機森林、樸素貝葉斯、保序回歸、協同過濾、聚類、維數縮減、特征提取與轉型、頻繁模式挖掘、預言模型标記語言、管道等多種數理統計、機率論、資料挖掘方面的數學算法。

2.3.2 spark模型設計

spark程式設計模型

spark 應用程式從編寫到送出、執行、輸出的整個過程如圖2-5所示,圖中描述的步驟如下。

1)使用者使用sparkcontext提供的api(常用的有textfile、sequencefile、runjob、stop等)編寫driver application程式。此外sqlcontext、hivecontext及streamingcontext對spark-context進行封裝,并提供了sql、hive及流式計算相關的api。

2)使用sparkcontext送出的使用者應用程式,首先會使用blockmanager和broadcast-manager将任務的hadoop配置進行廣播。然後由dagscheduler将任務轉換為rdd并組織成dag,dag還将被劃分為不同的stage。最後由taskscheduler借助actorsystem将任務送出給叢集管理器(cluster manager)。

3)叢集管理器(cluster manager)給任務配置設定資源,即将具體任務配置設定到worker上,worker建立executor來處理任務的運作。standalone、yarn、mesos、ec2等都可以作為spark的叢集管理器。

rdd計算模型

rdd可以看做是對各種資料計算模型的統一抽象,spark的計算過程主要是rdd的疊代計算過程,如圖2-6所示。rdd的疊代計算過程非常類似于管道。分區數量取決于partition數量的設定,每個分區的資料隻會在一個task中計算。所有分區可以在多個機器節點的executor上并行執行。

《深入了解Spark:核心思想與源碼分析》——2.3節Spark基本設計思想

繼續閱讀