加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
    • PART1:Spark是什么
    • PART2:Spark的特點(diǎn)
    • PART3:Spark的生態(tài)系統(tǒng)
    • PART4:Spark的部署模式
    • PART5:Spark的運(yùn)行架構(gòu)
    • PART6:PySpark庫(kù)介紹
    • PART7:快速入門PySpark
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

一文理解Spark的基本概念和工作原理

02/28 08:52
5357
閱讀需 21 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

在Hadoop 1.x版本中,采用的是MRv1版本的MapReduce編程模型,包括3個(gè)部分:運(yùn)行時(shí)環(huán)境(JobTracker和TaskTracker)、編程模型(MapReduce)、數(shù)據(jù)處理引擎(MapTask和ReduceTask)。但是MRv1存在以下不足:

1)可擴(kuò)展性差。在運(yùn)行時(shí),JobTracker既負(fù)責(zé)資源管理,又負(fù)責(zé)任務(wù)調(diào)度,當(dāng)集群繁忙時(shí)JobTracker很容易成為瓶頸,最終導(dǎo)致它的可擴(kuò)展性問題。

2)可用性差。采用了單節(jié)點(diǎn)的Master,沒有備用Master及選舉操作,這就存在單點(diǎn)故障的問題,一旦Master出現(xiàn)故障,整個(gè)集群將不可用。

3)資源利用率低。TaskTracker使用slot來(lái)劃分節(jié)點(diǎn)上的CPU、內(nèi)存等資源,并將空閑的slot分配給Task使用,一個(gè)Task只有在獲得slot后才有機(jī)會(huì)進(jìn)行運(yùn)行。但是一些Task并不能充分利用獲得的slot,導(dǎo)致slot有空閑,而其他Task又無(wú)法使用這些空閑資源。

Apache為了解決MRv1中的缺陷,對(duì)Hadoop進(jìn)行了升級(jí)改造及重構(gòu),就有了MRv2。MRv2重構(gòu)了MRv1中的運(yùn)行時(shí)環(huán)境,將原來(lái)的JobTracker拆分成集群資源調(diào)度平臺(tái)(ResourceManager)、節(jié)點(diǎn)資源管理者(NodeManager)、任務(wù)管理者(ApplicationMaster),這就是后來(lái)Hadoop中的YARN。除

了運(yùn)行時(shí)環(huán)境,編程模型和數(shù)據(jù)處理引擎變成了可插拔的,可以用其他框架模型來(lái)替換,比如Spark。

PART1:Spark是什么

官方網(wǎng)站表明Spark是一個(gè)用于大規(guī)模數(shù)據(jù)(Large-scala Data)分析的統(tǒng)一引擎(Unified Engine)。Apache Spark?是一個(gè)多語(yǔ)言引擎,用于在單節(jié)點(diǎn)機(jī)器或集群上執(zhí)行數(shù)據(jù)工程、數(shù)據(jù)科學(xué)和機(jī)器學(xué)習(xí)

Spark最早源于加州大學(xué)柏克萊分校的Matei Zaharia等人發(fā)表的一篇論文“Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing”。Spark借鑒了MapReduce的思想,保留了分布式并行計(jì)算的優(yōu)點(diǎn)并改進(jìn)了其明顯的缺陷,對(duì)MapReduce做了大量的優(yōu)化,例如減少磁盤I/O、增加并行度、避免重新計(jì)算、以及采用內(nèi)存計(jì)算及靈活的內(nèi)存管理策略等。Spark提出了一種彈性分布式數(shù)據(jù)集(Resilient Distributed Datasets,RDD)的概念,RDD是一種分布式內(nèi)存數(shù)據(jù)抽象,使得程序員能夠在大規(guī)模集群中做內(nèi)存運(yùn)算,并且有一定的容錯(cuò)方式,而這也是整個(gè)Spark的核心數(shù)據(jù)結(jié)構(gòu),Spark整個(gè)平臺(tái)都圍繞著RDD進(jìn)行。中間數(shù)據(jù)存儲(chǔ)在內(nèi)存中提高了運(yùn)行速度,并且Spark提供豐富的操作數(shù)據(jù)的API,提高了開發(fā)速度。

Spark是如何處理數(shù)據(jù)的?Spark會(huì)將HDFS中文件的每個(gè)數(shù)據(jù)塊讀取為RDD的一個(gè)分區(qū)(Partition),每個(gè)分區(qū)會(huì)啟動(dòng)一個(gè)計(jì)算任務(wù)(Task),以實(shí)現(xiàn)大規(guī)模數(shù)據(jù)集的并行計(jì)算,過程如圖2所示。

圖2.Spark如何處理數(shù)據(jù)

Spark是一款分布式內(nèi)存計(jì)算的統(tǒng)一分析引擎,其特點(diǎn)就是對(duì)任意類型的數(shù)據(jù)進(jìn)行自定義計(jì)算,可以計(jì)算結(jié)構(gòu)化、半結(jié)構(gòu)化、非結(jié)構(gòu)化等各種類型的數(shù)據(jù)結(jié)構(gòu)。Spark的適用面比較廣,所以被稱為統(tǒng)一的分析引擎,它同時(shí)支持使用Python、Java、Scala、R以及SQL語(yǔ)言開發(fā)應(yīng)用程序處理數(shù)據(jù)。

PART2:Spark的特點(diǎn)

Spark具有運(yùn)行速度快、易用性好、通用性強(qiáng)和隨處運(yùn)行等特點(diǎn)。

1)速度快。由于Apache Spark支持內(nèi)存計(jì)算,并且通過有向無(wú)環(huán)圖(DAG)執(zhí)行引擎支持無(wú)環(huán)數(shù)據(jù)流,所以官方宣稱其在內(nèi)存中的運(yùn)算速度要比Hadoop的MapReduce快100倍,在硬盤中要快10倍。Spark處理數(shù)據(jù)與MapReduce處理數(shù)據(jù)相比,有兩個(gè)不同點(diǎn):其一,Spark處理數(shù)據(jù)時(shí),可以將中間處理結(jié)果數(shù)據(jù)存儲(chǔ)到內(nèi)存中;其二,Spark提供了非常豐富的算子(API),可以做到復(fù)雜任務(wù)在一個(gè)Spark程序中完成。

2)易用性好。Spark的版本已經(jīng)更新到3.4.0(截至2023年4月13日),支持包括 Java、Scala、Python、R和SQL語(yǔ)言在內(nèi)的多種語(yǔ)言。為了兼容Spark 2.x企業(yè)級(jí)應(yīng)用場(chǎng)景,Spark仍然持續(xù)更新Spark 2.x版本。

3)通用性強(qiáng)。在Spark核心基礎(chǔ)上,Spark還提供了包括Spark SQL、Spark Streaming、MLlib 及GraphX在內(nèi)的多個(gè)工具庫(kù),可以在一個(gè)應(yīng)用中無(wú)縫地使用這些工具庫(kù)。

4)隨處運(yùn)行。Spark支持多種運(yùn)行方式,包括在YARN和Mesos上支持獨(dú)立集群運(yùn)行模式,同時(shí)也可以運(yùn)行在云Kubernetes(Spark 2.3開始支持)和云環(huán)境上。

5)批處理/流數(shù)據(jù)。可以使用首選語(yǔ)言(Python、SQL、Scala、Java或R)以批處理和實(shí)時(shí)流的方式統(tǒng)一數(shù)據(jù)處理。

6)SQL分析。執(zhí)行快速、分布式的ANSI
SQL查詢,用于儀表板和即席報(bào)告。運(yùn)行速度比大多數(shù)數(shù)據(jù)倉(cāng)庫(kù)都快。

7)大規(guī)模數(shù)據(jù)科學(xué)。對(duì)PB級(jí)數(shù)據(jù)執(zhí)行探索性數(shù)據(jù)分析(EDA),而無(wú)須采用縮減采樣。

8)機(jī)器學(xué)習(xí)。在筆記本電腦上訓(xùn)練機(jī)器學(xué)習(xí)算法,并使用相同的代碼擴(kuò)展到數(shù)千臺(tái)計(jì)算機(jī)的容錯(cuò)群集。

PART3:Spark的生態(tài)系統(tǒng)

Spark有一套自己的生態(tài)體系,以Spark為核心(Spark Core),并提供支持SQL語(yǔ)句操作的Spark SQL模塊、支持流式計(jì)算的Spark Streaming模塊、支持機(jī)器學(xué)習(xí)的MLlib模塊、支持圖計(jì)算的GraphX模塊。在資源調(diào)度方面,Spark支持自身獨(dú)立集群的資源調(diào)度、YARN及Mesos等資源調(diào)度框架。Spark的體系架構(gòu)如圖3所示。

圖3.Spark的體系架構(gòu)

1)Spark Core。包含Spark的基本功能,包含任務(wù)調(diào)度、內(nèi)存管理、容錯(cuò)機(jī)制等,內(nèi)部采用RDD數(shù)據(jù)抽象,并提供了很多API來(lái)創(chuàng)建和操作這些RDD。為其他組件提供底層的服務(wù)。

2)Spark SQL。用來(lái)操作結(jié)構(gòu)化數(shù)據(jù)的核心組件,通過Spark SQL可以直接查詢Hive、 HBase等多種外部數(shù)據(jù)源中的數(shù)據(jù)。Spark SQL能夠統(tǒng)一處理關(guān)系表,在處理結(jié)構(gòu)化數(shù)據(jù)時(shí),開發(fā)人員無(wú)須編寫MapReduce程序,直接使用SQL命令就能完成更復(fù)雜的數(shù)據(jù)查詢操作。

3)Spark Streaming。Spark提供的流式計(jì)算框架,支持高吞吐量、可容錯(cuò)處理的實(shí)時(shí)流式數(shù)據(jù)處理,其核心原理是將流式數(shù)據(jù)分解成一系列微小的批處理作業(yè),每個(gè)微小的批處理作業(yè)都可以使用Spark Core進(jìn)行快速處理。Spark Streaming支持多種數(shù)據(jù)來(lái)源,如文件、Socket、Kafka、Kinesis等。

4)MLlib。Spark提供的關(guān)于機(jī)器學(xué)習(xí)功能的算法程序庫(kù),包括分類、回歸、聚類、協(xié)同過濾算法等,還提供了模型評(píng)估、數(shù)據(jù)導(dǎo)入等額外的功能,開發(fā)人員只需了解一定的機(jī)器學(xué)習(xí)算法知識(shí)就能進(jìn)行機(jī)器學(xué)習(xí)方面的開發(fā),降低了學(xué)習(xí)成本。

5)GraphX。Spark提供的分布式圖處理框架,擁有圖計(jì)算和圖挖掘算法的API接口以及豐富的功能和運(yùn)算符,極大地方便了對(duì)分布式圖的處理,能在海量數(shù)據(jù)上運(yùn)行復(fù)雜的圖算法。

PART4:Spark的部署模式

Spark提供多種部署模式,包括:

1)本地模式(單機(jī)模式)。本地模式就是以一個(gè)獨(dú)立的進(jìn)程,通過其內(nèi)部的多個(gè)線程來(lái)模擬整個(gè)Spark運(yùn)行時(shí)環(huán)境。本地模式不適合用于生產(chǎn)環(huán)境,僅用于本地程序開發(fā)、代碼驗(yàn)證等。

2)獨(dú)立集群模式(集群模式)。Spark中的各個(gè)角色以獨(dú)立進(jìn)程的形式存在,并組成Spark集群環(huán)境,這種模式下Spark自己獨(dú)立管理集群的資源。

3)Spark on YARN模式(集群模式)。Spark中的各個(gè)角色運(yùn)行在YARN的容器內(nèi)部,并組成Spark集群環(huán)境,這種模式下Spark不再管理集群的資源,而由YARN進(jìn)行集群資源管理。

4)Kubernetes模式(容器集群)。Spark中的各個(gè)角色運(yùn)行在Kubernetes的容器內(nèi)部,并組成Spark集群環(huán)境。

5)云服務(wù)模式(運(yùn)行在云平臺(tái)上)。Spark的商業(yè)版本Databricks就運(yùn)行在谷歌、微軟、亞馬遜云服務(wù)提供商的云平臺(tái)上。

PART5:Spark的運(yùn)行架構(gòu)

從物理部署層面上看,如果是獨(dú)立集群模式部署的集群,則Spark主要包含兩種類型的節(jié)點(diǎn):Master節(jié)點(diǎn)和Worker節(jié)點(diǎn)。Master節(jié)點(diǎn)負(fù)責(zé)管理集群資源,分配Application到Worker節(jié)點(diǎn),維護(hù)Worker節(jié)點(diǎn)、Driver和Application的狀態(tài)。

Worker節(jié)點(diǎn)負(fù)責(zé)具體的任務(wù)運(yùn)行。如果是運(yùn)行在YARN環(huán)境下,則不需要Master節(jié)點(diǎn)和Worker節(jié)點(diǎn)。

從程序運(yùn)行層面上看,Spark主要分為Driver和Executor。Driver充當(dāng)單個(gè)Spark任務(wù)運(yùn)行過程中的管理者,Executor充當(dāng)單個(gè)Spark任務(wù)運(yùn)行過程中的執(zhí)行者。Spark中的4類角色組成了Spark的整個(gè)運(yùn)行時(shí)(Runtime)環(huán)境。這些角色與YARN中的各個(gè)角色有類似的地方。

在集群資源管理層面:整個(gè)集群的管理者,在YARN中是ResourceManager,在Spark中是Master;單個(gè)節(jié)點(diǎn)的管理者,在YARN中是NodeManager,在Spark中是Worker。在任務(wù)執(zhí)行層面:?jiǎn)蝹€(gè)任務(wù)的管理者,在YARN中是ApplicationMaster,在Spark中是Driver;單個(gè)任務(wù)的執(zhí)行者,在YARN中是Task,在Spark中是Executor。Spark官方提供的運(yùn)行結(jié)構(gòu)如下圖所示。

圖4.Spark的運(yùn)行結(jié)構(gòu)

在Spark的運(yùn)行結(jié)構(gòu)中涉及一些關(guān)鍵概念:

1)Master Node。集群中的主節(jié)點(diǎn),負(fù)責(zé)集群的資源管理。

2)Worker Node。可以在集群中運(yùn)行應(yīng)用程序代碼的任何節(jié)點(diǎn)。

3)Application?;赟park構(gòu)建的用戶應(yīng)用程序。由集群上Driver程序和Executor執(zhí)行。

4)Driver程序。運(yùn)行應(yīng)用程序的main()函數(shù),并創(chuàng)建SparkContext的過程。

5)Executor。為Worker節(jié)點(diǎn)上的應(yīng)用程序啟動(dòng)的進(jìn)程,用于運(yùn)行任務(wù)并將數(shù)據(jù)保存在內(nèi)存中或跨磁盤存儲(chǔ)。每個(gè)Application都分配有自己的Executor。

6)Cluster Manager(集群管理者)。用于獲取、管理集群上的資源,如果是獨(dú)立集群模式部署的集群則是Standalone Manager,否則就是外部服務(wù),例如Mesos、YARN、Kubernetes。

7)Job。Spark的數(shù)據(jù)抽象是RDD,RDD提供了很多算子(API),這些算子被劃分為Transformation和Action算子兩種類型。Transformation算子只構(gòu)建程序的執(zhí)行計(jì)劃,但并不會(huì)執(zhí)行;Action算子的作用是觸發(fā)Spark程序的真正執(zhí)行。為了響應(yīng)Action算子,當(dāng)程序中遇到一個(gè)Action算子時(shí),Spark會(huì)提交一個(gè)Job,用來(lái)真正執(zhí)行前面的一系列操作。通常一個(gè)Application會(huì)包含多個(gè)Job,Job之間按串行方式依次執(zhí)行。

8)Stage。每個(gè)Job會(huì)根據(jù)Shuffle依賴劃分為更小的任務(wù)集,稱為Stage(階段),Stage之間具有依賴關(guān)系及執(zhí)行的先后順序,比如MapReduce中的map stage和reduce stage。

9)Task。Stage再細(xì)分就是Task(任務(wù)),Task是發(fā)送給一個(gè)Executor的最細(xì)執(zhí)行單元,RDD的每個(gè)Partition都會(huì)啟動(dòng)一個(gè)Task,因此每個(gè)Stage中Task的數(shù)量就是當(dāng)前Stage的并行度。

PART6:PySpark庫(kù)介紹

Spark是用Scala語(yǔ)言編寫的,運(yùn)行在JVM上,即Spark的任務(wù)都是以JVM的進(jìn)程來(lái)運(yùn)行的。Python是機(jī)器學(xué)習(xí)的首選語(yǔ)言,Python編寫的代碼運(yùn)行在Python進(jìn)程里面。在Python代碼中想要調(diào)用Spark的API,就涉及Python進(jìn)程與JVM進(jìn)程之間的通信與交互,想要實(shí)現(xiàn)這樣不同進(jìn)程之間的交互,就需要用到遠(yuǎn)程過程調(diào)用(RPC)。

Py4j是一個(gè)非常有趣的RPC庫(kù),它可以在JVM進(jìn)程開辟一個(gè)ServerSocket來(lái)監(jiān)聽客戶端的連接,在Python進(jìn)程端啟動(dòng)一個(gè)連接池連接到JVM,所有的遠(yuǎn)程調(diào)用都被封裝成消息指令,通過連接池中的連接將消息指令發(fā)送到JVM遠(yuǎn)程執(zhí)行。

Py4j實(shí)現(xiàn)了讓Python自由操縱Java,借助Py4j就可以實(shí)現(xiàn)在Python代碼中調(diào)用Spark的API,但是,每次調(diào)用Spark的API都讓開發(fā)人員自己編寫RPC代碼,效率低下且不易使用。為了讓Spark支持Python,Apache Spark社區(qū)發(fā)布了一個(gè)工具庫(kù)PySpark,PySpark是Python中Apache Spark的接口。SparkContext作為Spark應(yīng)用程序的入口,執(zhí)行Spark應(yīng)用程序會(huì)優(yōu)先在Driver端創(chuàng)建SparkContext。

在Python Driver端,SparkContext利用Py4j啟動(dòng)一個(gè)JVM并創(chuàng)建JavaSparkContext,借助Py4j實(shí)現(xiàn)Python代碼與JavaSparkContext的通信。Python環(huán)境下的RDD會(huì)被映射成Java環(huán)境下的PythonRDD。在Executor端,PythonRDD對(duì)象會(huì)啟動(dòng)一些子進(jìn)程,并與這些子進(jìn)程通信,以此來(lái)發(fā)送數(shù)據(jù)和執(zhí)行代碼。PySpark的架構(gòu)如下圖所示。

圖5.PySpark架構(gòu)

大多數(shù)數(shù)據(jù)科學(xué)家和數(shù)據(jù)分析師都熟悉Python,并使用它來(lái)實(shí)現(xiàn)機(jī)器學(xué)習(xí),PySpark允許他們?cè)诖笠?guī)模分布式數(shù)據(jù)集上使用自己最熟悉的語(yǔ)言。

以上內(nèi)容節(jié)選自《PySpark大數(shù)據(jù)分析實(shí)戰(zhàn)》

作者:伍鮮?常麗娟

PART7:快速入門PySpark

為了幫助大家快速掌握PySpark大數(shù)據(jù)分析核心技術(shù),我們邀請(qǐng)中電金信軟件有限公司高級(jí)軟件工程師、《PySpark大數(shù)據(jù)分析實(shí)戰(zhàn)》作者,伍鮮老師。于2月29日(周四),為大家?guī)?lái)免費(fèi)直播分享,“程序員核心技能提升”系列直播講座 第13講——如何快速入門PySpark大數(shù)據(jù)分析

直播主題:程序員核心技能提升”系列直播講座 第13講——如何快速入門PySpark大數(shù)據(jù)分析開放時(shí)間:2024年2月29日(周四)20:00主講老師:伍鮮課程類型:視頻直播觀看平臺(tái):?九州云播平臺(tái), 機(jī)械工業(yè)出版社“IT有得聊”視頻號(hào)

合作媒體:SegmentFault 思否、蔻享學(xué)術(shù)、示說(shuō)網(wǎng)、志明與數(shù)據(jù)、數(shù)據(jù)社

講師介紹:伍鮮,中電金信軟件有限公司高級(jí)軟件工程師

擁有多年金融領(lǐng)域大數(shù)據(jù)處理實(shí)戰(zhàn)經(jīng)驗(yàn),曾負(fù)責(zé)多家銀行的Teradata數(shù)據(jù)倉(cāng)庫(kù)、FusionInsight大數(shù)據(jù)集群、阿里云大數(shù)據(jù)倉(cāng)庫(kù)、智能營(yíng)銷客戶集市和客戶中心建設(shè)。

撰? 稿? 人:計(jì)旭

責(zé)任編輯:張淑謙

審? 核? 人:曹新宇

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
HCNW3120#300 1 Avago Technologies 1 CHANNEL LOGIC OUTPUT OPTOCOUPLER, 0.300 INCH, SURFACE MOUNT, DIP-8
$4.78 查看
FTLX8571D3BCL 1 Finisar Corporation Transceiver, 840nm Min, 860nm Max, 10000Mbps(Tx), 10000Mbps(Rx), LC Connector, Board/panel Mount, ROHS COMPLIANT PACKAGE-20
$77.85 查看
ECS-250-20-33-DU-TR 1 ECS International Inc Parallel - Fundamental Quartz Crystal, 25MHz Nom, SMD, 4 PIN
$0.86 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜