Hadoop就是「存儲」加「計算」這麼簡單

這篇文字用來忽悠不知道Hadoop的人,也希望他們不要被一大堆概念忽悠了。Hadoop是大數據時代的基礎設施,圍繞數據存儲和計算發展起來的一堆產品。類比單機存儲和處理來看。

一、HDFS 存儲

Hadoop Distributed File System,有了這個分散式文件系統,大數據得以在N台機器上存儲,文件操作的複雜也得以封裝。

*hadoop的配置項fs.default.name設定了hdfs://host:port,hadoop可以直接操作該文件系統。hadoop

fs -ls hdfs://host:port/dir 操作絕對路徑也可以。hadoop不可直接修改文件內容。

hdfs的文件會被劃分為多個塊chunk進行存儲。namenode管理文件系統的命名空間,維護整個文件系統樹及所有的文件和目錄。datanode則存儲數據、處理數據。namenode的單點風險可以通過zookeeper解決。Read。客戶端問namenode得到按文件順序排序的最近的datanode數據塊列表,然後順次從datanode讀取數據塊。(距離:本機>本機架空閑機>跨機架空閑機)Write。客戶端向hdfs創建文件,namenode鑒權通過後新建文件,然後給客戶端一個DFSOutputStream對象,對象將文件切塊維護一個數據隊列,對其中的每一塊數據問namenode要3個有序的datanode,第1個節點存入數據後,把數據傳輸給第2個節點,第2個節點把數據傳給第3個節點。所有節點都寫成功後,數據隊列刪除這塊數據。所有數據塊寫成功後,namenode記錄構成文件的datanode。(寫過程故障,只要正確寫入1塊寫操作就會返回成功,然後這個塊非同步複製夠3塊)(數據節點選擇:默認策略運行客戶端的節點上or隨機選第1個,第2個選另一個機架的隨機位置,第3個選第2個同機架的另一節點)

二、MapReduce數據計算框架

以對一段英文進行單詞計數為例。用MR思維:

mapper先切詞得到<word,1>對兒; 再將相同的詞排序相鄰; reducer按順序掃描進行計數。

單機計算

#mapper.sh 內容awk -F" " {for(i=1;i<=NF;i++)print $i" "1}-------------------#reducer.sh 內容awk -F" " { word=$1; cnt=$2 if(word==lastword){ lastwordcnt+=cnt }else{ if(lastword!="")print lastword" "lastwordcnt lastword=word lastwordcnt=cnt }}END{ print lastword" "lastwordcnt #處理最後一行}-------------------#reducer2.sh 內容#也可以用字典,簡潔但比較耗內存awk -F" " {d[$1]+=$2} END{for(k in d)print k" "d[k]}-------------------###用管道串起來得到結果$ echo "b a b" | sh mapper.sh | sort -k1,1 | sh reducer.sha 1b 2

MapReduce計算

類比單機處理,看看streaming框架對MapReduce過程的封裝

#單機版的mapper.sh和reducer.sh直接跑集群計算任務!sh文件會被分發到真正幹活的hdfs的data節點執行。-D是任務的執行參數。$ hadoop fs -rmr hdfs://.../result_dir #MR任務只能output到一個空目錄中;目錄不存在則會自動逐層創建。$ hadoop streaming -D mapred.reduce.tasks=3 -input "hdfs://.../datadir/*" -output "hdfs://.../result_dir" -mapper "sh mapper.sh" -reducer "sh reducer.sh" -file mapper.sh -file reducer.sh

* 所謂的mapper和reducer其實就是一串shell命令,所以,可以是 "python mapper.py"等等其他多種語言,框架會通過管道將執行命令串起來。

一個job包含多個maptask和reducetask。對應的,生成一個jobtracker協調/調度/失敗重試多個tasktracker,tasktracker運行task的同時向jobtracker報告進度。每個數據塊啟動一個map任務,優先在數據所在機器最近的機器上執行map任務,map結果先經內存緩衝區分區排序寫入本機磁碟,再傳輸到reduce節點計算,reduce結果存入hdfs。還有conbiner可以對map結果進行預聚合,減少map結果的網路傳輸。

-------------------------------------

基建有了,圍繞基建做的優化就很多了,美其名曰Hadoop家族。日誌數據怎麼存入hdfs、hdfs的namenode單點問題怎麼解決、hdfs的細節優化、Mapreduce計算的細節調優、計算模式的升級、存儲模式升級、更舒服的數據計算介面(Hive)等等。

推薦閱讀:

Zookeeper在哪些系統中使用,又是怎麼用的?
Spark編程有哪些有用技巧?
大數據相關技能圖譜(高清慎入!)
Hadoop Streaming模式的優缺點?
Hadoop mapreduce的核心組件

TAG:Hadoop | HDFS | MapReduce |