Spark初步大數(shù)據(jù)圖解分析挖掘

| 2022-09-07 admin

1.Spark是什么

學(xué)習(xí)或做大數(shù)據(jù)開發(fā)的同學(xué),都聽說或者使用過Spark,從這部分開始,ShowMeAI帶大家一起來學(xué)習(xí)一下Spark相關(guān)的知識。

Apache Spark是一種用于大數(shù)據(jù)工作負載的分布式開源處理系統(tǒng)。它使用內(nèi)存中緩存和優(yōu)化的查詢執(zhí)行方式,可針對任何規(guī)模的數(shù)據(jù)進行快速分析查詢。Spark基于內(nèi)存計算,提高了在大數(shù)據(jù)環(huán)境下數(shù)據(jù)處理的實時性,同時保證了高容錯性和高可伸縮性,允許用戶將Spark部署在大量的廉價硬件之上,形成集群。

圖解大數(shù)據(jù) | 大數(shù)據(jù)分析挖掘-Spark初步

2.Spark的特點

Apache Spark是個開源和兼容Hadoop的集群計算平臺。由加州大學(xué)伯克利分校的AMPLabs開發(fā),作為Berkeley Data Analytics Stack(BDAS)的一部分,當下由大數(shù)據(jù)公司Databricks保駕護航,更是Apache旗下的頂級項目。

1)Apache Spark堆棧中的不同組件

圖解大數(shù)據(jù) | 大數(shù)據(jù)分析挖掘-Spark初步

2)Apache Spark的優(yōu)勢

圖解大數(shù)據(jù) | 大數(shù)據(jù)分析挖掘-Spark初步

  • 更高的性能:因為數(shù)據(jù)被加載到集群主機的分布式內(nèi)存中。數(shù)據(jù)可以被快速的轉(zhuǎn)換迭代,并緩存用以后續(xù)的頻繁訪問需求。在數(shù)據(jù)全部加載到內(nèi)存的情況下,Spark有時能達到比Hadoop快100倍的數(shù)據(jù)處理速度,即使內(nèi)存不夠存放所有數(shù)據(jù)的情況也能快Hadoop 10倍。

  • 廣泛的支持與易用性:通過建立在Java、Scala、Python、SQL(應(yīng)對交互式查詢)的標準API以方便各行各業(yè)使用,同時還含有大量開箱即用的機器學(xué)習(xí)庫。

  • 多場景通用性:Spark集成了一系列的庫,包括SQL和DataFrame幫助你快速完成數(shù)據(jù)處理;Mllib幫助你完成機器學(xué)習(xí)任務(wù);Spark streaming做流式計算。

  • 多平臺支持:Spark可以跑在Hadoop、Apache Mesos、Kubernetes等之上,可以從HDFS、Alluxio、Apache Cassandra、Apache Hive以及其他的上百個數(shù)據(jù)源獲取數(shù)據(jù)。

圖解大數(shù)據(jù) | 大數(shù)據(jù)分析挖掘-Spark初步

3.Spark作業(yè)與調(diào)度

Spark的核心是作業(yè)和任務(wù)調(diào)度系統(tǒng),它可以保障各種任務(wù)高效完整地運行。

1)Spark作業(yè)和任務(wù)調(diào)度系統(tǒng)

Spark通過作業(yè)和任務(wù)調(diào)度系統(tǒng),能夠有效地進行調(diào)度完成各種任務(wù),底層的巧妙設(shè)計是對任務(wù)劃分DAG和容錯,使得它對低層到頂層的各個模塊之間的調(diào)用和處理顯得游刃有余。

圖解大數(shù)據(jù) | 大數(shù)據(jù)分析挖掘-Spark初步

2)基本概念一覽

概念 解釋
作業(yè)(Job) RDD中由行動操作所生成的一個或多個調(diào)度階段。
調(diào)度階段(Stage) 每個Job作業(yè)會因為RDD之間的依賴關(guān)系拆分成多組任務(wù)集合,稱為調(diào)度階段,簡稱階段,也叫做任務(wù)集(TaskSet)。調(diào)度階段的劃分是由DAGScheduler(DAG調(diào)度器)來劃分的。調(diào)度階段有Shuffle Map Stage和Result Stage兩種。
任務(wù)(Task) 分發(fā)到Executor上的工作任務(wù),是Spark實際執(zhí)行應(yīng)用的最小單元。Task會對RDD的partition數(shù)據(jù)執(zhí)行指定的算子操作,比如flatMap、map、reduce等算子操作,形成新RDD的partition。
DAGScheduler(DAG調(diào)度器) DAGScheduler是面向Stage(階段)的任務(wù)調(diào)度器,負責接收Spark應(yīng)用提交的作業(yè),根據(jù)RDD的依賴關(guān)系劃分調(diào)度階段,并提交Stage(階段)給TaskScheduler。
TaskScheduler(任務(wù)調(diào)度器) TaskScheduler是面向任務(wù)的調(diào)度器,它接收DAGScheduler提交過來的Stage(階段),然后把任務(wù)分發(fā)到Worker節(jié)點運行,由Worker節(jié)點的Executor來運行該任務(wù)。

3)Spark作業(yè)和調(diào)度流程

Spark的作業(yè)調(diào)度主要是指基于RDD的一系列操作構(gòu)成一個作業(yè),然后在Executor中執(zhí)行。這些操作算子主要分為轉(zhuǎn)換操作和行動操作,對于轉(zhuǎn)換操作的計算是lazy級別的,也就是延遲執(zhí)行,只有出現(xiàn)了行動操作才觸發(fā)作業(yè)的提交。

在Spark調(diào)度中最重要的是DAGScheduler和TaskScheduler兩個調(diào)度器:其中DAGScheduler負責任務(wù)的邏輯調(diào)度,將Job作業(yè)拆分成不同階段的具有依賴關(guān)系的任務(wù)集,而TaskScheduler則負責具體任務(wù)的調(diào)度執(zhí)行。

圖解大數(shù)據(jù) | 大數(shù)據(jù)分析挖掘-Spark初步

4.RDD / DataFrame與Dataset

1)Spark API的歷史

Apache Spark 中有RDD,DataFrame和Dataset三種不同數(shù)據(jù)API,發(fā)展如下:

圖解大數(shù)據(jù) | 大數(shù)據(jù)分析挖掘-Spark初步

RDD

  • RDD是Spark最早提供的面向用戶的主要API。

  • 從根本上來說,一個RDD就是數(shù)據(jù)的一個不可變的分布式元素集合,在集群中跨節(jié)點分布,可以通過若干提供了轉(zhuǎn)換和處理的底層API進行并行處理。

DataFrame

  • 與RDD相似,DataFrame也是數(shù)據(jù)的一個不可變分布式集合。

  • 但與RDD不同的是,數(shù)據(jù)都被組織到有名字的列中,就像關(guān)系型數(shù)據(jù)庫中的表一樣。

  • 設(shè)計DataFrame的目的就是要讓對大型數(shù)據(jù)集的處理變得更簡單,它讓開發(fā)者可以為分布式的數(shù)據(jù)集指定一個模式,進行更高層次的抽象。它提供了特定領(lǐng)域內(nèi)專用的API來處理你的分布式數(shù)據(jù),并讓更多的人可以更方便地使用Spark,而不僅限于專業(yè)的數(shù)據(jù)工程師。

Dataset

  • 從Spark 2.0開始,Dataset開始具有兩種不同類型的API特征:有明確類型的API和無類型的API。

  • 從概念上來說,可以把DataFrame當作一些通用對象Dataset[Row]的集合的一個別名,而一行就是一個通用的無類型的JVM對象。

  • 與之形成對比,Dataset就是一些有明確類型定義的JVM對象的集合,通過你在Scala中定義的Case Class或者Java中的Class來指定。

2)Spark API簡介

在Spark 2.0中對Dataframe和Dataset進行了統(tǒng)一,如下圖所示:

圖解大數(shù)據(jù) | 大數(shù)據(jù)分析挖掘-Spark初步

3)Spark的邏輯結(jié)構(gòu)

Spark的整體邏輯結(jié)構(gòu)如下圖所示,包含不同的層級及組成部分:

圖解大數(shù)據(jù) | 大數(shù)據(jù)分析挖掘-Spark初步

5.Spark2.0與SparkSession

1)SparkSession的引入

Spark2.0中引入了SparkSession的概念,它為用戶提供了一個統(tǒng)一的切入點來使用Spark的各項功能,借助SparkSession,我們可以使用DataFrame和Dataset的各種API,應(yīng)用Spark的難度也大大下降。

在Spark的早期版本,SparkContext是進入Spark的切入點,RDD數(shù)據(jù)基于其創(chuàng)建。但在流處理、SQL等場景下有其他的切入點,匯總?cè)缦拢?/p>

  • RDD,創(chuàng)建和操作使用SparkContext提供的API。
  • 流處理,使用StreamingContext。
  • SQL,使用sqlContext。
  • Hive,使用HiveContext。

圖解大數(shù)據(jù) | 大數(shù)據(jù)分析挖掘-Spark初步

在Spark高版本中,DataSet和DataFrame提供的API逐漸成為新的標準API,需要一個切入點來構(gòu)建它們。所以,Spark 2.0引入了一個新的切入點(entry point):SparkSession。

  • SparkSession實質(zhì)上是SQLContext和HiveContext的組合(未來可能還會加上StreamingContext)。

  • 在SQLContext和HiveContext上可用的API,在SparkSession上同樣可以使用。

  • SparkSession內(nèi)部封裝了SparkContext,計算實際上由SparkContext完成。

2)創(chuàng)建SparkSession

圖解大數(shù)據(jù) | 大數(shù)據(jù)分析挖掘-Spark初步

6.結(jié)構(gòu)化流與連續(xù)性應(yīng)用

1)Continuous Applications

Spark2.0中提出一個概念,Continuous Applications(連續(xù)應(yīng)用程序)。

Spark Streaming等流式處理引擎,致力于流式數(shù)據(jù)的運算:比如通過map運行一個方法來改變流中的每一條記錄,通過reduce可以基于時間做數(shù)據(jù)聚合。但是很少有只在流式數(shù)據(jù)上做運算的需求,流式處理往往是一個大型應(yīng)用的一部分。

圖解大數(shù)據(jù) | 大數(shù)據(jù)分析挖掘-Spark初步

Continuous Applications提出后,實時運算作為一部分,不同系統(tǒng)間的交互等也可以由Structured Streaming來處理。

2)Structured Streaming

Structured Streaming是一個建立在Spark Sql引擎上的可擴展、高容錯的流式處理引擎。它使得可以像對靜態(tài)數(shù)據(jù)進行批量處理一樣來處理流式數(shù)據(jù)。圖解大數(shù)據(jù) | 大數(shù)據(jù)分析挖掘-Spark初步