Hadoop複習看這篇文章就夠了

高清思維導圖已同步Git:https://github.com/SoWhat1412/xmindfile

Hadoop入門

在這裏插入圖片描述

HDFS

在這裏插入圖片描述

MapReduce And YARN

在這裏插入圖片描述

總結

在這裏插入圖片描述

日常

Hadoop企業優化日常工作

1 MapReduce 跑的慢的原因

Mapreduce 程序效率的瓶頸在於兩點:
1)計算機性能

CPU、內存、磁盤健康、網絡

2)I/O 操作優化

  1. 數據傾斜
  2. map和reduce數設置不合理
  3. reduce等待過久
  4. 小文件過多
  5. 大量的不可分塊的超大文件
  6. spill次數過多
  7. merge次數過多等。
2 MapReduce優化方法

MapReduce優化方法主要從以下六個方面考慮:
2.1 數據輸入

  1. 合併小文件:在執行mr任務前將小文件進行合併,大量的小文件會產生大量的map任務,增大map任務裝載次數,而任務的裝載比較耗時,從而導致 mr 運行較慢。
  2. 採用ConbinFileInputFormat來作爲輸入,解決輸入端大量小文件場景。

2.2 Map階段

  1. 減少spill次數:通過調整io.sort.mb及sort.spill.percent參數值,增大觸發spill的內存上限,減少spill次數,從而減少磁盤 IO。
  2. 減少merge次數:通過調整io.sort.factor參數,增大merge的文件數目,減少merge的次數,從而縮短mr處理時間。
  3. 在 map 之後先進行combine處理,減少 I/O。

2.3 Reduce階段

  1. 合理設置map和reduce數:兩個都不能設置太少,也不能設置太多。太少,會導致task等待,延長處理時間;太多,會導致 map、reduce任務間競爭資源,造成處理超時等錯誤。
  2. 設置map、reduce共存:調整slowstart.completedmaps參數,使map運行到一定程度後,reduce也開始運行,減少reduce的等待時間。
  3. 規避使用reduce,因爲Reduce在用於連接數據集的時候將會產生大量的網絡消耗。
  4. 合理設置reduc端的buffer,默認情況下,數據達到一個閾值的時候,buffer中的數據就會寫入磁盤,然後reduce會從磁盤中獲得所有的數據。也就是說,buffer和reduce是沒有直接關聯的,中間多個一個寫磁盤->讀磁盤的過程,既然有這個弊端,那麼就可以通過參數來配置,使得buffer中的一部分數據可以直接輸送到reduce,從而減少IO開銷:mapred.job.reduce.input.buffer.percent,默認爲0.0。當值大於0的時候,會保留指定比例的內存讀buffer中的數據直接拿給reduce使用。這樣一來,設置buffer需要內存,讀取數據需要內存,reduce計算也要內存,所以要根據作業的運行情況進行調整。

2.4 IO傳輸

  1. 採用數據壓縮的方式,減少網絡IO的的時間。安裝Snappy和LZOP壓縮編碼器。
  2. 使用SequenceFile二進制文件

2.5 數據傾斜問題

  1. 數據傾斜現象
    數據頻率傾斜——某一個區域的數據量要遠遠大於其他區域。
    數據大小傾斜——部分記錄的大小遠遠大於平均值。
  2. 如何收集傾斜數據
    在reduce方法中加入記錄map輸出鍵的詳細情況的功能。
public static final String MAX_VALUES = "skew.maxvalues"; 
private int maxValueThreshold; 
 
@Override
public void configure(JobConf job) { 
     maxValueThreshold = job.getInt(MAX_VALUES, 100); 
} 
@Override
public 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)減少數據傾斜的方法

  1. 抽樣和範圍分區
    可以通過對原始數據進行抽樣得到的結果集來預設分區邊界值。
  2. 自定義分區
    另一個抽樣和範圍分區的替代方案是基於輸出鍵的背景知識進行自定義分區。例如,如果map輸出鍵的單詞來源於一本書。其中大部分必然是省略詞(stopword)。那麼就可以將自定義分區將這部分省略詞發送給固定的一部分reduce實例。而將其他的都發送給剩餘的reduce實例。
  3. Combine
    使用Combine可以大量地減小數據頻率傾斜和數據大小傾斜。在可能的情況下,combine的目的就是聚合並精簡數據。
  4. 採用Map Join,儘量避免Reduce Join。

2.6 常用的調優參數
1)資源相關參數

  • 以下參數是在用戶自己的mr應用程序中配置就可以生效(mapred-default.xml)
配置參數 參數說明
mapreduce.map.memory.mb 一個Map Task可使用的資源上限(單位:MB),默認爲1024。如果Map Task實際使用的資源量超過該值,則會被強制殺死。
mapreduce.reduce.memory.mb 一個Reduce Task可使用的資源上限(單位:MB),默認爲1024。如果Reduce Task實際使用的資源量超過該值,則會被強制殺死。
mapreduce.map.cpu.vcores 每個Map task可使用的最多cpu core數目,默認值: 1
mapreduce.reduce.cpu.vcores 每個Reduce task可使用的最多cpu core數目,默認值: 1
mapreduce.reduce.shuffle.parallelcopies 每個reduce去map中拿數據的並行數。默認值是5
mapreduce.reduce.shuffle.merge.percent buffer中的數據達到多少比例開始寫入磁盤。默認值0.66
mapreduce.reduce.shuffle.input.buffer.percent buffer大小佔reduce可用內存的比例。默認值0.7
mapreduce.reduce.input.buffer.percent 指定多少比例的內存用來存放buffer中的數據,默認值是0.0
  • 應該在yarn啓動之前就配置在服務器的配置文件中才能生效(yarn-default.xml)
配置參數 參數說明
yarn.scheduler.minimum-allocation-mb 1024 給應用程序container分配的最小內存
yarn.scheduler.maximum-allocation-mb 8192 給應用程序container分配的最大內存
yarn.scheduler.minimum-allocation-vcores 1 每個container申請的最小CPU核數
yarn.scheduler.maximum-allocation-vcores 32 每個container申請的最大CPU核數
yarn.nodemanager.resource.memory-mb 8192 給containers分配的最大物理內存
  • shuffle性能優化的關鍵參數,應在yarn啓動之前就配置好(mapred-default.xml)
配置參數 參數說明
mapreduce.task.io.sort.mb 100 shuffle的環形緩衝區大小,默認100m
mapreduce.map.sort.spill.percent 0.8 環形緩衝區溢出的閾值,默認80%

2)容錯相關參數(mapreduce性能優化)

配置參數 配置參數
mapreduce.map.maxattempts 每個Map Task最大重試次數,一旦重試參數超過該值,則認爲Map Task運行失敗,默認值:4
mapreduce.reduce.maxattempts 每個Reduce Task最大重試次數,一旦重試參數超過該值,則認爲Map Task運行失敗,默認值:4。
mapreduce.task.timeout Task超時時間,經常需要設置的一個參數,該參數表達的意思爲:如果一個task在一定時間內沒有任何進入,即不會讀取新的數據,也沒有輸出數據,則認爲該task處於block狀態,可能是卡住了,也許永遠會卡主,爲了防止因爲用戶程序永遠block住不退出,則強制設置了一個該超時時間(單位毫秒),默認是600000。如果你的程序對每條輸入數據的處理時間過長(比如會訪問數據庫,通過網絡拉取數據等),建議將該參數調大,該參數過小常出現的錯誤提示是“AttemptID:attempt_14267829456721_123456_m_000224_0 Timed out after 300 secsContainer killed by the ApplicationMaster.”。
3 HDFS小文件優化方法

3.1 HDFS小文件弊端

HDFS上每個文件都要在namenode上建立一個索引,這個索引的大小約爲150byte,這樣當小文件比較多的時候,就會產生很多的索引文件,一方面會大量佔用namenode的內存空間,另一方面就是索引文件過大是的索引速度變慢。

3.2 解決方案

  1. Hadoop Archive:
    是一個高效地將小文件放入HDFS塊中的文件存檔工具,它能夠將多個小文件打包成一個HAR文件,這樣在減少namenode內存使用的同時。
  2. Sequence file:
    sequence file由一系列的二進制key/value組成,如果key爲文件名,value爲文件內容,則可以將大批小文件合併成一個大文件。
  3. CombineFileInputFormat:
    CombineFileInputFormat是一種新的inputformat,用於將多個文件合併成一個單獨的split,另外,它會考慮數據的存儲位置。
  4. 開啓JVM重用
    對於大量小文件Job,可以開啓JVM重用會減少45%運行時間。
    JVM重用理解:一個map運行一個jvm,重用的話,在一個map在jvm上運行完畢後,jvm繼續運行其他jvm
    具體設置:mapreduce.job.jvm.numtasks值在10-20之間。

公衆號:sowhat1412 回覆hadoop即可獲取

參考

尚硅谷Hadoop200集視頻教程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章