大數(shù)據(jù)開發(fā):Spark入門詳解
眾所周知,Spark 它是專門為大規(guī)模數(shù)據(jù)處理而設(shè)計的快速通用計算引擎,因此Spark它在數(shù)據(jù)的挖掘等領(lǐng)域便有著非常廣泛的應(yīng)用,而從現(xiàn)階段來講的話它也已經(jīng)形成了一個高速發(fā)展并且應(yīng)用相當(dāng)廣泛的生態(tài)系統(tǒng)了。所以,今天這篇文章便要為大家做一個Spark入門基礎(chǔ)的簡單介紹,滿滿干貨,請不要錯過。
一.關(guān)于Spark的概述
我們可以了解到,當(dāng)前,MapReduce編程模型成為了一種比較主流的分布式編程模型,并且它也極大地方便了編程人員在不會分布式并行編程的情況下,能夠?qū)⒆约旱某绦蜻\行在分布式系統(tǒng)上。
但其實從MapReduce來看它也存在了一些缺陷的,比如說它的高延遲以及不支持DAG模型,Reduce的中間數(shù)據(jù)落地等。因此為了優(yōu)化改進MapReduce的項目,比如交互查詢引擎Impala、支持內(nèi)存計算Spark等這些方面。Spark憑借自身先進的設(shè)計理念,一躍成為了社區(qū)里面的熱門項目。而目前來看Spark相對于MapReduce的一些優(yōu)勢有:低延遲、支持DAG和分布式內(nèi)存計算。
二.Spark應(yīng)用框架
客戶Spark程序(Driver Program)操作Spark集群其實它是通過SparkContext這個對象來進行的,而SparkContext自身作為一個操作和調(diào)度的總?cè)肟?,它在初始化的過程中集群管理器則會進行DAGScheduler作業(yè)調(diào)度和TaskScheduler任務(wù)調(diào)度的創(chuàng)建。
而DAGScheduler作業(yè)調(diào)度模塊則又是依靠于Stage的這個調(diào)度模塊來進行的,DAG全稱 Directed Acyclic Graph。簡單的來講的話,它其實就是一個由頂點和有方向性的邊構(gòu)成的圖,然后他可以其中從任意的一個頂點去出發(fā),但是呢又沒有路徑可以將其帶回到出發(fā)的頂點。并且它為每個Spark Job計算具有依賴關(guān)系的多個Stage任務(wù)階段(通常根據(jù)Shuffle來劃分Stage,比如說groupByKey, reduceByKey等涉及到shuffle的transformation就會產(chǎn)生新的stage),然后到后面的時候它又會將每個Stage劃分為具體的一組任務(wù),最后就以TaskSets的形式提交給底層的任務(wù)調(diào)度模塊來進行一個具體執(zhí)行。
三.Spark的內(nèi)置項目
Spark Core: 它實現(xiàn)了的是Spark 中的一個基本功能,其中它是包含了任務(wù)的調(diào)度、內(nèi)存的管理、錯誤的恢復(fù)、以及與存儲系統(tǒng) 交互等模塊。其中Spark Core 中它還包含了對彈性分布式數(shù)據(jù)集(resilient distributed dataset,簡稱RDD)的 API 定義。
Spark SQL: 這個是 Spark 所用來進行操作結(jié)構(gòu)化數(shù)據(jù)的一個程序包。并且它通過了 Spark SQL,我們可以使用 SQL 或者 Apache Hive 版本的 SQL 方言(HQL)來查詢數(shù)據(jù)。而我們可以知道Spark SQL 支持多種數(shù)據(jù)源,比 如 Hive 表、Parquet 以及 JSON 等。
Spark Streaming: 這個是 Spark 提供的對實時數(shù)據(jù)進行流式計算的組件。提供了用來操作數(shù)據(jù)流的 API,并且與 Spark Core 中的 RDD API 高度對應(yīng)。
Spark MLlib: 提供常見的機器學(xué)習(xí)(ML)功能的程序庫。包括分類、回歸、聚類、協(xié)同過濾等,還提供了模型評估、數(shù)據(jù) 導(dǎo)入等額外的支持功能。
集群管理器: Spark 設(shè)計不僅可以高效地在一個計算節(jié)點到數(shù)千個計算節(jié)點之間伸縮計 算。為了實現(xiàn)這樣的要求,并且同時能夠獲得一個最大的靈活性,Spark 支持便會在各種集群管理器(cluster manager)上運行,包括 Hadoop YARN、Apache Mesos,以及 Spark 自帶的一個簡易調(diào)度器,它也叫作獨立調(diào)度器。
三.Spark生態(tài)圈介紹
Spark力圖整合機器學(xué)習(xí)(MLib)、圖算法(GraphX)、流式計算(Spark Streaming)和數(shù)據(jù)倉庫(Spark SQL)等領(lǐng)域,通過計算引擎Spark,彈性分布式數(shù)據(jù)集(RDD),架構(gòu)出一個新的大數(shù)據(jù)應(yīng)用平臺。
Spark生態(tài)圈以HDFS、S3、Techyon為底層存儲引擎,以Yarn、Mesos和Standlone作為資源調(diào)度引擎;使用Spark,可以實現(xiàn)MapReduce應(yīng)用;基于Spark,Spark SQL可以實現(xiàn)即席查詢,Spark Streaming可以處理實時應(yīng)用,MLib可以實現(xiàn)機器學(xué)習(xí)算法,GraphX可以實現(xiàn)圖計算,SparkR可以實現(xiàn)復(fù)雜數(shù)學(xué)計算。
四.Spark的優(yōu)點
①減少磁盤I/O:隨著實時大數(shù)據(jù)應(yīng)用越來越多,Hadoop作為離線的高吞吐、低響應(yīng)框架已不能滿足這類需求。HadoopMapReduce的map端將中間輸出和結(jié)果存儲在磁盤中,reduce端又需要從磁盤讀寫中間結(jié)果,勢必造成磁盤IO成為瓶頸。Spark允許將map端的中間輸出和結(jié)果存儲在內(nèi)存中,reduce端在拉取中間結(jié)果時避免了大量的磁盤I/O。Hadoop Yarn中的ApplicationMaster申請到Container后,具體的任務(wù)需要利用NodeManager從HDFS的不同節(jié)點下載任務(wù)所需的資源(如Jar包),這也增加了磁盤I/O。Spark將應(yīng)用程序上傳的資源文件緩沖到Driver本地文件服務(wù)的內(nèi)存中,當(dāng)Executor執(zhí)行任務(wù)時直接從Driver的內(nèi)存中讀取,也節(jié)省了大量的磁盤I/O。
②增加并行度:由于將中間結(jié)果寫到磁盤與從磁盤讀取中間結(jié)果屬于不同的環(huán)節(jié),Hadoop將它們簡單的通過串行執(zhí)行銜接起來。Spark把不同的環(huán)節(jié)抽象為Stage,允許多個Stage既可以串行執(zhí)行,又可以并行執(zhí)行。
③避免重新計算:當(dāng)Stage中某個分區(qū)的Task執(zhí)行失敗后,會重新對此Stage調(diào)度,但在重新調(diào)度的時候會過濾已經(jīng)執(zhí)行成功的分區(qū)任務(wù),所以不會造成重復(fù)計算和資源浪費。
④可選的Shuffle排序:HadoopMapReduce在Shuffle之前有著固定的排序操作,而Spark則可以根據(jù)不同場景選擇在map端排序或者reduce端排序。
⑤靈活的內(nèi)存管理策略:Spark將內(nèi)存分為堆上的存儲內(nèi)存、堆外的存儲內(nèi)存、堆上的執(zhí)行內(nèi)存、堆外的執(zhí)行內(nèi)存4個部分。Spark既提供了執(zhí)行內(nèi)存和存儲內(nèi)存之間是固定邊界的實現(xiàn),又提供了執(zhí)行內(nèi)存和存儲內(nèi)存之間是“軟”邊界的實現(xiàn)。Spark默認(rèn)使用“軟”邊界的實現(xiàn),執(zhí)行內(nèi)存或存儲內(nèi)存中的任意一方在資源不足時都可以借用另一方的內(nèi)存,最大限度的提高資源的利用率,減少對資源的浪費。Spark由于對內(nèi)存使用的偏好,內(nèi)存資源的多寡和使用率就顯得尤為重要,為此Spark的內(nèi)存管理器提供的Tungsten實現(xiàn)了一種與操作系統(tǒng)的內(nèi)存Page非常相似的數(shù)據(jù)結(jié)構(gòu),用于直接操作操作系統(tǒng)內(nèi)存,節(jié)省了創(chuàng)建的Java對象在堆中占用的內(nèi)存,使得Spark對內(nèi)存的使用效率更加接近硬件。Spark會給每個Task分配一個配套的任務(wù)內(nèi)存管理器,對Task粒度的內(nèi)存進行管理。Task的內(nèi)存可以被多個內(nèi)部的消費者消費,任務(wù)內(nèi)存管理器對每個消費者進行Task內(nèi)存的分配與管理,因此Spark對內(nèi)存有著更細(xì)粒度的管理。
以上本篇內(nèi)容便是對Spark的一些基礎(chǔ)入門的介紹,后續(xù)還將對Spark做一些后續(xù)的介紹,以便能更加深入的對Spark做一個了解。