天天看點

Hadoop大資料面試--Hadoop篇

原理篇:

1. hadoop2.x的各個子產品一句話簡單介紹

   1)hadoop common:為hadoop其它子產品提供支援的公共工具包;

   2)hdfs:hadoop分布式檔案系統;

   3)yarn:任務排程和叢集資源管理架構;

   4)mapreduce:用于處理大資料集的架構,可擴充和并行。

2. hdfs資料上傳原理

1) client端發送一個加入檔案到hdfs的請求給namenode。

2) namenode告訴client端怎樣來分發資料塊以及分發到哪裡;

3) client端把資料分為塊(block)然後把這些塊分發到datanode中。

4) datanode在namenode的指導下複制這些塊,保持備援。

能夠在解說的時候,拿僅僅筆和紙畫下:

Hadoop大資料面試--Hadoop篇

tips:

 a. namenode之存儲檔案的中繼資料,而不存儲詳細的資料;

 b. hdfs federation: 解決ha單點故障問題,支援namenode水準擴充,每一個namenode相應一個namespace。

3. mapreduce概述

 1)map和reduce任務在nodemanager節點上各自有自己的jvm;

 2)全部的mapper完畢後。實時的key/value對會經過一個shuffle和sort的階段,在這個階段中全部共同的key會被合并,發送到同樣的reducer中;

 3)mapper的個數依據輸入的格式确定,reducer的個數依據job作業的配置決定;

 4)partitioner分區器決定key/value相應該被送往哪個reducer中。

 5)combiner合并器能夠合并mapper的輸出,這樣能夠提高性能;

4. map--》shuffle、sort--》reduce

map階段:

1) inputformat确定輸入資料應該被分為多少個分片。而且為每一個分片建立一個inputsplit執行個體;

2) 針對每一個inputsplit執行個體mr架構使用一個map任務來進行處理。在inputsplit中的每一個kv鍵值對被傳送到mapper的map函數進行處理;

3) map函數産生新的序列化後的kv鍵值對到一個沒有排序的記憶體緩沖區中;

4) 當緩沖區裝滿或者map任務完畢後。在該緩沖區的kv鍵值對就會被排序同一時候流入到磁盤中,形成spill檔案,溢出檔案;

5) 當有不止一個溢出檔案産生後,這些檔案會全部被排序,而且合并到一個檔案裡;

6) 檔案裡排序後的kv鍵值對等待被reducer取走;

同樣的,能夠簡單畫個圖:

Hadoop大資料面試--Hadoop篇

reduce階段:

主要包含三個小階段:

1) shuffle:或者稱為fetch階段(擷取階段),在這個階段全部擁有同樣鍵的記錄都被合并而且發送到同一個reducer中;

2) sort: 和shuffle同一時候發生,在記錄被合并和發送的過程中,記錄會依照key進行排序。

3) reduce:針對每一個鍵會進行reduce函數調用;

reduce資料流:

1) 當mapper完畢map任務後,reducer開始擷取記錄,同一時候對他們進行排序并存入自己的jvm記憶體中的緩沖區;

2) 當一個緩沖區資料裝滿。則會流入到磁盤;

3) 當全部的mapper完畢而且reducer擷取到全部和他相關的輸入後,該reducer的全部記錄會被合并和排序,包含還在緩沖區中的;

4) 合并、排序完畢後調用reduce方法;輸出到hdfs或者依據作業配置到其它地方;

Hadoop大資料面試--Hadoop篇

圖檔來自《hadoop權威指南》3rd edition

5. yarn相關

yarn包含的元件有:resourcemanager、nodemanager、applicationmaster,當中resourcemanager能夠分為:scheduler、applicationsmanager

hadoop1.x中的jobtracker被分為兩部分:resourcemanager和applicationmaster。前者提供叢集資源給應用,後者為應用提供執行時環境。

yarn應用生命周期:

1)   client送出一個應用請求到resourcemanager;

2)   resourcemanager中的applicationsmanager在叢集中尋找一個可用的、負載較小的nodemanager;

3)   被找到的nodemanager建立一個applicationmaster執行個體;

4)   applicationmaster向resourcemanager發送一個資源請求。resourcemanager回複一個container的清單。包含這些container是在哪些nodemanager上啟動的資訊。

5)   applicationmaster在resourcemanager的指導下在每一個nodemanager上啟動一個container,container在applicationmaster的控制下執行一個任務;

簡單繪圖:

Hadoop大資料面試--Hadoop篇

tips:

a.  client能夠從applicationmaster中擷取任務資訊;

b. 一個作業一個applicationmaster,一個application能夠有多個container,一個nodemanager也能夠有多個container;

性能篇:

性能涉及較多内容。這裡參考前文中給出的連結。并依照作業執行、map階段、reduce階段的順序來組織性能相關的點。

1. 指令行參數:

在自己定義叢集的參數時。不改動叢集的檔案,而在指令行使用參數。這樣能夠針對不同的參數設定友善,進而不必改動叢集中的配置檔案,一般有以下兩種方式:

1)hadoop jar examplejob-0.0.1.jar examplejob -conf my-conf.xml arg0 arg1

使用配置檔案的方式,把須要改動的地方設定在配置檔案裡面,使用-conf指定配置檔案(上面指令行來自:http://www.idryman.org/blog/2014/03/05/hadoop-performance-tuning-best-practices/);

2)hadoop jar examplejob-0.0.1.jar examplejob -dmapred.reduce.tasks=20 arg0

使用-d參數來這是相應的值也是能夠的(上面的指令行來自:http://www.idryman.org/blog/2014/03/05/hadoop-performance-tuning-best-practices/);

2. map階段

1) map的個數問題

   map的個數是不能直接設定的。假設有非常多mapper的執行時間小于1分鐘。那麼建議設定mapred.min.split.size的大小。提高分片的大小,這樣來減小mapper的個數,能夠減小mapper初始化的時間;或者設定jvm重用(圖檔來自:http://www.idryman.org/blog/2014/03/05/hadoop-performance-tuning-best-practices/)

Hadoop大資料面試--Hadoop篇

2) 設定mapred.child.java.opts參數

使用ganglia、nagios等監控工具檢測slave節點的記憶體使用情況,設定合适的mapred.child.java.opts 參數。避免交換的發生;

3)map的輸出使用壓縮

當map的輸出較多時,能夠考慮使用壓縮,這能提高非常大的性能(圖檔來自:http://www.idryman.org/blog/2014/03/05/hadoop-performance-tuning-best-practices/):

Hadoop大資料面試--Hadoop篇

4)使用合适的writable作為key(鍵)和value(值)類型

這一點在mapper和reducer的程式設計中都能夠使用,假設全部資料都使用text的話,那麼資料的占有空間将會非常大,導緻效率低下。假設有必要能夠自己定義writable類型。

5)重用已有變量

在mapper或者reducer的程式設計中重用已經定義的變量,能夠避免反複的生成新對象,而導緻垃圾回收頻繁的調用,例如以下代碼1和2(代碼參考:http://blog.cloudera.com/blog/2009/12/7-tips-for-improving-mapreduce-performance/);

6) 設定mapreduce.reduce.shuffle.parallelcopies參數

     設定此參數,能夠使 reducer在一個mapper完畢後就開始擷取資料,并行化資料擷取;

7) 最小化mapper輸出:

a.      在mapper端過濾,而不是在reducer端過濾;

b.      使用更小的資料來存儲map輸出的key和value(參考第4)點);

c.      設定mapper的輸出進行壓縮(參考第3)點)。

3. reduce階段

reducer負載均衡:

1) reducer的個數。依據實際叢集的數量來設定reducer的個數。使其負載均衡。

比方叢集有100個節點。那麼reducer的個數設定為101個則應該是不合理的。在第一次任務配置設定時配置設定了100個作業。這100個作業是并行的。可是最後一個作業并非并行的。

2)reducer中部分由于同樣key的資料量大,導緻個别reducer執行耗時相比其它reducer耗時長非常多。

能夠考慮:

a.      實作一個更好的hash函數繼承自partitioner類;

b.      假設知道有大量同樣的key的資料。能夠寫一個預處理的作業把同樣的key分到不同的輸出中,然後再使用一個mr作業來處理這個特殊的key的資料;

4. 設定輸入輸出

假設有多個連續的mr作業,能夠設定輸入輸出為序列檔案,這樣能夠達到更好的性能。

個人整理,如有錯誤,敬請不吝賜教。

分享,成長,快樂

腳踏實地,專注

繼續閱讀