您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“Hadoop入門知識點(diǎn)有哪些”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
Hadoop企業(yè)優(yōu)化日常工作
Mapreduce 程序效率的瓶頸在于兩點(diǎn):
1)計算機(jī)性能
CPU、內(nèi)存、磁盤健康、網(wǎng)絡(luò)
2)I/O 操作優(yōu)化
數(shù)據(jù)傾斜
map和reduce數(shù)設(shè)置不合理
reduce等待過久
小文件過多
大量的不可分塊的超大文件
spill次數(shù)過多
merge次數(shù)過多等。
MapReduce優(yōu)化方法主要從以下六個方面考慮:
2.1 數(shù)據(jù)輸入
合并小文件:在執(zhí)行mr任務(wù)前將小文件進(jìn)行合并,大量的小文件會產(chǎn)生大量的map任務(wù),增大map任務(wù)裝載次數(shù),而任務(wù)的裝載比較耗時,從而導(dǎo)致 mr 運(yùn)行較慢。
采用ConbinFileInputFormat來作為輸入,解決輸入端大量小文件場景。
2.2 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處理時間。
在 map 之后先進(jìn)行combine處理,減少 I/O。
2.3 Reduce階段
合理設(shè)置map和reduce數(shù):兩個都不能設(shè)置太少,也不能設(shè)置太多。太少,會導(dǎo)致task等待,延長處理時間;太多,會導(dǎo)致 map、reduce任務(wù)間競爭資源,造成處理超時等錯誤。
設(shè)置map、reduce共存:調(diào)整slowstart.completedmaps參數(shù),使map運(yùn)行到一定程度后,reduce也開始運(yùn)行,減少reduce的等待時間。
規(guī)避使用reduce,因?yàn)镽educe在用于連接數(shù)據(jù)集的時候?qū)a(chǎn)生大量的網(wǎng)絡(luò)消耗。
合理設(shè)置reduc端的buffer,默認(rèn)情況下,數(shù)據(jù)達(dá)到一個閾值的時候,buffer中的數(shù)據(jù)就會寫入磁盤,然后reduce會從磁盤中獲得所有的數(shù)據(jù)。也就是說,buffer和reduce是沒有直接關(guān)聯(lián)的,中間多個一個寫磁盤->讀磁盤的過程,既然有這個弊端,那么就可以通過參數(shù)來配置,使得buffer中的一部分?jǐn)?shù)據(jù)可以直接輸送到reduce,從而減少IO開銷:mapred.job.reduce.input.buffer.percent,默認(rèn)為0.0。當(dāng)值大于0的時候,會保留指定比例的內(nèi)存讀buffer中的數(shù)據(jù)直接拿給reduce使用。這樣一來,設(shè)置buffer需要內(nèi)存,讀取數(shù)據(jù)需要內(nèi)存,reduce計算也要內(nèi)存,所以要根據(jù)作業(yè)的運(yùn)行情況進(jìn)行調(diào)整。
2.4 IO傳輸
采用數(shù)據(jù)壓縮的方式,減少網(wǎng)絡(luò)IO的的時間。安裝Snappy和LZOP壓縮編碼器。
使用SequenceFile二進(jìn)制文件
2.5 數(shù)據(jù)傾斜問題
數(shù)據(jù)傾斜現(xiàn)象
數(shù)據(jù)頻率傾斜——某一個區(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; @Overridepublic void configure(JobConf job) { maxValueThreshold = job.getInt(MAX_VALUES, 100); } @Overridepublic 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); }}
3)減少數(shù)據(jù)傾斜的方法
抽樣和范圍分區(qū)
可以通過對原始數(shù)據(jù)進(jìn)行抽樣得到的結(jié)果集來預(yù)設(shè)分區(qū)邊界值。自定義分區(qū)
另一個抽樣和范圍分區(qū)的替代方案是基于輸出鍵的背景知識進(jìn)行自定義分區(qū)。例如,如果map輸出鍵的單詞來源于一本書。其中大部分必然是省略詞(stopword)。那么就可以將自定義分區(qū)將這部分省略詞發(fā)送給固定的一部分reduce實(shí)例。而將其他的都發(fā)送給剩余的reduce實(shí)例。Combine
使用Combine可以大量地減小數(shù)據(jù)頻率傾斜和數(shù)據(jù)大小傾斜。在可能的情況下,combine的目的就是聚合并精簡數(shù)據(jù)。采用Map Join,盡量避免Reduce Join。
2.6 常用的調(diào)優(yōu)參數(shù)
1)資源相關(guān)參數(shù)
以下參數(shù)是在用戶自己的mr應(yīng)用程序中配置就可以生效(mapred-default.xml)
配置參數(shù) | 參數(shù)說明 |
---|---|
mapreduce.map.memory.mb | 一個Map Task可使用的資源上限(單位:MB),默認(rèn)為1024。如果Map Task實(shí)際使用的資源量超過該值,則會被強(qiáng)制殺死。 |
mapreduce.reduce.memory.mb | 一個Reduce Task可使用的資源上限(單位:MB),默認(rèn)為1024。如果Reduce Task實(shí)際使用的資源量超過該值,則會被強(qiáng)制殺死。 |
mapreduce.map.cpu.vcores | 每個Map task可使用的最多cpu core數(shù)目,默認(rèn)值: 1 |
mapreduce.reduce.cpu.vcores | 每個Reduce task可使用的最多cpu core數(shù)目,默認(rèn)值: 1 |
mapreduce.reduce.shuffle.parallelcopies | 每個reduce去map中拿數(shù)據(jù)的并行數(shù)。默認(rèn)值是5 |
mapreduce.reduce.shuffle.merge.percent | buffer中的數(shù)據(jù)達(dá)到多少比例開始寫入磁盤。默認(rèn)值0.66 |
mapreduce.reduce.shuffle.input.buffer.percent | buffer大小占reduce可用內(nèi)存的比例。默認(rèn)值0.7 |
mapreduce.reduce.input.buffer.percent | 指定多少比例的內(nèi)存用來存放buffer中的數(shù)據(jù),默認(rèn)值是0.0 |
應(yīng)該在yarn啟動之前就配置在服務(wù)器的配置文件中才能生效(yarn-default.xml)
配置參數(shù) | 參數(shù)說明 |
---|---|
yarn.scheduler.minimum-allocation-mb 1024 | 給應(yīng)用程序container分配的最小內(nèi)存 |
yarn.scheduler.maximum-allocation-mb 8192 | 給應(yīng)用程序container分配的最大內(nèi)存 |
yarn.scheduler.minimum-allocation-vcores 1 | 每個container申請的最小CPU核數(shù) |
yarn.scheduler.maximum-allocation-vcores 32 | 每個container申請的最大CPU核數(shù) |
yarn.nodemanager.resource.memory-mb 8192 | 給containers分配的最大物理內(nèi)存 |
shuffle性能優(yōu)化的關(guān)鍵參數(shù),應(yīng)在yarn啟動之前就配置好(mapred-default.xml)
配置參數(shù) | 參數(shù)說明 |
---|---|
mapreduce.task.io.sort.mb 100 | shuffle的環(huán)形緩沖區(qū)大小,默認(rèn)100m |
mapreduce.map.sort.spill.percent 0.8 | 環(huán)形緩沖區(qū)溢出的閾值,默認(rèn)80% |
2)容錯相關(guān)參數(shù)(mapreduce性能優(yōu)化)
配置參數(shù) | 配置參數(shù) |
---|---|
mapreduce.map.maxattempts | 每個Map Task最大重試次數(shù),一旦重試參數(shù)超過該值,則認(rèn)為Map Task運(yùn)行失敗,默認(rèn)值:4 |
mapreduce.reduce.maxattempts | 每個Reduce Task最大重試次數(shù),一旦重試參數(shù)超過該值,則認(rèn)為Map Task運(yùn)行失敗,默認(rèn)值:4。 |
mapreduce.task.timeout | Task超時時間,經(jīng)常需要設(shè)置的一個參數(shù),該參數(shù)表達(dá)的意思為:如果一個task在一定時間內(nèi)沒有任何進(jìn)入,即不會讀取新的數(shù)據(jù),也沒有輸出數(shù)據(jù),則認(rèn)為該task處于block狀態(tài),可能是卡住了,也許永遠(yuǎn)會卡主,為了防止因?yàn)橛脩舫绦蛴肋h(yuǎn)block住不退出,則強(qiáng)制設(shè)置了一個該超時時間(單位毫秒),默認(rèn)是600000。如果你的程序?qū)γ織l輸入數(shù)據(jù)的處理時間過長(比如會訪問數(shù)據(jù)庫,通過網(wǎng)絡(luò)拉取數(shù)據(jù)等),建議將該參數(shù)調(diào)大,該參數(shù)過小常出現(xiàn)的錯誤提示是“AttemptID:attempt_14267829456721_123456_m_000224_0 Timed out after 300 secsContainer killed by the ApplicationMaster.”。 |
3.1 HDFS小文件弊端
HDFS上每個文件都要在namenode上建立一個索引,這個索引的大小約為150byte,這樣當(dāng)小文件比較多的時候,就會產(chǎn)生很多的索引文件,一方面會大量占用namenode的內(nèi)存空間,另一方面就是索引文件過大是的索引速度變慢。
3.2 解決方案
Hadoop Archive:
是一個高效地將小文件放入HDFS塊中的文件存檔工具,它能夠?qū)⒍鄠€小文件打包成一個HAR文件,這樣在減少namenode內(nèi)存使用的同時。Sequence file:
sequence file由一系列的二進(jìn)制key/value組成,如果key為文件名,value為文件內(nèi)容,則可以將大批小文件合并成一個大文件。CombineFileInputFormat:
CombineFileInputFormat是一種新的inputformat,用于將多個文件合并成一個單獨(dú)的split,另外,它會考慮數(shù)據(jù)的存儲位置。開啟JVM重用
對于大量小文件Job,可以開啟JVM重用會減少45%運(yùn)行時間。
JVM重用理解:一個map運(yùn)行一個jvm,重用的話,在一個map在jvm上運(yùn)行完畢后,jvm繼續(xù)運(yùn)行其他jvm
具體設(shè)置:mapreduce.job.jvm.numtasks值在10-20之間。
“Hadoop入門知識點(diǎn)有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。