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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Hadoop之Hadoop企业优化(HDFS小文件优化)

發(fā)布時(shí)間:2024/2/28 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hadoop之Hadoop企业优化(HDFS小文件优化) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Hadoop之Hadoop企業(yè)優(yōu)化


目錄

  • MapReduce 跑的慢的原因
  • MapReduce優(yōu)化方法之?dāng)?shù)據(jù)輸入
  • MapReduce優(yōu)化方法之Map階段
  • MapReduce優(yōu)化方法之Reduce階段
  • MapReduce優(yōu)化方法之I/O傳輸
  • MapReduce優(yōu)化方法之?dāng)?shù)據(jù)傾斜問題
  • MapReduce優(yōu)化方法之常用的調(diào)優(yōu)參數(shù)
  • HDFS小文件優(yōu)化方法

  • 1. MapReduce 跑的慢的原因

    Mapreduce 程序效率的瓶頸在于兩點(diǎn):

  • 計(jì)算機(jī)性能
    CPU、內(nèi)存、磁盤健康、網(wǎng)絡(luò)

  • I/O 操作優(yōu)化
    (1)數(shù)據(jù)傾斜
    (2)map和reduce數(shù)設(shè)置不合理
    (3)map運(yùn)行時(shí)間太長,導(dǎo)致reduce等待過久
    (4)小文件過多
    (5)大量的不可分塊的超大文件
    (6)spill次數(shù)過多
    (7)merge次數(shù)過多等。


  • MapReduce優(yōu)化方法主要從六個(gè)方面考慮:數(shù)據(jù)輸入、Map階段、Reduce階段、IO傳輸、數(shù)據(jù)傾斜問題和常用的調(diào)優(yōu)參數(shù)。


    2. MapReduce優(yōu)化方法之?dāng)?shù)據(jù)輸入

  • 合并小文件:在執(zhí)行mr任務(wù)前將小文件進(jìn)行合并,大量的小文件會(huì)產(chǎn)生大量的map任務(wù),增大map任務(wù)裝載次數(shù),而任務(wù)的裝載比較耗時(shí),從而導(dǎo)致mr運(yùn)行較慢。

  • 采用CombineTextInputFormat來作為輸入,解決輸入端大量小文件場(chǎng)景。


  • 3. MapReduce優(yōu)化方法之Map階段

  • 減少溢寫(spill)次數(shù):通過調(diào)整io.sort.mb及sort.spill.percent參數(shù)值,增大觸發(fā)spill的內(nèi)存上限,減少spill次數(shù),從而減少磁盤IO。

  • 減少合并(merge)次數(shù):通過調(diào)整io.sort.factor參數(shù),增大merge的文件數(shù)目,減少merge的次數(shù),從而縮短mr處理時(shí)間。

  • 在map之后,不影響業(yè)務(wù)邏輯前提下,先進(jìn)行combine處理,減少 I/O。


  • 4. MapReduce優(yōu)化方法之Reduce階段

  • 合理設(shè)置map和reduce數(shù):兩個(gè)都不能設(shè)置太少,也不能設(shè)置太多。太少,會(huì)導(dǎo)致task等待,延長處理時(shí)間;太多,會(huì)導(dǎo)致 map、reduce任務(wù)間競(jìng)爭資源,造成處理超時(shí)等錯(cuò)誤。

  • 設(shè)置map、reduce共存:調(diào)整slowstart.completedmaps參數(shù),使map運(yùn)行到一定程度后,reduce也開始運(yùn)行,減少reduce的等待時(shí)間。

  • 規(guī)避使用reduce:因?yàn)閞educe在用于連接數(shù)據(jù)集的時(shí)候?qū)?huì)產(chǎn)生大量的網(wǎng)絡(luò)消耗。

  • 合理設(shè)置reduce端的buffer:默認(rèn)情況下,數(shù)據(jù)達(dá)到一個(gè)閾值的時(shí)候,buffer中的數(shù)據(jù)就會(huì)寫入磁盤,然后reduce會(huì)從磁盤中獲得所有的數(shù)據(jù)。也就是說,buffer和reduce是沒有直接關(guān)聯(lián)的,中間多個(gè)一個(gè)寫磁盤->讀磁盤的過程,既然有這個(gè)弊端,那么就可以通過參數(shù)來配置,使得buffer中的一部分?jǐn)?shù)據(jù)可以直接輸送到reduce,從而減少IO開銷:mapred.job.reduce.input.buffer.percent,默認(rèn)為0.0。當(dāng)值大于0的時(shí)候,會(huì)保留指定比例的內(nèi)存讀buffer中的數(shù)據(jù)直接拿給reduce使用。這樣一來,設(shè)置buffer需要內(nèi)存,讀取數(shù)據(jù)需要內(nèi)存,reduce計(jì)算也要內(nèi)存,所以要根據(jù)作業(yè)的運(yùn)行情況進(jìn)行調(diào)整。


  • 5. MapReduce優(yōu)化方法之I/O傳輸

  • 采用數(shù)據(jù)壓縮的方式,減少網(wǎng)絡(luò)IO的的時(shí)間。安裝Snappy和LZO壓縮編碼器。
  • 使用SequenceFile二進(jìn)制文件。

  • 6. MapReduce優(yōu)化方法之?dāng)?shù)據(jù)傾斜問題

  • 數(shù)據(jù)傾斜現(xiàn)象
    數(shù)據(jù)頻率傾斜——某一個(gè)區(qū)域的數(shù)據(jù)量要遠(yuǎn)遠(yuǎn)大于其他區(qū)域。
    數(shù)據(jù)大小傾斜——部分記錄的大小遠(yuǎn)遠(yuǎn)大于平均值。

  • 如何收集傾斜數(shù)據(jù)
    在reduce方法中加入記錄map輸出鍵的詳細(xì)情況的功能。

  • public static final String MAX_VALUES = "skew.maxvalues"; private int maxValueThreshold; @Override public void configure(JobConf job) { maxValueThreshold = job.getInt(MAX_VALUES, 100); } @Override public void reduce(Text key, Iterator<Text> values,OutputCollector<Text, Text> output, Reporter reporter) throws IOException {int i = 0;while (values.hasNext()) {values.next();i++;}if (++i > maxValueThreshold) {log.info("Received " + i + " values for key " + key);} }
  • 減少數(shù)據(jù)傾斜的方法
  • 抽樣和范圍分區(qū)
    可以通過對(duì)原始數(shù)據(jù)進(jìn)行抽樣得到的結(jié)果集來預(yù)設(shè)分區(qū)邊界值。
  • 自定義分區(qū)
    基于輸出鍵的背景知識(shí)進(jìn)行自定義分區(qū)。例如,如果map輸出鍵的單詞來源于一本書。且其中某幾個(gè)專業(yè)詞匯較多。那么就可以自定義分區(qū)將這這些專業(yè)詞匯發(fā)送給固定的一部分reduce實(shí)例。而將其他的都發(fā)送給剩余的reduce實(shí)例。
  • Combine
    使用Combine可以大量地減小數(shù)據(jù)傾斜。在可能的情況下,combine的目的就是聚合并精簡數(shù)據(jù)。
  • 采用Map Join,盡量避免Reduce Join。

  • 7. MapReduce優(yōu)化方法之常用的調(diào)優(yōu)參數(shù)

    資源相關(guān)參數(shù)

  • 以下參數(shù)是在用戶自己的mr應(yīng)用程序中配置就可以生效(mapred-default.xml)
  • 配置參數(shù)參數(shù)說明
    mapreduce.map.memory.mb一個(gè)Map Task可使用的資源上限(單位:MB),默認(rèn)為1024。如果Map Task實(shí)際使用的資源量超過該值,則會(huì)被強(qiáng)制殺死。
    mapreduce.reduce.memory.mb一個(gè)Reduce Task可使用的資源上限(單位:MB),默認(rèn)為1024。如果Reduce Task實(shí)際使用的資源量超過該值,則會(huì)被強(qiáng)制殺死。
    mapreduce.map.cpu.vcores每個(gè)Map task可使用的最多cpu core數(shù)目,默認(rèn)值: 1
    mapreduce.reduce.cpu.vcores每個(gè)Reduce task可使用的最多cpu core數(shù)目,默認(rèn)值: 1
    mapreduce.reduce.shuffle.parallelcopies每個(gè)reduce去map中拿數(shù)據(jù)的并行數(shù)。默認(rèn)值是5
    mapreduce.reduce.shuffle.merge.percentbuffer中的數(shù)據(jù)達(dá)到多少比例開始寫入磁盤。默認(rèn)值0.66
    mapreduce.reduce.shuffle.input.buffer.percentbuffer大小占reduce可用內(nèi)存的比例。默認(rèn)值0.7
    mapreduce.reduce.input.buffer.percent指定多少比例的內(nèi)存用來存放buffer中的數(shù)據(jù),默認(rèn)值是0.0
  • 應(yīng)該在yarn啟動(dòng)之前就配置在服務(wù)器的配置文件中才能生效(yarn-default.xml)
  • 配置參數(shù)參數(shù)說明
    yarn.scheduler.minimum-allocation-mb給應(yīng)用程序container分配的最小內(nèi)存,默認(rèn)值:1024
    yarn.scheduler.maximum-allocation-mb給應(yīng)用程序container分配的最大內(nèi)存,默認(rèn)值:8192
    yarn.scheduler.minimum-allocation-vcores每個(gè)container申請(qǐng)的最小CPU核數(shù),默認(rèn)值:1
    yarn.scheduler.maximum-allocation-vcores每個(gè)container申請(qǐng)的最大CPU核數(shù),默認(rèn)值:32
    yarn.nodemanager.resource.memory-mb給containers分配的最大物理內(nèi)存,默認(rèn)值:8192
  • shuffle性能優(yōu)化的關(guān)鍵參數(shù),應(yīng)在yarn啟動(dòng)之前就配置好(mapred-default.xml)
  • 配置參數(shù)參數(shù)說明
    mapreduce.task.io.sort.mbshuffle的環(huán)形緩沖區(qū)大小,默認(rèn)100m
    mapreduce.map.sort.spill.percent環(huán)形緩沖區(qū)溢出的閾值,默認(rèn)80%
  • 容錯(cuò)相關(guān)參數(shù)(mapreduce性能優(yōu)化)
  • 配置參數(shù)參數(shù)說明
    mapreduce.map.maxattempts每個(gè)Map Task最大重試次數(shù),一旦重試參數(shù)超過該值,則認(rèn)為Map Task運(yùn)行失敗,默認(rèn)值:4。
    mapreduce.reduce.maxattempts每個(gè)Reduce Task最大重試次數(shù),一旦重試參數(shù)超過該值,則認(rèn)為Map Task運(yùn)行失敗,默認(rèn)值:4。
    mapreduce.task.timeoutTask超時(shí)時(shí)間,經(jīng)常需要設(shè)置的一個(gè)參數(shù),該參數(shù)表達(dá)的意思為:如果一個(gè)task在一定時(shí)間內(nèi)沒有任何進(jìn)入,即不會(huì)讀取新的數(shù)據(jù),也沒有輸出數(shù)據(jù),則認(rèn)為該task處于block狀態(tài),可能是卡住了,也許永遠(yuǎn)會(huì)卡住,為了防止因?yàn)橛脩舫绦蛴肋h(yuǎn)block住不退出,則強(qiáng)制設(shè)置了一個(gè)該超時(shí)時(shí)間(單位毫秒),默認(rèn)是600000。如果你的程序?qū)γ織l輸入數(shù)據(jù)的處理時(shí)間過長(比如會(huì)訪問數(shù)據(jù)庫,通過網(wǎng)絡(luò)拉取數(shù)據(jù)等),建議將該參數(shù)調(diào)大,該參數(shù)過小常出現(xiàn)的錯(cuò)誤提示是“AttemptID:attempt_14267829456721_123456_m_000224_0 Timed out after 300 secsContainer killed by the ApplicationMaster.”。

    8. HDFS小文件優(yōu)化方法

  • HDFS小文件弊端
    HDFS上每個(gè)文件都要在namenode上建立一個(gè)索引,這個(gè)索引的大小約為150byte,這樣當(dāng)小文件比較多的時(shí)候,就會(huì)產(chǎn)生很多的索引文件,一方面會(huì)大量占用namenode的內(nèi)存空間,另一方面就是索引文件過大導(dǎo)致索引速度變慢。

  • 解決方案

  • Hadoop Archive
    是一個(gè)高效地將小文件放入HDFS塊中的文件存檔工具,它能夠?qū)⒍鄠€(gè)小文件打包成一個(gè)HAR文件,這樣就減少了namenode的內(nèi)存使用。
  • Sequence file
    sequence file由一系列的二進(jìn)制key/value組成,如果key為文件名,value為文件內(nèi)容,則可以將大批小文件合并成一個(gè)大文件。
  • CombineFileInputFormat
    CombineFileInputFormat是一種新的inputformat,用于將多個(gè)文件合并成一個(gè)單獨(dú)的split,另外,它會(huì)考慮數(shù)據(jù)的存儲(chǔ)位置。
  • 開啟JVM重用
    對(duì)于大量小文件Job,可以開啟JVM重用會(huì)減少45%運(yùn)行時(shí)間。
    JVM重用理解:一個(gè)map運(yùn)行一個(gè)jvm,重用的話,在一個(gè)map在jvm上運(yùn)行完畢后,jvm繼續(xù)運(yùn)行其他map。
    具體設(shè)置:mapreduce.job.jvm.numtasks值在10-20之間。
  • 總結(jié)

    以上是生活随笔為你收集整理的Hadoop之Hadoop企业优化(HDFS小文件优化)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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