日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Spark2内存调优总结 - 内存划分 与 内存计算 与 调参方式

發(fā)布時(shí)間:2023/12/10 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spark2内存调优总结 - 内存划分 与 内存计算 与 调参方式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

使用的Spark2以上版本所以只考慮UnifiedMemoryManager動(dòng)態(tài)內(nèi)存管理,如圖:

1. 內(nèi)存劃分 與 內(nèi)存計(jì)算 與 調(diào)參方式

1.1 三部分:Spark內(nèi)存、用戶內(nèi)存、預(yù)留內(nèi)存

  • 預(yù)留內(nèi)存:300MB 固定
  • Spark內(nèi)存和用戶內(nèi)存比例由參數(shù)spark.memory.fraction(默認(rèn)0.75) 控制
  • 計(jì)算公式:
    假設(shè):我們在submit提交參數(shù)設(shè)置 executor.memeory = 10G + 300M (方便計(jì)算),我們叫他為系統(tǒng)內(nèi)存
    那么:
    Spark內(nèi)存 = (系統(tǒng)內(nèi)存 - 預(yù)留內(nèi)存) fraction = (10G + 300M - 300M) * 0.75 = 7.5G*
    用戶內(nèi)存 = (系統(tǒng)內(nèi)存 - 預(yù)留內(nèi)存) (1 - fraction) = 10 G * (1 - 0.75) = 2.5G*
  • 1.2 Spark內(nèi)存又分為兩部分:存儲(chǔ)內(nèi)存、執(zhí)行內(nèi)存

  • 存儲(chǔ)內(nèi)存、執(zhí)行內(nèi)存比例有spark.memory.storageFraction(默認(rèn)0.5) 控制
  • 計(jì)算公式:
    假設(shè):1.1的計(jì)算成立
    那么:
    存儲(chǔ)內(nèi)存 = Spark內(nèi)存*storageFraction = 7.5G * 0.5 = 3.75G
    執(zhí)行內(nèi)存 = Spark內(nèi)存*storageFraction = 7.5G * (1 - 0.5) = 3.75G
  • 2. 內(nèi)存參數(shù)調(diào)優(yōu)

    可以看出來實(shí)際設(shè)置了10G,而執(zhí)行內(nèi)存卻只有了3.5G,所以需要根據(jù)業(yè)務(wù)來進(jìn)行參數(shù)調(diào)整。

    2.1 調(diào)大spark.memory.storageFraction=0.6

    如果程序中有需要使用內(nèi)存Cache的而不需要太多計(jì)算shuffer之類的那么可以增加存儲(chǔ)內(nèi)存,調(diào)大spark.memory.storageFraction參數(shù)

    2.2 調(diào)小spark.memory.storageFraction=0.3

  • 如果程序沒有cache而又大量shuffer就需要執(zhí)行內(nèi)存大一些,調(diào)小spark.memory.storageFraction參數(shù)
  • 如果我們程序運(yùn)行比較慢了,可以使用Jstat -gc pid來查看GC情況,當(dāng)發(fā)現(xiàn)GC頻繁,就說明執(zhí)行內(nèi)存不夠,需要調(diào)小spark.memory.storageFraction參數(shù)
  • 3. 再說一點(diǎn):JVM參數(shù)調(diào)整

  • 當(dāng)Jstat -gc pid發(fā)現(xiàn)Minor GC頻繁,但是Full GC幾乎沒有,那么就需要調(diào)整JVM參數(shù)來調(diào)大Eden伊甸園區(qū),使用-Xmn來調(diào)整
  • 大小設(shè)置:
    說一個(gè)案例:
    假設(shè):
    1.Spark讀取的是HDFS上的文件,HDFS上默認(rèn)的Block塊大小為128M
    每個(gè)executor有8個(gè)core,executor-cores來設(shè)置
  • 估算Eden區(qū)大小應(yīng)為128M * 8 大約1G,考慮survivor區(qū)-Xmn = 4/3 * 1 G 大約1.4GB
  • 2中是沒有壓縮的數(shù)據(jù),假設(shè)數(shù)據(jù)進(jìn)行壓縮了,還要考慮壓縮方式是否可以切片,例如使用Snappy壓縮不能切片,每個(gè)文件700MB,那么Eden區(qū)的設(shè)置要把解壓后數(shù)據(jù)膨脹考慮進(jìn)去,假設(shè)膨脹3倍
    估算Eden = 700M* 3 * 8 大約 16G
    -Xmn = 4/3 * 16G 大約 21.5GB,才能保證程序可以正常執(zhí)行,要不然很容易出現(xiàn)OOM,當(dāng)前還可以設(shè)置堆外內(nèi)存來緩解壓力--conf spark.memory.offHeap.size=5g
  • 更換壓縮方式,盡量使用能夠切片的壓縮方式,如果不能只能增加存儲(chǔ)的文件數(shù)來減小每個(gè)task讀取數(shù)據(jù)的大小,或者減少Executor core來增大每個(gè)core的內(nèi)存,但是Spark的并行度會(huì)降低,執(zhí)行時(shí)間變長,需要自己權(quán)衡利弊。
  • 注意:使用G1垃圾回收器時(shí),不要使用 -Xmn 選項(xiàng)或 -XX:NewRatio 等其他相關(guān)選項(xiàng)顯式設(shè)置年輕代大小。固定年輕代的大小會(huì)覆蓋暫停時(shí)間目標(biāo)。可以僅使用-Xms,-Xmx和暫停時(shí)間目標(biāo)-XX:MaxGCPauseMillis ,經(jīng)過測試如果設(shè)置-Xmn會(huì)經(jīng)常出現(xiàn)Full GC,去掉后Full GC為0次,而且總的GC時(shí)間大大減少,spark程序卡頓減少。
  • 3.1 -Xmn

    -Xmn這里需要多說一下,經(jīng)過線上執(zhí)行情況分析,一開始使用的-Xmn=18G,Spark程序執(zhí)行時(shí)間2.2小時(shí),并伴有幾十次Full GC;去掉-Xmn后,Spark程序執(zhí)行時(shí)間58分鐘,0次Full GC。第二次測試時(shí)我將每個(gè)executor_core設(shè)置為了5,第一次為8,并沒有控制變量,因?yàn)槟康厥莾?yōu)化不是測試。

    4.對象的使用

    為了減少有些數(shù)據(jù)結(jié)構(gòu)與對象的元數(shù)據(jù)占用大量空間,盡量使用:
    字符串代替對象,基本數(shù)據(jù)類型(int long)代替字符串,數(shù)組代替ArrayList等
    String內(nèi)部是一個(gè)char數(shù)據(jù),char采用UTF-16編碼,每個(gè)字符兩字節(jié),可以設(shè)置JVM參數(shù) -XX:+UseCompressedStrings采用8位來編碼每一個(gè)ASCII字符來壓縮字符。

    下面是我的參數(shù),需要根據(jù)自己的程序去修改一些參數(shù)值:

    # submit參數(shù) spark-submit --master spark://192.168.11.167:7077 \ --class $main --deploy-mode client --driver-memory 25g \ --executor-memory 45g \ --executor-cores 8 \ --total-executor-cores 320 \ --conf spark.memory.fraction=0.8 \ --conf spark.memory.storageFraction=0.3 \ --conf spark.memory.offHeap.enabled=true \ --conf spark.memory.offHeap.size=5g \ --conf spark.executor.memoryOverhead=5G \ --conf spark.speculation=true \ --conf spark.network.timeout=3000 \ --conf spark.executor.extraJavaOptions="-XX:+UseG1GC -XX:-TieredCompilation -XX:G1HeapRegionSize=16m -XX:InitiatingHeapOccupancyPercent=55 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:-UseCompressedClassPointers -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -XX:ReservedCodeCacheSize=512m -XX:+UseCodeCacheFlushing -XX:ParallelGCThreads=20 -XX:ConcGCThreads=20 -Xms20g -XX:+PrintGCDetails -XX:+PrintGCTimeStamps" \ --conf spark.driver.extraJavaOptions="-XX:+UseG1GC" \ --jars $jars xxxx.jar $date1 $max $date2 >> log/$log_file#代碼內(nèi)參數(shù) conf.set("spark.driver.maxResultSize", "8g"); conf.set("spark.serialize", "org.apache.spark.serializer.KryoSerializer"); conf.registerKryoClasses(new Class[]{ImmutableBytesWritable.class, HyperLogLog.class, HashSet.class, RegisterSet.class, IllegalArgumentException.class, FileCommitProtocol.TaskCommitMessage.class}); //conf.set("spark.kryo.registrationRequired","true"); #開啟的話類沒加到上面會(huì)報(bào)錯(cuò) conf.set("spark.kryoserializer.buffer.mb", "10"); conf.set("spark.shuffle.file.buffer", "128"); conf.set("spark.reducer.maxSizeInFlight", "144"); conf.set("spark.shuffle.io.maxRetries", "50"); conf.set("spark.shuffle.io.retryWait", "5s");

    總結(jié)

    以上是生活随笔為你收集整理的Spark2内存调优总结 - 内存划分 与 内存计算 与 调参方式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。