MapReduce太慢了,记一次对它的调优建议。
- 代碼調(diào)優(yōu)
?? ?代碼調(diào)優(yōu),主要是mapper和reducer中,針對多次創(chuàng)建的對象,進(jìn)行代碼提出操作。這個和一般的java程序的代碼調(diào)優(yōu)一樣。
- mapper調(diào)優(yōu)
?? ?mapper調(diào)優(yōu)主要就是就一個目標(biāo):減少輸出量。我們可以通過增加combine階段以及對輸出進(jìn)行壓縮設(shè)置進(jìn)行mapper調(diào)優(yōu)。
?? ?combine介紹:
?? ??? ?實現(xiàn)自定義combine要求繼承reducer類,特點(diǎn):
?? ??? ?以map的輸出key/value鍵值對作為輸入輸出鍵值對,作用是減少網(wǎng)絡(luò)輸出,在map節(jié)點(diǎn)上就合并一部分?jǐn)?shù)據(jù)。
?? ??? ?比較適合,map的輸出是數(shù)值型的,方便進(jìn)行統(tǒng)計。
?? ?壓縮設(shè)置:
?? ??? ?在提交job的時候分別設(shè)置啟動壓縮和指定壓縮方式。
- reducer調(diào)優(yōu)
?? ?reducer調(diào)優(yōu)主要是通過參數(shù)調(diào)優(yōu)和設(shè)置reducer的個數(shù)來完成。
?? ?reducer個數(shù)調(diào)優(yōu):
?? ??? ?要求:一個reducer和多個reducer的執(zhí)行結(jié)果一致,不能因為多個reducer導(dǎo)致執(zhí)行結(jié)果異常。
?? ??? ?規(guī)則:一般要求在hadoop集群中的執(zhí)行mr程序,map執(zhí)行完成100%后,盡量早的看到reducer執(zhí)行到33%,可以通過命令hadoop job -status job_id或者web頁面來查看。
?? ??? ??? ?原因: map的執(zhí)行process數(shù)是通過inputformat返回recordread來定義的;而reducer是有三部分構(gòu)成的,分別為讀取mapper輸出數(shù)據(jù)、合并所有輸出數(shù)據(jù)以及reduce處理,其中第一步要依賴map的執(zhí)行,所以在數(shù)據(jù)量比較大的情況下,一個reducer無法滿足性能要求的情況下,我們可以通過調(diào)高reducer的個數(shù)來解決該問題。
?? ??? ?優(yōu)點(diǎn):充分利用集群的優(yōu)勢。
?? ??? ?缺點(diǎn):有些mr程序沒法利用多reducer的優(yōu)點(diǎn),比如獲取top n的mr程序。
- runner調(diào)優(yōu)
?? ?runner調(diào)優(yōu)其實就是在提交job的時候設(shè)置job參數(shù),一般都可以通過代碼和xml文件兩種方式進(jìn)行設(shè)置。
?? ?1~8詳見ActiveUserRunner(before和configure方法),9詳解TransformerBaseRunner(initScans方法)
?? ?1. mapred.child.java.opts: 修改childyard進(jìn)程執(zhí)行的jvm參數(shù),針對map和reducer均有效,默認(rèn):-Xmx200m?
?? ?2. mapreduce.map.java.opts: 需改map階段的childyard進(jìn)程執(zhí)行jvm參數(shù),默認(rèn)為空,當(dāng)為空的時候,使用mapred.child.java.opts。
?? ?3. mapreduce.reduce.java.opts:修改reducer階段的childyard進(jìn)程執(zhí)行jvm參數(shù),默認(rèn)為空,當(dāng)為空的時候,使用mapred.child.java.opts。
?? ?4. mapreduce.job.reduces: 修改reducer的個數(shù),默認(rèn)為1。可以通過job.setNumReduceTasks方法來進(jìn)行更改。
?? ?5. mapreduce.map.speculative:是否啟動map階段的推測執(zhí)行,默認(rèn)為true。其實一般情況設(shè)置為false比較好。可通過方法job.setMapSpeculativeExecution來設(shè)置。
?? ?6. mapreduce.reduce.speculative:是否需要啟動reduce階段的推測執(zhí)行,默認(rèn)為true,其實一般情況設(shè)置為fase比較好。可通過方法job.setReduceSpeculativeExecution來設(shè)置。
?? ?7. mapreduce.map.output.compress:設(shè)置是否啟動map輸出的壓縮機(jī)制,默認(rèn)為false。在需要減少網(wǎng)絡(luò)傳輸?shù)臅r候,可以設(shè)置為true。
?? ?8. mapreduce.map.output.compress.codec:設(shè)置map輸出壓縮機(jī)制,默認(rèn)為org.apache.hadoop.io.compress.DefaultCodec,推薦使用SnappyCodec(在之前版本中需要進(jìn)行安裝操作,現(xiàn)在版本不太清楚,安裝參數(shù):http://www.cnblogs.com/chengxin1982/p/3862309.html)
?? ?9. hbase參數(shù)設(shè)置
?? ??? ?由于hbase默認(rèn)是一條一條數(shù)據(jù)拿取的,在mapper節(jié)點(diǎn)上執(zhí)行的時候是每處理一條數(shù)據(jù)后就從hbase中獲取下一條數(shù)據(jù),通過設(shè)置cache值可以一次獲取多條數(shù)據(jù),減少網(wǎng)絡(luò)數(shù)據(jù)傳輸。
總結(jié)
以上是生活随笔為你收集整理的MapReduce太慢了,记一次对它的调优建议。的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: kafka消费速度跟不上生产速度的解决方
- 下一篇: MYSQL查表的字段名称,字段类型,字段