hadoop進階2_2.x

HDFS是Hadoop分佈式文件系統的簡稱,由若干臺計算機組成,用於存放PB、TB數量級以上的文件,每份文件可以有多個副本,所以HDFS是一個具有高冗餘、高容錯的文件系統。

Hadoop系統架構圖

hadoop2.0以後的版本移除了原有的JobTracker和TaskTracker,改由Yarn平臺的ResourceManager負責集羣中所有資源的統一管理和分配,NodeManager管理Hadoop集羣中單個計算節點。

YARN的設計減少了JobTracker的資源消耗,減少了Hadoop1.0中發生單點故障的風險。我們還可以在YARN平臺上運行Spark和Storm作業,充分利用資源。

MapReduce作業是一種大規模數據集的並行計算的編程模型。我們可以將HDFS中存放的海量數據,通過MapReduce作業進行計算,得到目標數據!

MapReduce 的四個階段:


Split階段:分片

Map階段(需要編碼)

Shuffle階段

Reduce階段(需要編碼)


理想的輸入文件:

由於NameNode內存有限,大量的小文件會給hdfs帶來性能上的問題。故Hdfs適合存放大文件,對於大量小文件,可以採用壓縮、合併小文件的優化策略。例如,設置文件輸入類型爲CombineFileInputFormat格式


本地優化——combine

數據經過Map端輸出後會進行網絡混淆,經Shuffle後進行Reduce,在大量數據量的情況下可能會造成巨大的網絡開銷。故可以在本地先按照KEY先行一輪排序與合併,再進行網絡混淆,這個過程就是






一個MapReduce作業中,以下三者的數量總是相等的:


Partitionerd的數量

Reduce任務的數量

最終輸出文件(part -r-00000)


在一個Reducer中,所有數據都會被按照key值升序排序,故如果part輸出文件中包含key值,則這個文件一定是有序的。



Reducer任務數量

在大多數的情況下,如果只設置1個reduce任務,那麼在reduce階段,整個集羣只有該節點在運行reduce任務,其他節點都將被閒置,效率十分低下。故建議將reduce任務數量設置成一個較大的值(最大值是72)


一個節點上的reduce任務數並不像Map任務數那樣受多個因素制約。

可以通過調節參數mapred.reduce.tasks

可以在代碼中調用job.setNumReduceTasks(int n)


總結:

分片輸入——split

由於NameNode內存限制,hdfs適合存放大文件

對於小文件可採用壓縮輸入格式CombineFileInputFormat\

dfs.block.size可調節塊大小

Map任務數量和mapred.map.tasks和mapred.min.split.size參數有關


本地合併Combine:數據在Mapper輸出後會進行和Reduce相似的操作,減少網絡開銷

job.setCombinerClass(MyReduce.class)





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