hadoop 總結
文章目錄
- 一、什麼是hadoop
- 二、什麼是MapReduce
- 三、什麼是HDFS
- 四、什麼是YARN
- 五、HDFS組成
- 六、yarn組成
- 七、hadoopHA
- 八、yarnHA
- 九、HDFS寫資料
- 十、HDFS讀資料
- 十一、safeMode
- 十二、nameNode元資料管理
- 十三、checkPoint
- 十四、MR組成
- 十五、mapTask並行度
- 十六、reduce並行度
- 十七、bean排序
- 十八、自定義partioner
- 十九、mapReduce資料壓縮
- 二十、join on reduce
- 二十一、join on map
- 二十二、groupComparator
- 二十三、自定義inputFormat
- 二十四、自定義outputFormat
- 二十五、小檔案處理
- 二十六、計數器
- 二十七、多job串聯
- 二十八、mapreduce引數優化
一、什麼是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)