1. 程式人生 > >spark效能調優之重構RDD架構,RDD持久化

spark效能調優之重構RDD架構,RDD持久化

當第一次對RDD2執行運算元,獲取RDD3的時候,就會從RDD1開始計算,就是讀取HDFS檔案,然後對RDD1執行運算元,獲取到RDD2,然後再計算,得到RDD3

預設情況下,多次對一個RDD執行運算元,去獲取不同的RDD;都會對這個RDD以及之前的父RDD,全部重新計算一次;讀取HDFS->RDD1->RDD2-RDD4
這種情況,是絕對絕對,一定要避免的,一旦出現一個RDD重複計算的情況,就會導致效能急劇降低

比如,HDFS->RDD1-RDD2的時間是15分鐘,那麼此時就要走兩遍,變成30分鐘


另外一種情況,從一個RDD到幾個不同的RDD,運算元和計算邏輯其實是完全一樣的,結果因為人為的疏忽,計算了多次,獲取到了多個RDD。

所以,建議採用以下方法可以優化:

第一,RDD架構重構與優化
儘量去複用RDD,差不多的RDD,可以抽取稱為一個共同的RDD,供後面的RDD計算時,反覆使用。

第二,公共RDD一定要實現持久化

持久化,也就是說,將RDD的資料快取到記憶體中/磁碟中,(BlockManager),以後無論對這個RDD做多少次計算,那麼都是直接取這個RDD的持久化的資料,比如從記憶體中或者磁碟中,直接提取一份資料。

第三,持久化,是可以進行序列化的

如果正常將資料持久化在記憶體中,那麼可能會導致記憶體的佔用過大,這樣的話,也許,會導致OOM記憶體溢位。

當純記憶體無法支撐公共RDD資料完全存放的時候,就優先考慮,使用序列化的方式在純記憶體中儲存。將RDD的每個partition的資料,序列化成一個大的位元組陣列,就一個物件;序列化後,大大減少記憶體的空間佔用。

序列化的方式,唯一的缺點就是,在獲取資料的時候,需要反序列化。

如果序列化純記憶體方式,還是導致OOM,記憶體溢位;就只能考慮磁碟的方式,記憶體+磁碟的普通方式(無序列化)。記憶體+磁碟,序列化。

第四,為了資料的高可靠性,而且記憶體充足,可以使用雙副本機制,進行持久化

持久化的雙副本機制,持久化後的一個副本,因為機器宕機了,副本丟了,就還是得重新計算一次;持久化的每個資料單元,儲存一份副本,放在其他節點上面;從而進行容錯;一個副本丟了,不用重新計算,還可以使用另外一份副本。這種方式,僅僅針對你的記憶體資源極度充足。

sessionid2actionRDD = sessionid2actionRDD.persist(StorageLevel.MEMORY_ONLY()); /** * 持久化,很簡單,就是對RDD呼叫persist()方法,並傳入一個持久化級別 * * 如果是persist(StorageLevel.MEMORY_ONLY()),純記憶體,無序列化,那麼就可以用cache()方法來替代 * StorageLevel.MEMORY_ONLY_SER(),第二選擇 * StorageLevel.MEMORY_AND_DISK(),第三選擇 * StorageLevel.MEMORY_AND_DISK_SER(),第四選擇 * StorageLevel.DISK_ONLY(),第五選擇 * * 如果記憶體充足,要使用雙副本高可靠機制 * 選擇字尾帶_2的策略 * StorageLevel.MEMORY_ONLY_2() * */ sessionid2actionRDD = sessionid2actionRDD.persist(StorageLevel.MEMORY_ONLY());

相關推薦

spark效能調重構RDD架構RDD持久化

當第一次對RDD2執行運算元,獲取RDD3的時候,就會從RDD1開始計算,就是讀取HDFS檔案,然後對RDD1執行運算元,獲取到RDD2,然後再計算,得到RDD3 預設情況下,多次對一個RDD執行運算元,去獲取不同的RDD;都會對這個RDD以及之前的父RDD,全部重新計算

Spark效能調——在實際專案中重構RDD架構以及RDD持久化

一、RDD架構重構與優化是什麼。 儘量去複用RDD,差不多的RDD,可以抽取為一個共同的RDD,供後面的RDD計算時,反覆使用。 二、怎麼做? 快取級別: case "NONE" => NONE case "DISK_ONL

Spark效能調原理分析

spark效能調優之前先明白原理,具體如下: 使用spark-submit提交一個Spark作業之後,這個作業就會啟動一個對應的Driver程序。根據使用的部署模式(deploy-mode)不同,Driver程序可能在本地啟動,也可能在叢集中某個工作節點上啟動。Driver程序本身會根

Spark效能調廣播變數

廣播變數概述及其優勢廣播變數(groadcast varible)為只讀變數,它有執行SparkContext的driver程式建立後傳送給參與計算的節點。對那些需要讓工作節點高效地訪問相同資料的應用場景,比如機器學習。我們可以在SparkContext上呼叫broadcas

Spark效能調廣播大變數

    本篇blog講述在實際spark專案中可能需要注意的一個性能調優的一個點,就是broadcast大變數。    預設的在spark作業中,task執行的運算元中,使用了外部的變數,每個task都會獲取一份變數的副本,有什麼缺點呢?<br>map,本身是不小

Spark效能調道——解決Spark資料傾斜(Data Skew)的N種姿勢

為何要處理資料傾斜(Data Skew) 什麼是資料傾斜 對Spark/Hadoop這樣的大資料系統來講,資料量大並不可怕,可怕的是資料傾斜。 何謂資料傾斜?資料傾斜指的是,並行處理的資料集中,某一部分(如Spark或Kafka的一個Partition)的資料顯著多於其它

Spark 效能調 Rdd reduceByKey 本地聚合(也就是map端聚合運算元)

簡單程式碼 val lines = sc.textFile("hdfs://") val words = lines.flatMap(_.split(" ")) val pairs = words.map((_, 1)) val counts = pairs.reduceByKey(_

Spark效能調-RDD運算元調篇(深度好文面試常問建議收藏)

## RDD運算元調優 不廢話,直接進入正題! #### 1. RDD複用 在對RDD進行運算元時,要避免相同的運算元和計算邏輯之下對RDD進行重複的計算,如下圖所示: ![RDD的重複計算](https://cdn.jsdelivr.net/gh/sunmyuan/cdn/210228_1.png)

Nginx效能調快取記憶體

Nginx可以快取一些檔案(一般是靜態檔案),減少Nginx與後端伺服器的IO,提高使用者訪問速度。而且當後端伺服器宕機時,Nginx伺服器能給出相應的快取檔案響應相關的使用者請求。 一 Nginx靜態快取基本配置 在tomcat的webapps目錄下建立hello.html,內容

效能調MySQL篇三:MySQL配置定位以及優化

1、優化方式 一般的優化方法有:硬體優化,配置優化,sql優化,表結構優化。下面僅僅介紹配置優化,具體優化設定可以參考本人另外一篇部落格,傳送門:https://www.cnblogs.com/langhuagungun/p/9507206.html 2、mysql配置分析 1)常見瓶頸 90%系統瓶

效能調MySQL篇四:MySQL配置定位以及優化

一、CPU最大效能模式 cpu利用特點 5.1 最高可用4個核 5.5 最高可用24核 5.6 最高可用64核心 一次query對應一個邏輯CPU 你仔細檢查的話,有些伺服器上會有的一個有趣的現象:你cat /proc/cpuinfo時,會發現CPU的頻率竟然跟它標

Spark效能調---fastutil優化資料格式

Spark中應用fastutil的場景: 1、如果運算元函式使用了外部變數;那麼第一,你可以使用Broadcast廣播變數優化;第二,可以使用Kryo序列化類庫,提升序列化效能和效率;第三,如果外部變數是某種比較大的集合,那麼可以考慮使用fastutil改寫外部變數,首先從源頭上就減少記憶體的佔

spark效能調---Kryo序列化

1.為啥要用Kryo序列化 Spark運算元操作的時候如果用到外部資料的話,都會對外部資料進行序列化,Spark內部是使用Java的序列化機制,ObjectOutputStream / ObjectInputStream,物件輸入輸出流機制,來進行序列化這種預設序列化機制的好處在於,處理起來比較

spark效能調---廣播變數的使用

Broadcast Variables Broadcast variables allow the programmer to keep a read-only variable cached on each machine rather than shipping a copy of it w

Spark效能調 troubleshooting shuffle調 reduce端緩衝大小以避免OOM

reduce導致 記憶體溢位原因 reduce端拉取map端task,是map端寫一點資料,reduce端taskk就會拉取一小部分資料,立即進行後面的聚合、運算元函式應用 每次拉取資料量大小是有buffer決定的,而預設大小是48M,有時候,map端的資料量很大的情況下,reduce端

spark效能調——開發調

開發調優 目錄 開發調優 概述 原則一:避免建立重複的RDD 一個簡單的例子 原則二:儘可能複用同一個RDD 一個簡單的例子 原則三:對多次使用的RDD進行持久化 對多次使用的RDD進行持久化的程式碼示例 Spark的持久化級別 如何選擇一種最合適的持久化

Android APP全方位效能調螢幕適配終結者

優點 1. 無侵入性 首先科普下 Android 中的一個長度單位:pt,它表示一個點,是螢幕的物理尺寸,其大小為 1 英寸的 1 / 72,也就是 72pt 等於 1 英寸(其實 Android 中還有比較少見的 in 和 mm 的長度單位)。而我本次的適配使用的單位恰好是 pt,所以對你

spark效能調:資源優化

在開發完Spark作業之後,就該為作業配置合適的資源了。Spark的資源引數,基本都可以在spark-submit命令中作為引數設定。很多Spark初學者,通常不知道該設定哪些必要的引數,以及如何設定這些引數,最後就只能胡亂設定,甚至壓根兒不設定。資源引數設定的不合理,可能

spark效能調:開發調

在大資料計算領域,Spark已經成為了越來越流行、越來越受歡迎的計算平臺之一。Spark的功能涵蓋了大資料領域的離線批處理、SQL類處理、流式/實時計算、機器學習、圖計算等各種不同型別的計算操作,應用範圍與前景非常廣泛。   然而,通過Spark開發出高效能的大資料計算作業

Spark——效能調——Shuffle

一、序引     當以分散式方式處理資料時,常常需要執行map與reduce轉換。由於巨量資料必須從一個節點傳輸到另外的節點,給叢集中的cpu、磁碟、記憶體造成沉重的負載壓力,同時也會給網路頻寬帶來壓力。所以,reduce階段進行的shuffle過程,往往是效