原理篇:
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的指導下複制這些塊,保持備援。
能夠在解說的時候,拿僅僅筆和紙畫下:
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取走;
同樣的,能夠簡單畫個圖:
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權威指南》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的控制下執行一個任務;
簡單繪圖:
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/)
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/):
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作業,能夠設定輸入輸出為序列檔案,這樣能夠達到更好的性能。
個人整理,如有錯誤,敬請不吝賜教。
分享,成長,快樂
腳踏實地,專注