91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何進行spark內存、GC及數據結構調優

發布時間:2021-12-16 21:01:42 來源:億速云 閱讀:326 作者:柒染 欄目:大數據

今天就跟大家聊聊有關如何進行spark內存、GC及數據結構調優,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

一,基本概述

調優內存的使用主要有三個方面的考慮:對象的內存占用量(你可能希望整個數據集都適合內存),訪問這些數據的開銷,垃圾回收的負載。

默認情況下,java的對象是可以快速訪問的,但是相比于內部的原始數據消耗估計2-5倍的空間。主要歸于下面三個原因:

1),每個不同的Java對象都有一個“對象頭”,它大約是16個字節,包含一個指向它的類的指針。對于一個數據很少的對象(比如一個Int字段),這可以比數據大。

2),Java字符串在原始字符串數據上具有大約40字節的開銷(因為它們將它們存儲在一個Chars數組中,并保留額外的數據,例如長度),并且由于String的內部使用UTF-16編碼而將每個字符存儲為兩個字節。因此,一個10個字符的字符串可以容易地消耗60個字節。

3),常用集合類(如HashMap和LinkedList)使用鏈接的數據結構,其中每個條目都有一個“包裝器”對象(例如Map.Entry)。該對象不僅具有頭部,還包括指針(通常為8個字節)到列表中的下一個對象。

4),原始類型的集合通常將它們存儲為“boxed”對象,如java.lang.Integer。

本節將從Spark的內存管理概述開始,然后討論用戶可以采取的具體策略,以便在他/她的應用程序中更有效地使用內存。具體來說,我們將描述如何確定對象的內存使用情況,以及如何改進數據結構,或通過以序列化的格式存儲數據。然后我們將介紹調優Spark的緩存大小和Java垃圾回收器。

二,spark的內存管理概述

Spark中的內存使用大部分屬于兩類:執行和存儲。運行內存指的是用于計算的,shuffle,joins,sorts 和aggregations,然后存儲內存主要用于緩存和在集群中傳播的內部數據。在spark內部,存儲器和執行器共享一個統一的區域(M)。當沒有使用執行器內存的時候,存儲器可以獲取所有可用的執行器內存,反之亦然。如果有需要執行器可以驅逐存儲占用,但是僅僅當存儲內存大于一個閾值(R)的時候才會發生。換句話說,R描述了M內部的一個子區域,R中的緩存永遠不會被清除。由于實施的復雜性,存儲內存不得驅逐執行內存。該設計保證了幾個理想的性能。

首先,不使用緩存的應用程序可以將整個空間用于執行,從而避免不必要的磁盤溢寫。

其次,使用緩存的應用程序可以保留最小的存儲空間(R),其中數據塊不受驅逐。

最后,這種方法為各種工作負載提供了合理的開箱即用性能,而不需要用戶掌握內部如何分配內存的專業知識。

雖然有兩個相關配置,但典型用戶不需要調整它們,因為默認值適用于大多數工作負載:

1),spark.memory.fraction將M的大小表示為(JVM堆空間 - 300MB)的一部分(默認為0.75,新版本如spark2.2改為0.6)。剩余的空間(25%,對應的新版本是0.4)用于用戶數據結構,Spark中的內部元數據,并且在稀疏和異常大的記錄的情況下保護OOM錯誤。

2),spark.memory.storageFraction表示R的大小作為M的一部分(默認為0.5)。R是M內的存儲空間,其中緩存的塊免于被執行器驅逐。

三,確定內存的消耗

最好的方式去計算一個數據的的內存消耗,就是創建一個RDD,然后加入cache,這樣就可以在web ui中Storage頁面看到了。頁面會告訴你,這個RDD消耗了多少內存。

要估計特定對象的內存消耗,請使用SizeEstimator的估計方法。這對于嘗試使用不同的數據布局來修剪內存使用情況以及確定廣播變量在每個執行程序堆中占用的空間量非常有用。

四,調優數據結構

減少內存消耗的第一種方法是避免使用增加負擔的java特性,例如基于指針的數據結構和包裝對象。下面幾種方法可以來避免這個。

1,將數據結構設計為偏好對象數組和原始類型,而不是標準的Java或Scala集合類(例如HashMap)。fastutil庫(http://fastutil.di.unimi.it/)為與Java標準庫兼容的原始類型提供方便的集合類。

2,盡可能避免使用有很多小對象和指針的嵌套結構。

3,針對關鍵詞,考慮使用數字ID或者枚舉對象而不是字符串。

4,如果您的RAM少于32 GB,請設置JVM標志-XX:+ UseCompressedOops使指針為四個字節而不是八個字節。您可以在spark-env.sh中添加這些選項。

五,序列化RDD

盡管進行了調優,當您的對象仍然太大而無法有效存儲時,一個簡單的方法來減少內存使用是使用RDD持久性API中的序列化StorageLevel(如MEMORY_ONLY_SER)以序列化形式存儲它們。Spark將會將每個RDD分區存儲為一個大字節數組。以序列化形式存儲數據的唯一缺點是數據訪問變慢,因為必須對每個對象進行反序列化。如果您想以序列化形式緩存數據,我們強烈建議使用Kryo,因為它會使數據比java序列化后的大小更小(而且肯定比原Java對象更小)。

六,垃圾回收調優

1,基本介紹

當你程序的RDD頻繁的變動的時候,垃圾回收將會是一個問題。RDD的一次讀入,然后有很多種基于它的計算,這種情況下垃圾回收沒啥問題。當JAVA需要驅逐舊的對象,為新對象騰出空間的時候,需要跟蹤所有Java對象并找到無用的對象。要記住的要點是,垃圾收集的成本與Java對象的數量成正比,因此使用較少對象的數據結構(例如,Ints數組,代替LinkedList)將大大降低了成本。一個更好的方法是以序列化形式持久化對象,如上所述:每個RDD分區將只有一個對象(一個字節數組)。在嘗試其他技術之前,如果GC是一個問題,首先要嘗試的是使用序列化緩存。

由于任務的運行內存和RDD的緩存內存的干擾,GC也會是一個問題。

2,測量GC的影響

GC調優的第一步是收集關于垃圾收集發生頻率和GC花費的時間的統計信息。通過將-verbose:gc -XX:+ PrintGCDetails -XX:+ PrintGCTimeStamps添加到Java選項來完成。下次運行Spark作業時,每當垃圾收集發生時,都會看到在工作日志中打印的消息。請注意,這些日志將在您的群集的Executor節點上(在其工作目錄中的stdout文件中),而不是您的driver功能中。

3,高級GC調優

為了進一步調整垃圾收集,我們首先需要了解一些關于JVM內存管理的基本信息<詳細的請看:JVM的垃圾回收算法>:

1),java的堆內存分為兩個區域新生代和老年代。新生代保存的是生命周期比較短的對象,老年代保存生命周期比較長的對象。

2),新生代又分為了三個區域(Eden, Survivor1, Survivor2)。

3),垃圾收集過程的簡化說明:當Eden已滿時,Eden上運行了一個minor GC,并將Eden和Survivor1中存在的對象復制到Survivor2。Survivor 將進行交換。如果一個對象足夠老,或者Survivor2已滿,則會移動到老年代。最后當老年代接近滿的時候,會觸發full GC。

Spark應用程序GC調優的目標是,確保生命周期比較長的RDD保存在老年代,新生代有足夠的空間保存生命周期比較短的對象。這有助于避免觸發Full GC去收集task運行期間產生的臨時變量。下面列舉幾個有用的步驟:

1),通過收集垃圾回收信息,判斷是否有太多的垃圾回收過程。假如full gc在一個task完成之前觸發了好幾次,那說明運行task的內存空間不足,需要加內存。

2),在gc的統計信息中,如果老年代接近滿了,減少用于緩存的內存(通過減小spark.memory.Fraction)。緩存較少的對象比降低運行速度對我們來說更有好處。另外,可以考慮減少年輕代。可以通過減小-Xmn參數設置的值,假如使用的話。假如沒有設置可以修改JVM的NewRation參數。大多數JVMs默認值是2,意思是老年代占用了三分之二的總內存。這個值要足夠大,相當于擴展了spark.memory.fraction.

3),如果有太多的minor gc,較少的major gc,增加Eden區內存會有幫助。將Eden區內存設置的比task運行估計內存稍微大一些。如果Eden區大小確定為E,那就將新生代的內存設置為-Xmn=4/3E,按比例增加內存是考慮到survivor區所占用的內存。

4),嘗試通過設置-XX:+UseG1GC垃圾回收器為G1。在垃圾回收器是瓶頸的一些情況下,它可以提高性能。請注意,對于大的Executor堆,通過使用-XX:G!HeapRegionSize去增大G1的堆大小,顯得尤為重要。

5),例如,如果您的任務是從HDFS讀取數據,則可以使用從HDFS讀取的數據塊的大小來估計任務使用的內存量。請注意,解壓縮塊的大小通常是塊大小的2或3倍。所以如果我們希望有3或4個任務的工作空間,HDFS塊的大小是64 MB,我們可以估計Eden的大小是4 * 3 * 64MB。

5),監控垃圾收集的頻率和時間如何隨著新設置的變化而變化。

經驗表明,GC調整的效果取決于您的應用程序和可用的內存量。下面的鏈接里有更多的在線描述的調優的選項,但在高層次上,管理GC的全面發生頻率有助于減少開銷。

看完上述內容,你們對如何進行spark內存、GC及數據結構調優有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

苏尼特左旗| 台湾省| 垦利县| 个旧市| 旅游| 卓资县| 扶余县| 平果县| 烟台市| 东阳市| 屏东市| 永善县| 绩溪县| 塔城市| 方城县| 子长县| 集安市| 双桥区| 湟中县| 鄂托克旗| 南乐县| 平顺县| 德化县| 钟祥市| 韶关市| 高州市| 兰坪| 黎城县| 张家川| 晋中市| 光泽县| 任丘市| 会理县| 犍为县| 泰和县| 曲沃县| 桃园县| 荆门市| 涟源市| 闻喜县| 黎川县|