国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

spark 數(shù)據(jù)序列化和內(nèi)存調(diào)優(yōu)(翻譯)

這篇具有很好參考價(jià)值的文章主要介紹了spark 數(shù)據(jù)序列化和內(nèi)存調(diào)優(yōu)(翻譯)。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

由于大多數(shù)Spark計(jì)算的內(nèi)存性質(zhì),Spark程序可能會被集群中的任何資源瓶頸:CPU、網(wǎng)絡(luò)帶寬或內(nèi)存。大多數(shù)情況下,如果數(shù)據(jù)能放在內(nèi)存,瓶頸是網(wǎng)絡(luò)帶寬,但有時(shí),您還需要進(jìn)行一些調(diào)整,例如以序列化形式存儲RDD,以減少內(nèi)存使用。本指南將涵蓋兩個(gè)主要主題:數(shù)據(jù)序列化,這對良好的網(wǎng)絡(luò)性能至關(guān)重要,也可以減少內(nèi)存使用,以及內(nèi)存調(diào)整。

Data Serialization

序列化在任何分布式應(yīng)用程序的性能中都起著重要的作用。將對象序列化很慢或消耗大量字節(jié)的格式會大大減慢計(jì)算速度。通常,這將是優(yōu)化Spark應(yīng)用程序的第一件事。Spark旨在在便利性(允許您在操作中使用任何Java類型)和性能之間取得平衡。它提供了兩個(gè)序列化庫:

  • Java serialization:靈活但通常非常慢,并且導(dǎo)致許多類的序列化格式很大。

  • Kryo serialization: Kryo 比 Java 序列化速度更快、更緊湊(通???10 倍),但不支持所有可序列化類型,并且需要您提前注冊將在程序中使用的類以獲得最佳性能。

Memory Tuning

調(diào)整內(nèi)存使用有三個(gè)注意事項(xiàng):對象使用的內(nèi)存量(您可能希望整個(gè)數(shù)據(jù)集能放在內(nèi)存)、訪問這些對象的成本以及垃圾回收機(jī)制的開銷(如果您的對象周轉(zhuǎn)率很高)

默認(rèn)情況下,Java 對象的訪問速度很快,但很容易消耗比其字段內(nèi)的“原始”數(shù)據(jù)多 2-5 倍的空間。這是由于以下幾個(gè)原因:

  • 每個(gè)不同的Java對象都有一個(gè)“對象頭”,大約16個(gè)字節(jié),包含指向其類的指針等信息。對于數(shù)據(jù)很少的對象(比如一個(gè)Int字段),這可能比數(shù)據(jù)大。
  • Java字符串在原始字符串?dāng)?shù)據(jù)上有大約40個(gè)字節(jié)的開銷(因?yàn)樗鼈儗⑵浯鎯υ贑hars數(shù)組中并保留額外的數(shù)據(jù),例如長度),并且由于String內(nèi)部使用UTF-16編碼,每個(gè)字符都存儲為兩個(gè)字節(jié)。因此,一個(gè)10個(gè)字符的字符串很容易消耗60個(gè)字節(jié)。
  • 常見的集合類,如HashMap和LinkedList,使用鏈接數(shù)據(jù)結(jié)構(gòu),其中每個(gè)條目都有一個(gè)“包裝器”對象(例如Map. Entry)。這個(gè)對象不僅有一個(gè)標(biāo)題,還有指向列表中下一個(gè)對象的指針(通常每個(gè)8個(gè)字節(jié))。
  • 原始類型的集合通常將它們存儲為“裝箱”對象,例如java. lang.Integer。

Memory Management Overview

Spark中的內(nèi)存使用在很大程度上屬于以下兩類之一:執(zhí)行(execution)和存儲(storage)。執(zhí)行內(nèi)存是指用于shuffles, joins, sorts and aggregations中的計(jì)算,而存儲內(nèi)存是指用于cache和跨集群傳播內(nèi)部數(shù)據(jù)的內(nèi)存。在Spark中,執(zhí)行和存儲共享一個(gè)統(tǒng)一的內(nèi)存區(qū)域(M)。當(dāng)不使用執(zhí)行內(nèi)存時(shí),存儲可以獲取所有可用內(nèi)存,反之亦然。如果需要,執(zhí)行可能會驅(qū)逐存儲,但只有在總存儲內(nèi)存使用低于某個(gè)閾值(R)之前。換句話說,R描述了M中的一個(gè)子區(qū)域,其中緩存塊永遠(yuǎn)不會被驅(qū)逐。由于實(shí)現(xiàn)的復(fù)雜性,存儲可能不會驅(qū)逐執(zhí)行。

這種設(shè)計(jì)確保了幾個(gè)理想的屬性。首先,不使用緩存的應(yīng)用程序可以使用整個(gè)空間來執(zhí)行,避免不必要的磁盤溢出。其次,使用緩存的應(yīng)用程序可以保留最小的存儲空間(R),其中它們的數(shù)據(jù)塊不會被驅(qū)逐。最后,這種方法為各種工作負(fù)載提供了合理的開箱即用性能,而不需要用戶了解如何在內(nèi)部劃分內(nèi)存。

盡管有兩個(gè)相關(guān)配置,但典型用戶不需要調(diào)整它們,因?yàn)槟J(rèn)值適用于大多數(shù)工作負(fù)載:

  • spark.memory.fraction M除以JVM堆空間(默認(rèn)0.6)。其余空間(40%)保留給用戶數(shù)據(jù)結(jié)構(gòu)、Spark中的內(nèi)部元數(shù)據(jù),并在記錄稀疏和異常大的情況下防止OOM錯(cuò)誤。
  • spark.memory.storageFraction R/M的值(默認(rèn) 0.5)。 R 是 M 中的存儲空間,其中緩存的塊不會被執(zhí)行驅(qū)逐。

Determining Memory Consumption

確定dataset所需內(nèi)存消耗量的最佳方法是創(chuàng)建 RDD,將其放入緩存中,然后查看 Web UI 中的“Storage”頁面。該頁面會告訴您 RDD 占用了多少內(nèi)存。

要估計(jì)特定對象的內(nèi)存消耗,請使用SizeEstimator’s的估計(jì)方法。這對于嘗試不同的數(shù)據(jù)布局來削減內(nèi)存使用以及確定廣播變量將在每個(gè)executor堆上占用的空間量很有用。

Tuning Data Structures

減少內(nèi)存消耗的第一個(gè)方法是避免增加開銷的 Java 功能,例如基于指針的數(shù)據(jù)結(jié)構(gòu)和包裝對象。做這件事有很多種方法:

  1. 將您的數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)為更傾向于對象數(shù)組和基本類型,而不是標(biāo)準(zhǔn)的Java或Scala集合類(例如HashMap)。Fastutil庫為與Java標(biāo)準(zhǔn)庫兼容的基本類型提供了方便的集合類。
  2. 盡可能避免包含大量小對象和指針的嵌套結(jié)構(gòu)。
  3. 考慮使用數(shù)字 ID 或枚舉對象而不是字符串作為鍵。
  4. 如果您的 RAM 小于 32 GB,請?jiān)O(shè)置 JVM 標(biāo)志 -XX:+UseCompressedOops 以使指針為 4 個(gè)字節(jié)而不是 8 個(gè)字節(jié)。您可以在spark-env.sh中添加這些選項(xiàng)。

Garbage Collection Tuning

當(dāng)您的程序存儲的RDD有大量“churn”時(shí),JVM垃圾回收機(jī)制可能會出現(xiàn)問題。(在只讀取一次RDD然后對其運(yùn)行許多操作的程序中,這通常不是問題。)當(dāng)Java需要驅(qū)逐舊對象以為新對象騰出空間時(shí),它需要跟蹤所有Java對象并找到未使用的對象。這里要記住的要點(diǎn)是,垃圾收集的成本與 Java 對象的數(shù)量成正比,因此使用對象較少的數(shù)據(jù)結(jié)構(gòu)(例如 Int 數(shù)組而不是 LinkedList)可以大大降低此成本。一個(gè)更好的方法是以序列化的形式持久化對象,如上所述:現(xiàn)在每個(gè)RDD分區(qū)只有一個(gè)對象(一個(gè)字節(jié)數(shù)組)。在嘗試其他技術(shù)之前,如果GC有問題,首先要嘗試的是使用序列化緩存。

由于task的工作內(nèi)存(運(yùn)行任務(wù)所需的內(nèi)存)和節(jié)點(diǎn)上緩存的 RDD 之間的干擾,GC 也可能成為一個(gè)問題。我們將討論如何控制分配給 RDD 緩存的空間來緩解這種情況。

Advanced GC Tuning

在Spark中進(jìn)行GC調(diào)優(yōu)的目的是確保只有長壽命RDD存儲在老年代中,而年輕代的大小足以存儲短壽命對象。這將有助于避免使用完整的GC來收集在任務(wù)執(zhí)行期間創(chuàng)建的臨時(shí)對象。一些可能有用的步驟是:

  • 通過收集 GC 統(tǒng)計(jì)信息來檢查是否存在過多垃圾回收。如果在任務(wù)完成之前多次調(diào)用完整GC,則意味著沒有足夠的內(nèi)存可用于執(zhí)行任務(wù)。
  • 如果有太多的minor GC,但major GC不多,為Eden分配更多的內(nèi)存會有所幫助。您可以將Eden的大小設(shè)置為對每個(gè)任務(wù)需要多少內(nèi)存的高估。如果Eden的大小確定為E,那么您可以使用選項(xiàng)-Xmn=4/3*E設(shè)置年輕一代的大小。(擴(kuò)大4/3也是為了考慮幸存者區(qū)域使用的空間。)
  • 在打印的GC統(tǒng)計(jì)信息中,如果老年代接近滿,則通過降低spark.memory.fraction來減少用于緩存的內(nèi)存量;緩存更少的對象比減慢任務(wù)執(zhí)行速度要好?;蛘?,考慮減小年輕代的大小。如果您已按上述方式設(shè)置,這意味著降低-Xmn。如果沒有,請嘗試更改JVM的NewRatio參數(shù)的值。許多JVM將其默認(rèn)為2,這意味著舊一代占據(jù)了堆的2/3。它應(yīng)該足夠大,以便該值超過spark.memory.fraction。
  • 嘗試使用-XX:+UseG1GC的G1GC垃圾回收器。它可以在垃圾回收機(jī)制成為瓶頸的某些情況下提高性能。請注意,對于大型執(zhí)行器堆大小,使用-XX:G1HeapRegionSize增加G1區(qū)域大小可能很重要。
  • 例如,如果您的任務(wù)正在從HDFS讀取數(shù)據(jù),則可以使用從HDFS讀取的數(shù)據(jù)塊的大小來估計(jì)任務(wù)使用的內(nèi)存量。請注意,解壓縮塊的大小通常是塊大小的2或3倍。因此,如果我們希望有3或4個(gè)任務(wù)的工作空間,并且HDFS塊大小為128 MiB,我們可以估計(jì)Eden的大小為43128MiB。

Other Considerations

Level of Parallelism

除非您將每個(gè)操作的并行大小設(shè)置得足夠高,否則集群將不會得到充分利用。Spark會根據(jù)每個(gè)文件的大小自動設(shè)置要在其上運(yùn)行的“map”任務(wù)的數(shù)量(盡管您可以通過SparkContext. textFile等的可選參數(shù)來控制它),并且對于分布式“reduce”操作,例如groupByKey和elereByKey,它使用最大的父RDD的分區(qū)數(shù)。您可以將parallelism作為第二個(gè)參數(shù)傳遞(請參閱park.PairRDDFunctions留檔),或者設(shè)置config屬性park.default.并行來更改默認(rèn)值。一般情況下,我們建議您的集群中每個(gè)CPU內(nèi)核執(zhí)行2-3個(gè)任務(wù)。

Data Locality

數(shù)據(jù)局部性會對Spark作業(yè)的性能產(chǎn)生重大影響。如果數(shù)據(jù)和對其進(jìn)行操作的代碼在一起,那么計(jì)算往往會很快。但是如果代碼和數(shù)據(jù)是分開的,一個(gè)必須移動到另一個(gè)。通常,從一個(gè)地方到另一個(gè)地方運(yùn)送序列化代碼比運(yùn)送一塊數(shù)據(jù)要快,因?yàn)榇a大小比數(shù)據(jù)小得多。Spark圍繞數(shù)據(jù)局部性的一般原則構(gòu)建了調(diào)度。

數(shù)據(jù)局部性是數(shù)據(jù)與處理它的代碼的接近程度。根據(jù)數(shù)據(jù)的當(dāng)前位置,有幾個(gè)級別的局部性。從最近到最遠(yuǎn)的順序:

  • PROCESS_LOCAL 數(shù)據(jù)與正在運(yùn)行的代碼位于同一 JVM 中。這是最好的位置。
  • NODE_LOCAL 數(shù)據(jù)位于同一節(jié)點(diǎn)上。例如,可能位于同一節(jié)點(diǎn)上的 HDFS 中,或者位于同一節(jié)點(diǎn)上的另一個(gè)executor中。這比 PROCESS_LOCAL 慢一點(diǎn),因?yàn)閿?shù)據(jù)必須在進(jìn)程之間傳輸。
  • NO_PREF 從任何地方都可以同樣快速地訪問數(shù)據(jù),并且沒有位置偏好。
  • RACK_LOCAL 數(shù)據(jù)位于同一機(jī)架的服務(wù)器上。數(shù)據(jù)位于同一機(jī)架上的不同服務(wù)器上,因此需要通過網(wǎng)絡(luò)發(fā)送,通常通過單個(gè)交換機(jī)。
  • ANY 數(shù)據(jù)位于網(wǎng)絡(luò)上的其他位置,而不是位于同一機(jī)架中。

Spark傾向于將所有任務(wù)安排在最佳locality級別,但這并不總是可能的。在任何空閑執(zhí)行器上沒有未處理數(shù)據(jù)的情況下,Spark會切換到較低的本地級別。有兩種選擇: a)等到繁忙的CPU空閑后再啟動同一臺服務(wù)器上處理該數(shù)據(jù)的任務(wù) b)立即在更遠(yuǎn)的地方啟動新任務(wù),需要將數(shù)據(jù)移動到那里。

Spark通常會等待一段時(shí)間,希望忙碌的CPU能釋放出來。一旦超時(shí)到期,它就會開始將數(shù)據(jù)從很遠(yuǎn)的地方移動到空閑的CPU。每個(gè)級別之間回退的等待超時(shí)可以單獨(dú)配置,也可以在一個(gè)參數(shù)中一起配置;有關(guān)詳細(xì)信息,請參閱配置頁面上的spark.locality參數(shù)。如果您的任務(wù)執(zhí)行耗時(shí)很長并且局部性較差,則應(yīng)該增加這些設(shè)置,但默認(rèn)值通常效果很好

Summary

這是一個(gè)簡短的指南,指出了在調(diào)整Spark應(yīng)用程序時(shí)應(yīng)該了解的主要問題——最重要的是數(shù)據(jù)序列化和內(nèi)存調(diào)整。對于大多數(shù)程序,切換到Kryo序列化并以序列化形式持久化數(shù)據(jù)將解決大多數(shù)常見的性能問題文章來源地址http://www.zghlxwxcb.cn/news/detail-838614.html

到了這里,關(guān)于spark 數(shù)據(jù)序列化和內(nèi)存調(diào)優(yōu)(翻譯)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【高?!緼pache Airflow Spark Provider 反序列化漏洞 (CVE-2023-40195)

    【高?!緼pache Airflow Spark Provider 反序列化漏洞 (CVE-2023-40195)

    zhi.oscs1024.com????? 漏洞類型 反序列化 發(fā)現(xiàn)時(shí)間 2023-08-29 漏洞等級 高危 MPS編號 MPS-qkdx-17bc CVE編號 CVE-2023-40195 漏洞影響廣度 廣 OSCS 描述 Apache Airflow Spark Provider是Apache Airflow項(xiàng)目的一個(gè)插件,用于在Airflow中管理和調(diào)度Apache Spark作業(yè)。 受影響版本中,由于沒有對conn_prefix參

    2024年02月10日
    瀏覽(29)
  • Java安全之反序列化回顯與內(nèi)存碼

    Java安全之反序列化回顯與內(nèi)存碼

    import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Modifier; import java.util.ArrayList; @WebServlet(“/demoServlet”) public class demoServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletEx

    2024年04月15日
    瀏覽(26)
  • 網(wǎng)絡(luò)數(shù)據(jù)通信—ProtoBuf實(shí)現(xiàn)序列化和反序列化

    目錄 前言 1.環(huán)境搭建 2. centos下編寫的注意事項(xiàng) 3.約定雙端交互接口 4.約定雙端交互req/resp 5. 客戶端代碼實(shí)現(xiàn) 6.服務(wù)端代碼實(shí)現(xiàn) Protobuf還常用于通訊協(xié)議、服務(wù)端數(shù)據(jù)交換場景。那么在這個(gè)示例中,我們將實(shí)現(xiàn)一個(gè)網(wǎng)絡(luò)版本的通訊錄,模擬實(shí)現(xiàn)客戶端與服務(wù)端的交互,通過P

    2024年02月04日
    瀏覽(18)
  • c++ 使用rapidjson對數(shù)據(jù)序列化和反序列化(vs2109)

    c++ 使用rapidjson對數(shù)據(jù)序列化和反序列化(vs2109)

    ??RapidJSON是騰訊開源的一個(gè)高效的C++ JSON解析器及生成器,它是只有頭文件的C++庫,綜合性能是最好的。 1. 安裝 在NuGet中為項(xiàng)目安裝tencent.rapidjson 2. 引用頭文件 #include rapidjson/document.h #include rapidjson/memorystream.h #include rapidjson/prettywriter.h 3. 頭文件定義 添加測試json字符串和類型

    2024年02月07日
    瀏覽(21)
  • Flink 數(shù)據(jù)序列化

    Flink 數(shù)據(jù)序列化

    大家都知道現(xiàn)在大數(shù)據(jù)生態(tài)非常火,大多數(shù)技術(shù)組件都是運(yùn)行在 JVM 上的, Flink 也是運(yùn)行在 JVM 上,基于 JVM 的數(shù)據(jù)分析引擎都需要將大量的數(shù)據(jù)存儲在內(nèi)存中,這就不得不面臨 JVM 的一些問題,比如 Java 對象存儲密度較低等。針對這些問題,最常用的方法就是實(shí)現(xiàn)一個(gè)顯式的

    2024年02月04日
    瀏覽(23)
  • 【數(shù)據(jù)結(jié)構(gòu)】二叉樹篇|超清晰圖解和詳解:二叉樹的序列化和反序列化

    【數(shù)據(jù)結(jié)構(gòu)】二叉樹篇|超清晰圖解和詳解:二叉樹的序列化和反序列化

    博主簡介: 努力學(xué)習(xí)的22級計(jì)算機(jī)科學(xué)與技術(shù)本科生一枚?? 博主主頁: @是瑤瑤子啦 每日一言??: 你不能要求一片海洋,沒有風(fēng)暴,那不是海洋,是泥塘——畢淑敏 ?? 序列化 :本質(zhì)就是 二叉樹的遍歷 ,就那么幾個(gè):前序、中序、后序、層序。而序列化只不過就是 在遍歷到

    2024年02月10日
    瀏覽(20)
  • 安卓數(shù)據(jù)存儲補(bǔ)充:XML序列化

    序列化是將對象狀態(tài)轉(zhuǎn)換為可保存或傳輸?shù)母袷降倪^程。我們可以把對象序列化為不同的格式,比如說:JSon序列化、XML序列化、二進(jìn)制序列化等等,不同的形式適應(yīng)不同的業(yè)務(wù)需求。 把對象的成員變量轉(zhuǎn)化為XML格式,需要使用Xml序列化器(XmlSerializer類),序列化之后的對象

    2024年02月10日
    瀏覽(24)
  • 數(shù)據(jù)序列化工具Protobuf編碼&避坑指南

    數(shù)據(jù)序列化工具Protobuf編碼&避坑指南

    先簡單介紹一下 Protocol Buffers(protobuf),它是 Google 開發(fā)的一種數(shù)據(jù)序列化協(xié)議(與 XML、JSON 類似)。它具有很多優(yōu)點(diǎn),但也有一些需要注意的缺點(diǎn): 優(yōu)點(diǎn): 效率高 :Protobuf 以二進(jìn)制格式存儲數(shù)據(jù),比如 XML 和 JSON 等文本格式更緊湊,也更快。序列化和反序列化的速度也很

    2024年02月13日
    瀏覽(23)
  • python序列化和結(jié)構(gòu)化數(shù)據(jù)詳解

    序列化和結(jié)構(gòu)化數(shù)據(jù)是計(jì)算機(jī)程序中非常重要的概念,它們的原理和應(yīng)用在許多應(yīng)用程序中都是必不可少的。Python作為一種高級編程語言,在序列化和結(jié)構(gòu)化數(shù)據(jù)方面提供了很多優(yōu)秀的解決方案。在本文中,我們將詳細(xì)介紹Python中序列化和結(jié)構(gòu)化數(shù)據(jù)的相關(guān)概念和應(yīng)用。 1.

    2024年02月08日
    瀏覽(28)
  • 4.4 C++ Boost 數(shù)據(jù)集序列化庫

    Boost 庫是一個(gè)由C/C++語言的開發(fā)者創(chuàng)建并更新維護(hù)的開源類庫,其提供了許多功能強(qiáng)大的程序庫和工具,用于開發(fā)高質(zhì)量、可移植、高效的C應(yīng)用程序。Boost庫可以作為標(biāo)準(zhǔn)C庫的后備,通常被稱為準(zhǔn)標(biāo)準(zhǔn)庫,是C標(biāo)準(zhǔn)化進(jìn)程的重要開發(fā)引擎之一。使用Boost庫可以加速C應(yīng)用程序的開

    2024年02月12日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包