一些概念之二

【Spark簡介】

Apache Spark是一個圍繞速度、易用性和復(fù)雜分析構(gòu)建的大數(shù)據(jù)處理框架。最初在2009年由加州大學(xué)伯克利分校的AMPLab開發(fā),并于2010年成為Apache的開源項(xiàng)目之一。Spark作為Apache頂級的開源項(xiàng)目,是一個快速、通用的大規(guī)模數(shù)據(jù)處理引擎,和Hadoop的MapReduce計(jì)算框架類似,但是相對于MapReduce,Spark憑借其可伸縮、基于內(nèi)存計(jì)算等特點(diǎn),以及可以直接讀寫Hadoop上任何格式數(shù)據(jù)的優(yōu)勢,進(jìn)行批處理時更加高效,并有更低的延遲。Spark已經(jīng)成為輕量級大數(shù)據(jù)快速處理的統(tǒng)一平臺,各種不同的應(yīng)用,如實(shí)時流處理、機(jī)器學(xué)習(xí)、交互式查詢等,都可以通過Spark建立在不同的存儲和運(yùn)行系統(tǒng)上。相對于MapReduce上的批量計(jì)算、迭代型計(jì)算以及基于Hive的SQL查詢,Spark可以帶來上百倍的性能提升。

【Spark生態(tài)系統(tǒng)組件】

Spark Core:整個生態(tài)系統(tǒng)的核心組件,是一個分布式大數(shù)據(jù)處理框架。Spark Core提供了多種資源調(diào)度管理,通過內(nèi)存計(jì)算、有向無環(huán)圖(DAG)等機(jī)制保證分布式計(jì)算的快速,并引入了RDD的抽象保證數(shù)據(jù)的高容錯性。
Spark Streaming:基于微批量方式的計(jì)算和處理,可以用于對實(shí)時數(shù)據(jù)流進(jìn)行高吞吐、高容錯的流式處理。
Spark SQL:通過JDBC API將Spark數(shù)據(jù)集暴露出去,而且還可以用傳統(tǒng)的BI和可視化工具在Spark數(shù)據(jù)上執(zhí)行類似SQL的查詢。用戶還可以用Spark SQL對不同格式的數(shù)據(jù)執(zhí)行ETL,將其轉(zhuǎn)化暴露給特定的查詢。
Spark MLlib:一個可擴(kuò)展的Spark機(jī)器學(xué)習(xí)庫,由通用的學(xué)習(xí)算法和工具組成。打通數(shù)據(jù)收集、數(shù)據(jù)清理、特征提取,模型訓(xùn)練,測試、評估整個流程。
Spark GraphX:用于圖計(jì)算和并行圖計(jì)算的API。通過引入彈性分布式屬性圖,一種頂點(diǎn)和邊都帶有屬性的有向多重圖,擴(kuò)展了Spark RDD。

【Spark應(yīng)用場景】

1、快速查詢系統(tǒng):基于日志數(shù)據(jù)的快速查詢系統(tǒng)業(yè)務(wù)構(gòu)建于Spark之上,利用其快速查詢以及內(nèi)存表等優(yōu)勢,能夠承擔(dān)大部分日志數(shù)據(jù)的即時查詢工作;在性能方面,普遍比Hive快2~10倍,如果使用內(nèi)存表的功能,性能將會比Hive快百倍。
2、實(shí)時日志采集處理:通過Spark Streaming實(shí)時進(jìn)行業(yè)務(wù)日志采集,快速迭代處理,并進(jìn)行綜合分析,能夠滿足線上系統(tǒng)分析要求。
3、業(yè)務(wù)推薦系統(tǒng):使用Spark將業(yè)務(wù)推薦系統(tǒng)的小時和天級別的模型訓(xùn)練轉(zhuǎn)變?yōu)榉昼娂墑e的模型訓(xùn)練,有效優(yōu)化相關(guān)排名、個性化推薦以及熱點(diǎn)點(diǎn)擊分析等。
4、定制廣告系統(tǒng):在定制廣告業(yè)務(wù)方面需要大數(shù)據(jù)做應(yīng)用分析、效果分析、定向優(yōu)化等,借助Spark快速迭代的優(yōu)勢,實(shí)現(xiàn)了“數(shù)據(jù)實(shí)時采集、算法實(shí)時訓(xùn)練、系統(tǒng)實(shí)時預(yù)測”的流程,支持上億的請求量處理;模擬廣告投放計(jì)算效率高、延遲小,同MapReduce相比延遲至少降低一個數(shù)量級。

【Spark四大特性】

1、速度快:與Hadoop的MapReduce相比,Spark基于內(nèi)存的運(yùn)算要快100倍以上;而基于磁盤的運(yùn)算也要快10倍以上。Spark實(shí)現(xiàn)了高效的DAG執(zhí)行引擎,可以通過基于內(nèi)存來高效地處理數(shù)據(jù)流。
2、易使用:支持Java、Python和Scala的API,還支持超過80種高級算法,使用戶可以快速構(gòu)建不同應(yīng)用。
3、通用性:Spark提供了統(tǒng)一的解決方案。Spark可以用于批處理、交互式查詢(Spark SQL)、實(shí)時流處理(Spark Streaming)、機(jī)器學(xué)習(xí)(通過Spark MLlib)和圖計(jì)算(Spark GraphX)。
這些不同類型的處理都可以在同一應(yīng)用中無縫使用。Spark統(tǒng)一的解決方案非常具有吸引力,畢竟任何公司都想用統(tǒng)一的平臺處理問題,減少開發(fā)和維護(hù)的人力成本和部署平臺的物理成本。
4、兼容性:Spark可以非常方便地與其他開源產(chǎn)品進(jìn)行融合。比如,可以使用Hadoop的YARN作為它的資源管理和調(diào)度器,并且可以處理所有Hadoop支持的數(shù)據(jù),包括HDFS、HBase等。這對于已部署Hadoop集群的用戶特別重要,因?yàn)椴恍枰鋈魏螖?shù)據(jù)遷移就可以使用Spark強(qiáng)大的處理能力。Spark也可以不依賴第三方的資源管理器和調(diào)度器,它實(shí)現(xiàn)了Standalone作為其內(nèi)置資源管理器和調(diào)度框架。

【Spark基本架構(gòu)】

Cluster Manager:Spark的集群管理器,主要負(fù)責(zé)資源的分配與管理。集群管理器分配的資源屬于一級分配,它將各個Worker上的內(nèi)存、CPU等資源分配給應(yīng)用程序,但是并不負(fù)責(zé)對Executor的資源分配。目前,Standalone、YARN、Mesos、EC2等都可以作為Spark的集群管理器。
Worker:Spark的工作節(jié)點(diǎn)。對Spark應(yīng)用程序來說,由集群管理器分配得到資源的Worker節(jié)點(diǎn)主要負(fù)責(zé)以下工作:創(chuàng)建Executor,將資源和任務(wù)進(jìn)一步分配給Executor,同步資源信息給Cluster Manager。
Executor:執(zhí)行計(jì)算任務(wù)的一線進(jìn)程。主要負(fù)責(zé)任務(wù)的執(zhí)行以及與Worker、Driver App的信息同步。
Driver App:客戶端驅(qū)動程序,也可以理解為客戶端應(yīng)用程序,用于將任務(wù)程序轉(zhuǎn)換為RDD和DAG,并與Cluster Manager進(jìn)行通信與調(diào)度。

【Spark三種部署方式】

1、Standalone模式:Spark框架自帶了完整的資源調(diào)度管理服務(wù),可以獨(dú)立部署到一個集群中,而不需要依賴其他系統(tǒng)來為其提供資源管理調(diào)度服務(wù)。在架構(gòu)的設(shè)計(jì)上,Spark與MapReduce1.0完全一致,都是由一個Master和若干個Slave構(gòu)成,并且以槽(slot)作為資源分配單位。不同的是,Spark中的槽不再像MapReduce1.0那樣分為Map槽和Reduce槽,而是只設(shè)計(jì)了統(tǒng)一的一種槽提供給各種任務(wù)來使用。
2、Spark on Mesos模式:Mesos是一種資源調(diào)度管理框架,可以為運(yùn)行在它上面的Spark提供服務(wù)。Spark on Mesos模式中,Spark程序所需要的各種資源,都由Mesos負(fù)責(zé)調(diào)度。
3、Spark on YARN模式:Spark可運(yùn)行于YARN之上,與Hadoop進(jìn)行統(tǒng)一部署,即“Spark on YARN”,依賴于YARN的資源管理和調(diào)度依賴,分布式存儲則依賴HDFS。

【Spark一些基本概念】

RDD:Resillient Distributed Dataset(彈性分布式數(shù)據(jù)集)的簡稱,是分布式內(nèi)存的一個抽象概念,提供了一種高度受限的共享內(nèi)存模型。
DAG:是Directed Acyclic Graph(有向無環(huán)圖)的簡稱,反映RDD之間的依賴關(guān)系。
Executor:是運(yùn)行在工作節(jié)點(diǎn)(WorkerNode)的一個進(jìn)程,負(fù)責(zé)運(yùn)行Task。
Application:用戶編寫的Spark應(yīng)用程序。
Task:運(yùn)行在Executor上的工作單元。
Job:一個Job包含多個RDD及作用于相應(yīng)RDD上的各種操作。
Stage:是Job的基本調(diào)度單位,一個Job會分為多組Task,每組Task被稱為Stage,或者也被稱為TaskSet,代表了一組關(guān)聯(lián)的、相互之間沒有Shuffle依賴關(guān)系的任務(wù)組成的任務(wù)集。

【Spark RDD設(shè)計(jì)背景】

許多迭代式算法(比如機(jī)器學(xué)習(xí)、圖算法等)和交互式數(shù)據(jù)挖掘工具,共同之處是,不同計(jì)算階段之間會重用中間結(jié)果。目前的MapReduce框架都是把中間結(jié)果寫入到HDFS中,帶來了大量的數(shù)據(jù)復(fù)制、磁盤IO和序列化開銷。RDD就是為了滿足這種需求而出現(xiàn)的,它提供了一個抽象的數(shù)據(jù)架構(gòu),不必關(guān)心底層數(shù)據(jù)的分布式特性,只需將具體的應(yīng)用邏輯表達(dá)為一系列轉(zhuǎn)換處理,不同RDD之間的轉(zhuǎn)換操作形成依賴關(guān)系,可以實(shí)現(xiàn)管道化,避免中間數(shù)據(jù)存儲。一個RDD就是一個分布式對象集合,本質(zhì)上是一個只讀的分區(qū)記錄集合,每個RDD可分成多個分區(qū),每個分區(qū)就是一個數(shù)據(jù)集片段,并且一個RDD的不同分區(qū)可以被保存到集群中不同的節(jié)點(diǎn)上,從而可以在集群中的不同節(jié)點(diǎn)上進(jìn)行并行計(jì)算。

【Spark RDD基本概念】

RDD是一種高度受限的共享內(nèi)存模型,即RDD是只讀的記錄分區(qū)的集合,不能直接修改,只能基于穩(wěn)定的物理存儲中的數(shù)據(jù)集創(chuàng)建RDD,或者通過在其他RDD上執(zhí)行確定的轉(zhuǎn)換操作(如map、join和group by)而創(chuàng)建得到新的RDD。RDD提供了豐富的操作以支持常見的數(shù)據(jù)運(yùn)算,分為“動作”(Action)和“轉(zhuǎn)換”(Transformation)兩種類型。RDD提供的轉(zhuǎn)換接口都非常簡單,都是類似map、filter、groupBy、join等粗粒度的數(shù)據(jù)轉(zhuǎn)換操作,而不是針對某個數(shù)據(jù)項(xiàng)的細(xì)粒度修改。RDD典型的執(zhí)行過程如下:1、RDD讀入外部數(shù)據(jù)源進(jìn)行創(chuàng)建。2、RDD經(jīng)過系列的轉(zhuǎn)換(Transformation)操作,每一次都會產(chǎn)生不同的RDD,供給下一個轉(zhuǎn)換操作使用。3、最后一個RDD經(jīng)過“動作”操作進(jìn)行轉(zhuǎn)換,并輸出到外部數(shù)據(jù)源。

【Spark任務(wù)運(yùn)行流程】

1、首先為應(yīng)用構(gòu)建起基本的運(yùn)行環(huán)境,即由Driver創(chuàng)建一個SparkContext,進(jìn)行資源的申請、任務(wù)的分配和監(jiān)控。
2、資源管理器為Executor分配資源,并啟動Executor進(jìn)程。
3、SparkContext根據(jù)RDD的依賴關(guān)系構(gòu)建DAG圖,DAG圖提交給DAGScheduler解析成Stage,然后把一個個TaskSet提交給底層調(diào)度器TaskScheduler處理;Executor向SparkContext申請Task,Task Scheduler將Task發(fā)放給Executor運(yùn)行,并提供應(yīng)用程序代碼。
4、Task在Executor上運(yùn)行,把執(zhí)行結(jié)果反饋給TaskScheduler和DAGScheduler,運(yùn)行完畢后寫入數(shù)據(jù)并釋放所有資源。


Spark運(yùn)行流程圖.PNG

【RDD間的依賴關(guān)系】

窄依賴:表現(xiàn)為一個父RDD的分區(qū)對應(yīng)于一個子RDD的分區(qū)或多個父RDD的分區(qū)對應(yīng)于一個子RDD的分區(qū).
寬依賴:表現(xiàn)為存在一個父RDD的一個分區(qū)對應(yīng)一個子RDD的多個分區(qū)。
Spark通過分析各個RDD的依賴關(guān)系生成了DAG,再通過分析各個RDD中的分區(qū)之間的依賴關(guān)系來決定如何劃分Stage,具體劃分方法是:

  1. 在DAG中進(jìn)行反向解析,遇到寬依賴就斷開
  2. 遇到窄依賴就把當(dāng)前的RDD加入到Stage中
  3. 將窄依賴盡量劃分在同一個Stage中,可以實(shí)現(xiàn)流水線計(jì)算

【Stage的類型】

Spark Stage的類型包括兩種:ShuffleMapStage和ResultStage,具體如下:

  1. ShuffleMapStage:不是最終的Stage,在它之后還有其他Stage,所以,它的輸出一定需要經(jīng)過Shuffle過程,并作為后續(xù)Stage的輸入;這種Stage是以Shuffle為輸出邊界,其輸入邊界可以是從外部獲取數(shù)據(jù),也可以是另一個ShuffleMapStage的輸出,其輸出可以是另一個Stage的開始;在一個Job里可能有該類型的Stage,也可能沒有該類型Stage;
  2. ResultStage:最終的Stage,沒有輸出,而是直接產(chǎn)生結(jié)果或存儲。這種Stage是直接輸出結(jié)果,其輸入邊界可以是從外部獲取數(shù)據(jù),也可以是另一個ShuffleMapStage的輸出。在一個Job里必定有該類型Stage。因此,一個Job含有一個或多個Stage,其中至少含有一個ResultStage。

【Spark RDD算子】

Spark 算子大致可以分為以下兩類:
1、Transformation 變換/轉(zhuǎn)換算子:這種變換并不觸發(fā)提交作業(yè),完成作業(yè)中間過程處理。
Transformation 操作是延遲計(jì)算的,也就是說從一個RDD 轉(zhuǎn)換生成另一個 RDD 的轉(zhuǎn)換操作不是馬上執(zhí)行,需要等到有 Action 操作的時候才會真正觸發(fā)運(yùn)算。典型算子:map、flatMap、filter、reduceByKey。
2、Action 行動算子:這類算子會觸發(fā) SparkContext 提交 Job 作業(yè)。
Action 算子會觸發(fā) Spark 提交作業(yè)(Job),并將數(shù)據(jù)輸出 Spark系統(tǒng)。典型算子:take、count、savaAsTextFile等。
從小方向來說,Spark 算子大致可以分為以下三類:
1、Value數(shù)據(jù)類型的Transformation算子,這種變換并不觸發(fā)提交作業(yè),針對處理的數(shù)據(jù)項(xiàng)是Value型的數(shù)據(jù)。
2、Key-Value數(shù)據(jù)類型的Transfromation算子,這種變換并不觸發(fā)提交 作業(yè),針對處理的數(shù)據(jù)項(xiàng)是Key-Value型的數(shù)據(jù)對。
3、Action算子,這類算子會觸發(fā)SparkContext提交Job作業(yè)。

【RDD持久化工作原理】

Spark非常重要的一個功能特性就是可以將RDD 持久化在內(nèi)存中,當(dāng)對RDD執(zhí)行持久化操作時,每個節(jié)點(diǎn)都會將自己操作的RDD的partition持久化到內(nèi)存中,并且在之后對該RDD的反復(fù)使用中,直接使用內(nèi)存緩存的partition,這樣針對一個RDD反復(fù)執(zhí)行多個操作的場景,就只要對RDD計(jì)算一次即可,后面直接使用該RDD ,而不需要計(jì)算多次該RDD。RDD持久化對于迭代式算法和快速交互式應(yīng)用來說是非常重要的。
要持久化一個RDD,只要調(diào)用其cache()或者persist()方法即可。在該RDD第一次被計(jì)算出來時,就會直接緩存在每個節(jié)點(diǎn)中。Spark的持久化機(jī)制是自動容錯的,如果持久化的RDD的任何partition丟失了,那么Spark會自動通過其源RDD,使用transformation操作重新計(jì)算該partition。
cache()和persist()的區(qū)別在于,cache()是persist()的一種簡化方式,cache()的底層就是調(diào)用的persist()的無參版本,同時就是調(diào)用persist(MEMORY_ONLY),將數(shù)據(jù)持久化到內(nèi)存中。如果需要從內(nèi)存中去除緩存,那么可以使用unpersist()方法。

【RDD持久化策略】

  1. MEMORY_ONLY:以非序列化的Java對象的方式持久化在JVM內(nèi)存中。如果內(nèi)存無法完全存儲RDD所有的partition,那么那些沒有持久化的partition就會在下一次需要使用它的時候,重新被計(jì)算。
  2. MEMORY_AND_DISK:同上,但是當(dāng)某些partition無法存儲在內(nèi)存中時,會持久化到磁盤中。下次需要使用這些partition時,需要從磁盤上讀取。
  3. MEMORY_ONLY_SER:同MEMORY_ONLY,但是會使用Java序列化方式,將Java對象序列化后進(jìn)行持久化。可以減少內(nèi)存開銷,但是需要進(jìn)行反序列化,因此會加大CPU開銷。
  4. MEMORY_AND_DSK_SER:同MEMORY_AND_DSK。但是使用序列化方式持久化Java對象。
  5. DISK_ONLY:使用非序列化Java對象的方式持久化,完全存儲到磁盤上。
  6. MEMORY_ONLY_2或者M(jìn)EMORY_AND_DISK_2等:如果是尾部加了2的持久化級別,表示會將持久化數(shù)據(jù)復(fù)用一份,保存到其他節(jié)點(diǎn),從而在數(shù)據(jù)丟失時,不需要再次計(jì)算,只需要使用備份數(shù)據(jù)即可。

【RDD持久化策略選擇原則】

Spark 的存儲級別的選擇,核心問題是在內(nèi)存使用率和 CPU 效率之間進(jìn)行權(quán)衡。建議按下面的過程進(jìn)行存儲級別的選擇 :

  1. 如果使用默認(rèn)的存儲級別(MEMORY_ONLY),存儲在內(nèi)存中的 RDD 沒有發(fā)生溢出,那么就選擇默認(rèn)的存儲級別。默認(rèn)存儲級別可以最大程度的提高 CPU 的效率,可以使在 RDD 上的操作以最快的速度運(yùn)行。
  2. 如果內(nèi)存不能全部存儲 RDD,那么使用 MEMORY_ONLY_SER,并挑選一個快速序列化庫將對象序列化,以節(jié)省內(nèi)存空間。使用這種存儲級別,計(jì)算速度仍然很快。
  3. 除了在計(jì)算該數(shù)據(jù)集的代價特別高,或者在需要過濾大量數(shù)據(jù)的情況下,盡量不要將溢出的數(shù)據(jù)存儲到磁盤。因?yàn)?,重新?jì)算這個數(shù)據(jù)分區(qū)的耗時與從磁盤讀取這些數(shù)據(jù)的耗時差不多。
  4. 如果想快速還原故障,建議使用多副本存儲級別(例如,使用 Spark 作為 web 應(yīng)用的后臺服務(wù),在服務(wù)出故障時需要快速恢復(fù)的場景下)。所有的存儲級別都通過重新計(jì)算丟失的數(shù)據(jù)的方式,提供了完全容錯機(jī)制。但是多副本級別在發(fā)生數(shù)據(jù)丟失時,不需要重新計(jì)算對應(yīng)的數(shù)據(jù)庫,可以讓任務(wù)繼續(xù)運(yùn)行。

【Spark共享變量】

Spark中的兩個重要抽象是RDD和共享變量。在默認(rèn)情況下,當(dāng)Spark在集群的多個不同節(jié)點(diǎn)的多個任務(wù)上并行運(yùn)行一個函數(shù)時,它會把函數(shù)中涉及到的每個變量,在每個任務(wù)上都生成一個副本,更新這些副本的值也不會影響驅(qū)動器中的對應(yīng)變量。但是有時候需要在多個任務(wù)之間共享變量,或者在任務(wù)(Task)和任務(wù)控制節(jié)點(diǎn)(Driver Program)之間共享變量。為了滿足這種需求,Spark提供了兩種類型的變量:廣播變量(broadcast variables)和累加器(accumulators)。廣播變量用來把變量在所有節(jié)點(diǎn)的內(nèi)存之間進(jìn)行共享。累加器則支持在所有不同節(jié)點(diǎn)之間進(jìn)行累加計(jì)算(比如計(jì)數(shù)或者求和)。

【廣播變量(broadcast variable)】

廣播變量用來高效分發(fā)較大的公共對象。如果要在分布式計(jì)算里面分發(fā)大對象,例如:字典,集合等,都由Driver端進(jìn)行分發(fā),廣播變量允許在每個機(jī)器上緩存一個只讀的變量,而不是為每個任務(wù)都生成一個副本。如果這個變量不是廣播變量,那么每個task就會分發(fā)一份,這在task數(shù)目十分多的情況下Driver的帶寬會成為系統(tǒng)的瓶頸,而且會大量消耗task服務(wù)器上的資源,如果將這個變量聲明為廣播變量,那么只是每個executor擁有一份,這個executor啟動的task會共享這個變量,節(jié)省了通信的成本和服務(wù)器的資源。通過這種方式,就可以非常高效地給每個節(jié)點(diǎn)提供一個大的輸入數(shù)據(jù)集的副本。Spark的“動作”操作會跨越多個階段(stage),對于每個階段內(nèi)的所有任務(wù)所需要的公共數(shù)據(jù),Spark都會自動進(jìn)行廣播,通過廣播方式進(jìn)行傳播的變量。廣播變量在Driver端定義,只能在Driver端改變廣播變量的值,Executor端無法修改。

【累加器(Accumulator)】

累加器用來對信息進(jìn)行聚合,累加器是僅僅被相關(guān)操作累加的變量,通??梢员挥脕韺?shí)現(xiàn)計(jì)數(shù)器(counter)和求和(sum)。Spark原生支持?jǐn)?shù)值型(numeric)的累加器,程序開發(fā)人員可以編寫對新類型的支持。如果創(chuàng)建累加器時指定了名字,則可以在Spark UI界面看到,這有利于理解每個執(zhí)行階段的進(jìn)程。
一個數(shù)值型的累加器,可以通過調(diào)用SparkContext.accumulator()來創(chuàng)建。運(yùn)行在集群中的任務(wù),就可以使用add方法來把數(shù)值累加到累加器上,但是,這些任務(wù)只能做累加操作,不能讀取累加器的值,只有任務(wù)控制節(jié)點(diǎn)(Driver Program)可以使用value方法來讀取累加器的值。
累加器提供了將工作節(jié)點(diǎn)中的值聚合到驅(qū)動器程序中的語法。解決driver和excutor端的數(shù)據(jù)不能共享的問題。累加器在Driver端定義賦初始值,且只能在Driver端讀取,在Excutor端更新。常用在調(diào)試時對作業(yè)執(zhí)行過程中的事件進(jìn)行計(jì)數(shù)。

【Spark SQL】

Spark SQL是Spark中用于結(jié)構(gòu)化數(shù)據(jù)處理的模塊。與基礎(chǔ)的Spark RDD API不同,Spark SQL的接口提供了更多關(guān)于數(shù)據(jù)的結(jié)構(gòu)信息和計(jì)算任務(wù)的運(yùn)行時信息。在Spark應(yīng)用中,可以無縫的使用SQL語句亦或是DataFrame API對結(jié)構(gòu)化數(shù)據(jù)進(jìn)程查詢。
Spark SQL有以下幾個特點(diǎn):

  1. 數(shù)據(jù)兼容:可從Hive表、外部數(shù)據(jù)庫(JDBC)、RDD、Parquet文件、JSON文件獲取數(shù)據(jù),可通過Scala方法或SQL方式操作這些數(shù)據(jù),并把結(jié)果轉(zhuǎn)回RDD。
  2. 組件擴(kuò)展:SQL語法解析器、分析器、優(yōu)化器均可重新定義。
  3. 性能優(yōu)化:內(nèi)存列存儲、動態(tài)字節(jié)碼生成等優(yōu)化技術(shù),內(nèi)存緩存數(shù)據(jù)。
  4. 多語言支持:Scala、Java、Python、R。

【Spark SQL的優(yōu)點(diǎn)】

1、集成:Apache Spark SQL將SQL查詢與Spark程序集成??梢詫⒔Y(jié)構(gòu)化數(shù)據(jù)作為分布式數(shù)據(jù)集(RDD)查詢,可以使用Spark SQL緊密集成屬性與復(fù)雜的分析算法一起運(yùn)行SQL查詢。
2、統(tǒng)一數(shù)據(jù)訪問:使用Spark SQL,可以加載和查詢不同來源數(shù)據(jù)。Schema-RDD允許單個接口高效處理結(jié)構(gòu)化數(shù)據(jù)。例如,Apache Hive tables, parquet files, and JSON files.
3、高兼容性:在Apache Spark SQL中,可以在現(xiàn)有倉庫上運(yùn)行未修改的Hive查詢,兼容現(xiàn)有Hive數(shù)據(jù)以及UDF。
4、標(biāo)準(zhǔn)連接:可通過JDBC或ODBC連接,包括具有行業(yè)標(biāo)準(zhǔn)JDBC和ODBC連接的服務(wù)器模式。
5、可擴(kuò)展性:為了支持查詢?nèi)蒎e和大型作業(yè),利用了RDD模型,使用相同的引擎進(jìn)行交互式查詢。
6、性能優(yōu)化:Spark SQL中的查詢優(yōu)化引擎在整個計(jì)劃中選擇最佳的執(zhí)行計(jì)劃。

【Spark SQL之DataFrame】

DataFrame是一個以命名列方式組織的分布式數(shù)據(jù)集。在概念上類似于關(guān)系型數(shù)據(jù)庫中的一張表。DataFrame讓Spark具備了處理大規(guī)模結(jié)構(gòu)化數(shù)據(jù)的能力,不僅比原有的RDD轉(zhuǎn)化方式更加簡單易用,而且獲得了更高的計(jì)算性能。RDD是分布式的 Java對象的集合,比如,RDD[Person]是以Person為類型參數(shù),但是,Person類的內(nèi)部結(jié)構(gòu)對于RDD而言卻是不可知的。DataFrame是一種以RDD為基礎(chǔ)的分布式數(shù)據(jù)集,也就是分布式的Row對象的集合(每個Row對象代表一行記錄),提供了詳細(xì)的結(jié)構(gòu)信息,也就是常說的模式(schema),Spark SQL可以清楚地知道該數(shù)據(jù)集中包含哪些列、每列的名稱和類型。和RDD一樣,DataFrame的各種變換操作也采用惰性機(jī)制,只是記錄了各種轉(zhuǎn)換的邏輯轉(zhuǎn)換路線圖(DAG圖),不會發(fā)生真正的計(jì)算,這個DAG圖相當(dāng)于一個邏輯查詢計(jì)劃,最終,會被翻譯成物理查詢計(jì)劃,生成RDD DAG,按照RDD DAG的執(zhí)行方式去完成最終的計(jì)算得到結(jié)果。

【Hive on Mapreduce VS SparkSQL】

適用場景上:Hive on Mapreduce的出現(xiàn)可以讓那些精通SQL技能、但是不熟悉MapReduce 、編程能力較弱與不擅長Java語言的用戶能夠在HDFS大規(guī)模數(shù)據(jù)集上很方便地利用SQL 語言查詢、匯總、分析數(shù)據(jù),畢竟精通SQL語言的人要比精通Java語言的多得多,Hive適合處理離線非實(shí)時數(shù)據(jù)。
SparkSQL既可以運(yùn)行本地local模式,也可以以Standalone、cluster等多種模式運(yùn)行在Yarn、Mesos上,還可以運(yùn)行在云端例如EC2。此外,Spark的數(shù)據(jù)來源非常廣泛,可以處理來自HDFS、HBase、 Hive、Cassandra、Tachyon上的各種類型的數(shù)據(jù)。適用于實(shí)時性要求或者速度要求較高的場所。
性能上:sparksql和hive on spark時間差不多,但都比hive on mapreduce快很多,官方數(shù)據(jù)認(rèn)為spark會被傳統(tǒng)mapreduce快10-100倍。

【Spark MLlib】

MLlib是Spark的機(jī)器學(xué)習(xí)(ML)庫。旨在簡化機(jī)器學(xué)習(xí)的工程實(shí)踐工作,并方便擴(kuò)展到更大規(guī)模。MLlib由一些通用的學(xué)習(xí)算法和工具組成,包括:1.機(jī)器學(xué)習(xí)算法:如常規(guī)機(jī)器學(xué)習(xí)算法包括分類、回歸、聚類和協(xié)同過濾。2.特征工程:特征提取、特征轉(zhuǎn)換、特征選擇以及降維。3.管道:構(gòu)造、評估和調(diào)整的管道的工具。4.存儲:保存和加載算法、模型及管道。5.實(shí)用工具:線性代數(shù),統(tǒng)計(jì),數(shù)據(jù)處理等。
MLlib目前分為兩個代碼包:spark.mllib 包含基于RDD的原始算法API。spark.ml 則提供了基于DataFrames 高層次的API,可以用來構(gòu)建機(jī)器學(xué)習(xí)管道。推薦使用spark.ml,因?yàn)榛贒ataFrames的API更加通用而且靈活,包括Spark數(shù)據(jù)源,SQL/DataFrame查詢,為多種機(jī)器學(xué)習(xí)算法與編程語言提供統(tǒng)一的API,DataFrames有助于實(shí)現(xiàn)機(jī)器學(xué)習(xí)管道,特別是特征轉(zhuǎn)換。spark2.0開始,基于RDD的API已經(jīng)進(jìn)入的維護(hù)模式。

【Spark Streaming】

Spark streaming是Spark核心API的一個擴(kuò)展,它對實(shí)時流式數(shù)據(jù)的處理具有可擴(kuò)展性、高吞吐量、可容錯性等特點(diǎn)??梢詮膋afka、flume、Twitter、ZeroMQ、Kinesis等源獲取數(shù)據(jù),也可以通過由高階函數(shù)map、reduce、join、window等組成的復(fù)雜算法計(jì)算出數(shù)據(jù)。最后,處理后的數(shù)據(jù)可以推送到文件系統(tǒng)、數(shù)據(jù)庫、實(shí)時儀表盤中,或者可以將處理后的數(shù)據(jù)應(yīng)用到Spark的機(jī)器學(xué)習(xí)算法、圖處理算法中去。(數(shù)據(jù)流是連續(xù)到達(dá)的無窮序列。流處理將不斷流動的輸入數(shù)據(jù)分成獨(dú)立的單元進(jìn)行處理。流處理是對流數(shù)據(jù)的低延遲處理和分析。實(shí)時處理用例包括:網(wǎng)站監(jiān)控,網(wǎng)絡(luò)監(jiān)控,欺詐識別,網(wǎng)頁點(diǎn)擊,廣告,物聯(lián)網(wǎng)傳感器等。)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容