1. 程式人生 > >hadoop 總結

hadoop 總結

文章目錄

一、什麼是hadoop

海量資料儲存、計算平臺

二、什麼是MapReduce

分散式計算框架

三、什麼是HDFS

分散式檔案儲存系統

四、什麼是YARN

分散式計算資源排程平臺

五、HDFS組成

namenode、datanode

六、yarn組成

resourceManager、nodeManger

七、hadoopHA

nameNode:active、standBy
zkfc:監聽nameNode程序狀態
journalNode: nameNode元資料存放節點
在這裡插入圖片描述

八、yarnHA

兩個resourceManger

九、HDFS寫資料

client -put-> name node – checkValue —> client — block --> name node —dataNodes —> client —>dataNode1 ->client — block1 —>dataNode1 -> dataNode2 -> dataNode3
client --block2 —>namenode — dataNodes —> client —block2–> dataNode1 —> dataNode2 —> dataNode3
迴圈 剩餘block
在這裡插入圖片描述

十、HDFS讀資料

client —file —> name node —dataNodes—> client —block1—>dataNode1 —client —block2—>dataNode1…

十一、safeMode

nameNode冷啟動,元資料從fsImage中載入,fsImage包含blockID資訊但不包含其對應的dataNode資訊,從而導致namenod誤認為檔案丟失超過比例,從而將啟動安全模式,隨著dataNode彙報心跳傳送block資訊,元資料的dataNode資訊被補全就會自動退出安全模式
強制退出: hdfs namenode --safemode leave

十二、nameNode元資料管理

記憶體元資料--完整
fsImage + edits = 完整

十三、checkPoint

secondaryNameNode
定期將nameNode中的fsImage和edits檔案下載到本地並merge到記憶體的過程

十四、MR組成

併發階段:mapTask
匯聚階段: reduceTask
程式總管:MRAppMaster
在這裡插入圖片描述

十五、mapTask並行度

splitSize
fileSize / splitSize = mapTask num
多個小檔案就會有多個mapTask
優化經驗:
1、每個map允許時間不易太短
2、設定jvm重用
3、大檔案調大blockSize或者設大splitSize
4、小檔案split前進行合併

十六、reduce並行度

手動設定: job.setNumReduceTasks(4);
注意問題:
1、全域性彙總reduce只能有一個
2、個數不宜太多

十七、bean排序

實現WritableComparable介面
實現序列化方法:write/readFields
實現比較方法:compareTo

十八、自定義partioner

繼承Partitioner
重寫getPartition
按key根據reduceTask數量進行hash取模分配

十九、mapReduce資料壓縮

壓縮map或reduce計算的結果
原則:運算密集型少用壓縮,IO密集型多用壓縮
壓縮檔案讀取:自帶inputFormat類中自帶讀取功能

二十、join on reduce

通過關聯條件作為key在reduce端進行join
缺點:
1、reduce計算壓力大
2、容易資料傾斜

二十一、join on map

map端生命週期函式:setUp初始化小表資料
1、讀取資料庫
2、distributedCache:將小檔案分發到每一個map task上
job.addCacheFile(new URI(“hdfs://hadoop-server01:9000/cachefile/b.txt”));

二十二、groupComparator

自定義分組:將bean中某欄位值相同為一組聚合到reduce端,且組內排序根據bean實現的compareTo方法
繼承:WritableComparator
重寫:compare

二十三、自定義inputFormat

繼承: FileInputFormat
重寫:createRecord
自定義recordReader
繼承:RecordReader
重寫:nextKeyValue

二十四、自定義outputFormat

繼承:FileOutputFormat
重寫:getRecodWriter
自定義RecodWriter
重寫:write

二十五、小檔案處理

1、在資料採集的時候,就將小檔案或小批資料合成大檔案再上傳HDFS
2、在業務處理之前,在HDFS上使用mapreduce程式對小檔案進行合併以檔名為key,以檔案內容為value輸出sequenceFile中
3、在mapreduce處理時,可採用combineInputFormat提高效率

二十六、計數器

用列舉定義計數字段:enum MyCounter{Col1,Col2}
使用:
context.getCounter(MyCounter.Col1).increment(1)
context.getCounter(MyCounter.Col2).increment(1)

二十七、多job串聯

方法:
1、將自己的job作為引數新建一個框架自帶的可控job類ControlledJob
2、設定依賴關係
3、加入JobControl佇列中
ControlledJob cJob1 = new ControlledJob(job1.getConfiguration());
ControlledJob cJob2 = new ControlledJob(job2.getConfiguration());
ControlledJob cJob3 = new ControlledJob(job3.getConfiguration());

cJob1.setJob(job1);
cJob2.setJob(job2);
cJob3.setJob(job3);

// 設定作業依賴關係
cJob2.addDependingJob(cJob1);
cJob3.addDependingJob(cJob2);

JobControl jobControl = new JobControl(“RecommendationJob”);
jobControl.addJob(cJob1);
jobControl.addJob(cJob2);
jobControl.addJob(cJob3);

// 新建一個執行緒來執行已加入JobControl中的作業,開始程序並等待結束
Thread jobControlThread = new Thread(jobControl);
jobControlThread.start();
while (!jobControl.allFinished()) {
Thread.sleep(500);
}
jobControl.stop();

二十八、mapreduce引數優化

MapReduce重要配置引數
1、 資源相關引數
//以下引數是在使用者自己的mr應用程式中配置就可以生效
(1) mapreduce.map.memory.mb: 一個Map Task可使用的資源上限(單位:MB),預設為1024。如果Map Task實際使用的資源量超過該值,則會被強制殺死。
(2) mapreduce.reduce.memory.mb: 一個Reduce Task可使用的資源上限(單位:MB),預設為1024。如果Reduce Task實際使用的資源量超過該值,則會被強制殺死。
(3) mapreduce.map.cpu.vcores: 每個Map task可使用的最多cpu core數目, 預設值: 1
(4) mapreduce.reduce.cpu.vcores: 每個Reduce task可使用的最多cpu core數目, 預設值: 1
(5) mapreduce.map.java.opts: Map Task的JVM引數,你可以在此配置預設的java heap size等引數, e.g.
“-Xmx1024m -verbose:gc -Xloggc:/tmp/@[email protected]” (@[email protected]會被Hadoop框架自動換為相應的taskid), 預設值: “”
(6) mapreduce.reduce.java.opts: Reduce Task的JVM引數,你可以在此配置預設的java heap size等引數, e.g.
“-Xmx1024m -verbose:gc -Xloggc:/tmp/@[email protected]”, 預設值: “”

//應該在yarn啟動之前就配置在伺服器的配置檔案中才能生效
(7) yarn.scheduler.minimum-allocation-mb 1024 給應用程式container分配的最小記憶體
(8) yarn.scheduler.maximum-allocation-mb 8192 給應用程式container分配的最大記憶體
(9) yarn.scheduler.minimum-allocation-vcores 1
(10)yarn.scheduler.maximum-allocation-vcores 32
(11)yarn.nodemanager.resource.memory-mb 8192

//shuffle效能優化的關鍵引數,應在yarn啟動之前就配置好
mapreduce.task.io.sort.mb 100 //shuffle的環形緩衝區大小,預設100m
mapreduce.map.sort.spill.percent 0.8 //環形緩衝區溢位的閾值,預設80%

2、 容錯相關引數
(1) mapreduce.map.maxattempts: 每個Map Task最大重試次數,一旦重試引數超過該值,則認為Map Task執行失敗,預設值:4。
(2) mapreduce.reduce.maxattempts: 每個Reduce Task最大重試次數,一旦重試引數超過該值,則認為Map Task執行失敗,預設值:4。
(3) mapreduce.map.failures.maxpercent: 當失敗的Map Task失敗比例超過該值為,整個作業則失敗,預設值為0. 如果你的應用程式允許丟棄部分輸入資料,則該該值設為一個大於0的值,比如5,表示如果有低於5%的Map Task失敗(如果一個Map Task重試次數超過mapreduce.map.maxattempts,則認為這個Map Task失敗,其對應的輸入資料將不會產生任何結果),整個作業扔認為成功。
(4) mapreduce.reduce.failures.maxpercent: 當失敗的Reduce Task失敗比例超過該值為,整個作業則失敗,預設值為0.
(5) mapreduce.task.timeout: Task超時時間,經常需要設定的一個引數,該引數表達的意思為:如果一個task在一定時間內沒有任何進入,即不會讀取新的資料,也沒有輸出資料,則認為該task處於block狀態,可能是卡住了,也許永遠會卡主,為了防止因為使用者程式永遠block住不退出,則強制設定了一個該超時時間(單位毫秒),預設是300000。如果你的程式對每條輸入資料的處理時間過長(比如會訪問資料庫,通過網路拉取資料等),建議將該引數調大,該引數過小常出現的錯誤提示是“AttemptID:attempt_14267829456721_123456_m_000224_0 Timed out after 300 secsContainer killed by the ApplicationMaster.”。

3、 本地執行mapreduce 作業
設定以下幾個引數:
mapreduce.framework.name=local
mapreduce.jobtracker.address=local
fs.defaultFS=local

4、 效率和穩定性相關引數
(1) mapreduce.map.speculative: 是否為Map Task開啟推測執行機制,預設為false
(2) mapreduce.reduce.speculative: 是否為Reduce Task開啟推測執行機制,預設為false
(3) mapreduce.job.user.classpath.first & mapreduce.task.classpath.user.precedence:當同一個class同時出現在使用者jar包和hadoop jar中時,優先使用哪個jar包中的class,預設為false,表示優先使用hadoop jar中的class。
(4) mapreduce.input.fileinputformat.split.minsize: FileInputFormat做切片時的最小切片大小,(5)mapreduce.input.fileinputformat.split.maxsize: FileInputFormat做切片時的最大切片大小
(切片的預設大小就等於blocksize,即 134217728)