MapReduce Hive Hbase 項目 最佳化__Hadoop

來源:互聯網
上載者:User
一、調優的目的
    充分的利用機器的效能,更快的完成mr程式的計算任務。甚至是在有限的機器條件下,能夠支援運行足夠多的mr程式。
二、調優的總體概述
    從mr程式的內部運行機制,我們可以瞭解到一個mr程式由mapper和reducer兩個階段組成,其中mapper階段包括資料的讀取、map處理以及寫出操作(排序和合并/sort&merge),而reducer階段包含mapper輸出資料的擷取、資料合併(sort&merge)、reduce處理以及寫出操作。那麼在這七個子階段中,能夠進行較大力度的進行調優的就是map輸出、reducer資料合併以及reducer個數這三個方面的調優操作。也就是說雖然效能調優包括cpu、記憶體、磁碟io以及網路這四個大方面,但是從mr程式的執行流程中,我們可以知道主要有調優的是記憶體、磁碟io以及網路。在mr程式中調優,主要考慮的就是減少網路傳輸和減少磁碟IO操作,故本次課程的mr調優主要包括伺服器調優、代碼調優、mapper調優、reducer調優以及runner調優這五個方面。
三、伺服器調優
    伺服器調優主要包括伺服器參數調優和jvm調優。在本次項目中,由於我們使用hbase作為我們分析資料的未經處理資料儲存表,所以對於hbase我們也需要進行一些調優操作。除了參數調優之外,和其他一般的java程式一樣,還需要進行一些jvm調優。

    hdfs調優
    1. dfs.datanode.failed.volumes.tolerated: 允許發生磁碟錯誤的磁碟數量,預設為0,表示不允許datanode發生磁碟異常。當掛載多個磁碟的時候,可以修改該值。
    2. dfs.replication: 複製因子,預設3
    3. dfs.namenode.handler.count: namenode節點並發線程量,預設10
    4. dfs.datanode.handler.count:datanode之間的並發線程量,預設10。
    5. dfs.datanode.max.transfer.threads:datanode提供的資料流操作的並發線程量,預設4096。
        一般將其設定為linux系統的檔案控制代碼數的85%~90%之間,查看檔案控制代碼數語句ulimit -a,修改vim /etc/security/limits.conf, 不能設定太大
        檔案末尾,添加
            * soft nofile 65535
            * hard nofile 65535
            注意:控制代碼數不能夠太大,可以設定為1000000以下的所有數值,一般不設定為-1。
            異常處理:當設定控制代碼數較大的時候,重新登入可能出現unable load session的提示資訊,這個時候採用單一使用者模式進行修改操作即可。
                單一使用者模式:
                    啟動的時候按'a'鍵,進入選擇介面,然後按'e'鍵進入kernel修改介面,然後選擇第二行'kernel...',按'e'鍵進行修改,在最後添加空格+single即可,按斷行符號鍵回到修改介面,最後按'b'鍵進行單一使用者模式啟動,當啟動成功後,還原檔案後儲存,最後退出(exit)重啟系統即可。
    6. io.file.buffer.size: 讀取/寫出資料的buffer大小,預設4096,一般不用設定,推薦設定為4096的整數倍(物理頁面的整數倍大小)。

    hbase調優
    1. 設定regionserver的記憶體大小,預設為1g,推薦設定為4g。
        修改conf/hbase-env.sh中的HBASE_HEAPSIZE=4g
    2. hbase.regionserver.handler.count: 修改用戶端並發線程數,預設為10。設定規則為,當put和scans操作比較的多的時候,將其設定為比較小的值;當get和delete操作比較多的時候,將其設定為比較大的值。原因是防止頻繁GC操作導致記憶體異常。
    3. 自訂hbase的分割和緊縮操作,預設情況下hbase的分割機制是當region大小達到hbase.hregion.max.filesize(10g)的時候進行自動分割,推薦每個regionserver的region個數在20~500個為最佳。hbase的緊縮機制是hbase的一個非常重要的管理機制,hbase的緊縮操作是非常消耗記憶體和cpu的,所以一般機器壓力比較大的話,推薦將其關閉,改為手動控制。
    4. hbase.balancer.period: 設定hbase的負載平衡時間,預設為300000(5分鐘),在負載比較高的叢集上,將其值可以適當的改大。
    5. hfile.block.cache.size:修改hflie檔案塊在記憶體的佔比,預設0.4。在讀應用比較多的系統中,可以適當的增大該值,在寫應用比較多的系統中,可以適當的減少該值,不過不推薦修改為0。
    6. hbase.regionserver.global.memstore.upperLimit:修改memstore的記憶體佔用比率上限,預設0.4,當達到該值的時候,會進行flush操作將內容寫的磁碟中。
    7. hbase.regionserver.global.memstore.lowerLimit: 修改memstore的記憶體佔用比率下限,預設0.38,進行flush操作後,memstore佔用的記憶體比率必須不大於該值。
    8. hbase.hregion.memstore.flush.size: 當memstore的值大於該值的時候,進行flush操作。預設134217728(128M)。
    9. hbase.hregion.memstore.block.multiplier: 修改memstore阻塞塊大小比率值,預設為4。也就是說在memstore的大小超過4*hbase.hregion.memstore.flush.size的時候就會觸發寫阻塞操作。最終可能會導致出現oom異常。
    
    mapreduce調優
    1. mapreduce.task.io.sort.factor: mr程式進行合并排序的時候,開啟的檔案數量,預設為10個.
    2. mapreduce.task.io.sort.mb: mr程式進行合并排序操作的時候或者mapper寫資料的時候,記憶體大小,預設100M
    3. mapreduce.map.sort.spill.percent: mr程式進行flush操作的閥值,預設0.80。
    4. mapreduce.reduce.shuffle.parallelcopies:mr程式reducer copy資料的線程數,預設5。
    5. mapreduce.reduce.shuffle.input.buffer.percent: reduce複製map資料的時候指定的記憶體堆大小百分比,預設為0.70,適當的增加該值可以減少map資料的磁碟溢出,能夠提高系統效能。
    6. mapreduce.reduce.shuffle.merge.percent:reduce進行shuffle的時候,用於啟動合并輸出和磁碟溢寫的過程的閥值,預設為0.66。如果允許,適當增大其比例能夠減少磁碟溢寫次數,提高系統效能。同mapreduce.reduce.shuffle.input.buffer.percent一起使用。
    7. mapreduce.task.timeout:mr程式的task執行情況彙報到期時間,預設600000(10分鐘),設定為0表示不進行該值的判斷。
    
四、代碼調優
    代碼調優,主要是mapper和reducer中,針對多次建立的對象,進行代碼提出操作。這個和一般的java程式的代碼調優一樣。
五、mapper調優
    mapper調優主要就是就一個目標:減少輸出量。我們可以通過增加combine階段以及對輸出進行壓縮設定進行mapper調優。
    combine介紹:
        實現自訂combine要求繼承reducer類,特點:
        以map的輸出key/value索引值對作為輸入輸出索引值對,作用是減少網路輸出,在map節點上就合并一部分資料。
        比較適合,map的輸出是數值型的,方便進行統計。
    壓縮設定:
        在提交job的時候分別設定啟動壓縮和指定壓縮方式。
六、reducer調優
    reducer調優主要是通過參數調優和設定reducer的個數來完成。
    reducer個數調優:
        要求:一個reducer和多個reducer的執行結果一致,不能因為多個reducer導致執行結果異常。
        規則:一般要求在hadoop叢集中的執行mr程式,map執行完成100%後,盡量早的看到reducer執行到33%,可以通過命令hadoop job -status job_id或者web頁面來查看。
            原因: map的執行process數是通過inputformat返回recordread來定義的;而reducer是有三部分構成的,分別為讀取mapper輸出資料、合并所有輸出資料以及reduce處理,其中第一步要依賴map的執行,所以在資料量比較大的情況下,一個reducer無法滿足效能要求的情況下,我們可以通過調高reducer的個數來解決該問題。
        優點:充分利用叢集的優勢。
        缺點:有些mr程式沒法利用多reducer的優點,比如擷取top n的mr程式。
七、runner調優
    runner調優其實就是在提交job的時候設定job參數,一般都可以通過代碼和xml檔案兩種方式進行設定。
    1~8詳見ActiveUserRunner(before和configure方法),9詳解TransformerBaseRunner(initScans方法)

    1. mapred.child.java.opts: 修改childyard進程執行的jvm參數,針對map和reducer均有效,預設:-Xmx200m
    2. mapreduce.map.java.opts: 需改map階段的childyard進程執行jvm參數,預設為空白,當為空白的時候,使用mapred.child.java.opts。
    3. mapreduce.reduce.java.opts:修改reducer階段的childyard進程執行jvm參數,預設為空白,當為空白的時候,使用mapred.child.java.opts。
    4. mapreduce.job.reduces: 修改reducer的個數,預設為1。可以通過job.setNumReduceTasks方法來變更。
    5. mapreduce.map.speculative:是否啟動map階段的推測執行,預設為true。其實一般情況設定為false比較好。可通過方法job.setMapSpeculativeExecution來設定。
    6. mapreduce.reduce.speculative:是否需要啟動reduce階段的推測執行,預設為true,其實一般情況設定為fase比較好。可通過方法job.setReduceSpeculativeExecution來設定。
    7. mapreduce.map.output.compress:設定是否啟動map輸出的壓縮機制,預設為false。在需要減少網路傳輸的時候,可以設定為true。
    8. mapreduce.map.output.compress.codec:設定map輸出壓縮機制,預設為org.apache.hadoop.io.compress.DefaultCodec,推薦使用SnappyCodec(在之前版本中需要進行安裝操作,現在版本不太清楚,安裝參數:http://www.cnblogs.com/chengxin1982/p/3862309.html)
    9. hbase參數設定
        由於hbase預設是一條一條資料拿取的,在mapper節點上執行的時候是每處理一條資料後就從hbase中擷取下一條資料,通過設定cache值可以一次擷取多條資料,減少網路資料轉送。
        

   




    
   

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.