溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Spark中的核心概念可視化是怎樣的

發(fā)布時(shí)間:2021-12-17 11:57:17 來(lái)源:億速云 閱讀:244 作者:柒染 欄目:大數(shù)據(jù)

本篇文章為大家展示了Spark中的核心概念可視化是怎樣的,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

對(duì)于在分布式系統(tǒng)上背景知識(shí)較少的人來(lái)說(shuō),學(xué)習(xí)Spark并非易事。  即使我已經(jīng)使用Spark已有一段時(shí)間了,但我發(fā)現(xiàn)全面了解Spark中的所有核心概念仍然很耗時(shí)。  Spark的官方文檔提供了非常詳細(xì)的解釋,但更多地側(cè)重于實(shí)際編程方面。 同樣,大量的在線教程可能會(huì)讓您不知所措。  因此,我想以更直觀的方式記下那些Spark核心概念。 希望您也會(huì)發(fā)現(xiàn)它有用!

注意:也許您已經(jīng)對(duì)Hadoop有一定的了解,所以我將跳過(guò)對(duì)瑣碎事物(例如節(jié)點(diǎn)和集群)的解釋。

Spark架構(gòu)和部署模式

簡(jiǎn)而言之,Spark在主工作架構(gòu)上運(yùn)行,這是并行任務(wù)計(jì)算模型的典型類型。  運(yùn)行Spark時(shí),我們可以選擇幾種模式,即本地(主,執(zhí)行器,驅(qū)動(dòng)程序都在同一臺(tái)JVM機(jī)器中),獨(dú)立,YARN和Mesos。  在這里,我們僅談?wù)揧ARN上的Spark以及YARN客戶端和YARN群集之間的區(qū)別,因?yàn)閮烧叨际亲畛S玫?,但非常令人困惑?/p>

下兩張圖片說(shuō)明了兩種模式的設(shè)置。 它們看起來(lái)很相似,不是嗎? 但是,通過(guò)查看橙色突出顯示的部分,您可能會(huì)注意到細(xì)微的差別,這就是Spark驅(qū)動(dòng)程序的位置。  這基本上是兩種模式之間的唯一區(qū)別。

Spark中的核心概念可視化是怎樣的
Spark中的核心概念可視化是怎樣的
> Fig 1. Spark deployment mode YARN-client (left) and YARN-cluster  (right)

假設(shè)您編寫了一個(gè)名為spark_hello_world.py的Spark應(yīng)用程序。  在客戶端模式下,使用spark-submit執(zhí)行python文件時(shí),驅(qū)動(dòng)程序直接在spark-submit進(jìn)程內(nèi)啟動(dòng),因此它將與spark_hello_world.py駐留在同一臺(tái)計(jì)算機(jī)上。  初始化Spark上下文時(shí),本地計(jì)算機(jī)中的驅(qū)動(dòng)程序?qū)⑦B接到群集中的應(yīng)用程序主機(jī)。 從主機(jī)開始,Spark啟動(dòng)了更多執(zhí)行器。

在群集模式下,spark_hello_world.py代碼位于客戶端計(jì)算機(jī)中,而客戶端計(jì)算機(jī)不在群集中。  執(zhí)行應(yīng)用程序python代碼時(shí),它將在集群中的一個(gè)節(jié)點(diǎn)中啟動(dòng)驅(qū)動(dòng)程序。 與Spark應(yīng)用程序主文件一起,它可以啟動(dòng)執(zhí)行程序并發(fā)布應(yīng)用程序命令。

鑒于設(shè)置差別不大,您一定想知道為什么我們需要兩種不同的模式。 在實(shí)踐中,這與客戶端計(jì)算機(jī)與工作計(jì)算機(jī)在物理上位于同一位置有關(guān)。  如果客戶端計(jì)算機(jī)離工作節(jié)點(diǎn)"遙遠(yuǎn)",例如 您在筆記本電腦上編寫了spark_hello_world.py,但是工作程序是AWS  EC2實(shí)例,那么使用群集模式是有意義的,以便最大程度地減少驅(qū)動(dòng)程序和執(zhí)行程序之間的網(wǎng)絡(luò)延遲。  在另一種情況下,如果您的python文件位于與工作節(jié)點(diǎn)"非常近"的網(wǎng)關(guān)計(jì)算機(jī)中,則客戶端模式可能是一個(gè)不錯(cuò)的選擇。

Spark中的核心概念可視化是怎樣的

執(zhí)行者

現(xiàn)在,我們了解了Spark集群的設(shè)置,讓我們放大到Spark中最重要的元素之一-執(zhí)行器。 執(zhí)行器是運(yùn)行任務(wù)并將數(shù)據(jù)跨任務(wù)存儲(chǔ)在內(nèi)存或磁盤中的過(guò)程。

瀏覽Spark文檔時(shí),您可能會(huì)對(duì)與執(zhí)行程序相關(guān)的可配置參數(shù)數(shù)量感到驚訝。  讓我們從視覺上看一下它,而不是一次又一次地嘗試弄清楚一個(gè)人的多個(gè)參數(shù)之間的關(guān)系。

Spark中的核心概念可視化是怎樣的
> Fig 2. Spark executor internals

如圖2所示,在每個(gè)執(zhí)行器中都有一個(gè)執(zhí)行器JVM,用于存儲(chǔ)RDD分區(qū),緩存的RDD分區(qū),運(yùn)行內(nèi)部線程和任務(wù)。  如果內(nèi)核數(shù)量超出任務(wù)要求,則JVM中還將有可用的內(nèi)核。 這個(gè)執(zhí)行器JVM的綠色塊將成為我們研究執(zhí)行器中的內(nèi)存管理的起點(diǎn)。

執(zhí)行程序內(nèi)存管理

在執(zhí)行程序容器中,主要分配了兩個(gè)內(nèi)存塊:內(nèi)存開銷和執(zhí)行程序內(nèi)存。

內(nèi)存開銷是為虛擬機(jī)開銷,內(nèi)部字符串,其他本機(jī)開銷等內(nèi)容預(yù)留的堆外內(nèi)存。通過(guò)將數(shù)據(jù)緩存在主要Java堆空間之外但仍在RAM中的方式,堆外內(nèi)存可使高速緩存克服冗長(zhǎng)的時(shí)間  使用大堆大小時(shí),JVM垃圾收集會(huì)暫停。

執(zhí)行器的內(nèi)存包括以下三個(gè)部分。

  • 預(yù)留內(nèi)存

  • 用戶內(nèi)存:用于在Spark中存儲(chǔ)用戶數(shù)據(jù)結(jié)構(gòu)和內(nèi)部元數(shù)據(jù)等內(nèi)容。

  • 存儲(chǔ)和執(zhí)行內(nèi)存:用于存儲(chǔ)所有RDD分區(qū)并為任務(wù)分配運(yùn)行時(shí)內(nèi)存。

圖3顯示了每個(gè)存儲(chǔ)塊的相關(guān)參數(shù)。 假設(shè)我們將spark.executor.memory設(shè)置為4 GB,那么Spark將向資源管理器請(qǐng)求總共4.4  GB的內(nèi)存。 在4 GB的執(zhí)行程序內(nèi)存中,我們實(shí)際上獲得了3.7 GB,因?yàn)槠溆嗖糠忠驯A簟?默認(rèn)情況下,我們獲得2.2 GB(0.6 *  3.7)作為執(zhí)行+存儲(chǔ)內(nèi)存。 其中1.1 GB用于存儲(chǔ)RDD等存儲(chǔ)空間,其余空間用于執(zhí)行內(nèi)存。

Spark中的核心概念可視化是怎樣的
> Fig 3. Spark executor memory decomposition

RDD,工作,階段和任務(wù)

如果您已經(jīng)開始使用Spark UI調(diào)試Spark應(yīng)用程序,那么可能很熟悉諸如作業(yè),階段和任務(wù)之類的關(guān)鍵字。 那么它們與RDD有何關(guān)系?

我們知道在RDD上有兩種操作,即轉(zhuǎn)換(例如,過(guò)濾,并集,非重復(fù),交集),這些操作實(shí)際上是在沒有實(shí)際執(zhí)行的情況下從現(xiàn)有的RDD中生成一個(gè)新的RDD,以及要執(zhí)行的操作(例如,采取,顯示,收集,foreach)  觸發(fā)執(zhí)行。 轉(zhuǎn)換RDD時(shí),基于父RDD和轉(zhuǎn)換后的RDD之間的關(guān)系,相關(guān)性可以窄或?qū)挕?依賴關(guān)系較窄,在父RDD中,一個(gè)或多個(gè)分區(qū)將映射到新RDD中的一個(gè)分區(qū)。  盡管具有廣泛的依賴性,例如在執(zhí)行join或sortBy時(shí),但我們需要對(duì)分區(qū)進(jìn)行混洗以計(jì)算新的RDD。

Spark中的核心概念可視化是怎樣的
> Fig 4–1. narrow dependency in RDD transformation
Spark中的核心概念可視化是怎樣的
> Fig 4–2. Wide dependency in RDD transformation

因此,作業(yè),階段和任務(wù)由操作類型和轉(zhuǎn)換類型確定。 在RDD上執(zhí)行操作時(shí),將創(chuàng)建一個(gè)作業(yè)。  在工作中,可能有多個(gè)階段,具體取決于我們是否需要執(zhí)行廣泛的轉(zhuǎn)換(即洗牌)。 在每個(gè)階段中,可以將一個(gè)或多個(gè)轉(zhuǎn)換映射到每個(gè)執(zhí)行程序中的任務(wù)。

Spark中的核心概念可視化是怎樣的
> Fig 5. Illustration of one Spark job

為了真正理解它,我們來(lái)看以下簡(jiǎn)單的代碼片段。

val RDD1 = sc.parallelize(Array('1', '2', '3', '4', '5')).map{ x => val xi = x.toInt; (xi, xi+1) } val RDD2 = sc.parallelize(Array('1', '2', '3', '4', '5')).map{ x => val xi = x.toInt; (xi, xi*10) } val joinedData = RDD2.join(RDD1) val filteredRDD = joinedData.filter{case (k, v) => k % 2 == 0} val resultRDD = filteredRDD.mapPartitions{ iter => iter.map{ case (k, (v1, v2) ) => (k, v1+v2) } } resultRDD.take(2)

此代碼中包含一些操作,即map,join,filter,mapPartitions和take。  創(chuàng)建RDD時(shí),Spark將分別為RDD1和RDD2生成兩個(gè)階段,如階段0和1所示。由于map函數(shù)包含一個(gè)狹窄的依賴性,因此映射的RDD也將分別包含在階段0和1中。  然后,我們將RDD1和RDD2連接起來(lái),因?yàn)檫B接是包含混洗的廣泛轉(zhuǎn)換,因此Spark為該操作創(chuàng)建了另一個(gè)階段。  之后,filter和mapPartition仍然是第2階段的狹窄轉(zhuǎn)換,通過(guò)調(diào)用take(這是一個(gè)動(dòng)作),我們觸發(fā)了Spark的執(zhí)行。

Spark中的核心概念可視化是怎樣的
> Fig 6. DAG visualization

上述內(nèi)容就是Spark中的核心概念可視化是怎樣的,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI