自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Spark學(xué)習(xí)筆記:核心概念可視化

大數(shù)據(jù) Spark
對于在分布式系統(tǒng)上背景知識較少的人來說,學(xué)習(xí)Spark并非易事。 即使我已經(jīng)使用Spark已有一段時間了,但我發(fā)現(xiàn)全面了解Spark中的所有核心概念仍然很耗時。 Spark的官方文檔提供了非常詳細(xì)的解釋,但更多地側(cè)重于實際編程方面。

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

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

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

簡而言之,Spark在主工作架構(gòu)上運行,這是并行任務(wù)計算模型的典型類型。 運行Spark時,我們可以選擇幾種模式,即本地(主,執(zhí)行器,驅(qū)動程序都在同一臺JVM機(jī)器中),獨立,YARN和Mesos。 在這里,我們僅談?wù)揧ARN上的Spark以及YARN客戶端和YARN群集之間的區(qū)別,因為兩者都是最常用的,但非常令人困惑。

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

 

Spark學(xué)習(xí)筆記:核心概念可視化

 

Spark學(xué)習(xí)筆記:核心概念可視化
> Fig 1. Spark deployment mode YARN-client (left) and YARN-cluster (right)

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

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

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

 

Spark學(xué)習(xí)筆記:核心概念可視化

執(zhí)行者

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

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

 

Spark學(xué)習(xí)筆記:核心概念可視化
> Fig 2. Spark executor internals

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

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

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

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

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

  • 預(yù)留內(nèi)存
  • 用戶內(nèi)存:用于在Spark中存儲用戶數(shù)據(jù)結(jié)構(gòu)和內(nèi)部元數(shù)據(jù)等內(nèi)容。
  • 存儲和執(zhí)行內(nèi)存:用于存儲所有RDD分區(qū)并為任務(wù)分配運行時內(nèi)存。

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

 

Spark學(xué)習(xí)筆記:核心概念可視化
> 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)換(例如,過濾,并集,非重復(fù),交集),這些操作實際上是在沒有實際執(zhí)行的情況下從現(xiàn)有的RDD中生成一個新的RDD,以及要執(zhí)行的操作(例如,采取,顯示,收集,foreach) 觸發(fā)執(zhí)行。 轉(zhuǎn)換RDD時,基于父RDD和轉(zhuǎn)換后的RDD之間的關(guān)系,相關(guān)性可以窄或?qū)挕?依賴關(guān)系較窄,在父RDD中,一個或多個分區(qū)將映射到新RDD中的一個分區(qū)。 盡管具有廣泛的依賴性,例如在執(zhí)行join或sortBy時,但我們需要對分區(qū)進(jìn)行混洗以計算新的RDD。

 

Spark學(xué)習(xí)筆記:核心概念可視化
> Fig 4–1. narrow dependency in RDD transformation

 

Spark學(xué)習(xí)筆記:核心概念可視化
> Fig 4–2. Wide dependency in RDD transformation

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

 

Spark學(xué)習(xí)筆記:核心概念可視化
> Fig 5. Illustration of one Spark job

為了真正理解它,我們來看以下簡單的代碼片段。

 

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

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

 

Spark學(xué)習(xí)筆記:核心概念可視化
> Fig 6. DAG visualization

因此,這就是Spark的所有基本內(nèi)容。 希望在閱讀本文之后,這些概念對您來說更加清楚。 學(xué)習(xí)愉快!

責(zé)任編輯:未麗燕 來源: 今日頭條
相關(guān)推薦

2017-01-12 17:28:59

數(shù)據(jù)分析數(shù)據(jù)可視化可視化

2020-03-11 14:39:26

數(shù)據(jù)可視化地圖可視化地理信息

2015-08-20 09:45:56

可視化

2017-02-07 15:54:14

數(shù)據(jù)可視化數(shù)據(jù)分析

2020-12-20 17:40:04

機(jī)器學(xué)習(xí)可視化網(wǎng)站算法

2017-10-14 13:54:26

數(shù)據(jù)可視化數(shù)據(jù)信息可視化

2022-08-26 09:15:58

Python可視化plotly

2009-04-21 14:26:41

可視化監(jiān)控IT管理摩卡

2018-03-26 20:04:16

深度學(xué)習(xí)

2018-03-26 20:07:25

深度學(xué)習(xí)

2022-08-18 11:36:16

可視化JavaScript事件循環(huán)

2015-08-20 10:06:36

可視化

2020-09-18 16:37:59

數(shù)據(jù)可視化技術(shù)Python

2018-03-27 22:40:59

深度學(xué)習(xí)

2019-03-05 09:20:47

Vim可視化模式命令

2014-01-17 10:36:39

2015-08-20 10:00:45

可視化

2020-09-27 11:15:37

可視化PandasPython

2017-04-25 09:50:16

SparkRDD核心

2010-07-27 15:42:18

AdobeFlex
點贊
收藏

51CTO技術(shù)棧公眾號