Hadoop,MapReduce,HDFS面試題
1.什麼是hadoop
答:是google的核心算法MapReduce的一個開源實現。用於海量數據的並行處理。
hadoop的核心主要包含:HDFS和MapReduce
HDFS是分佈式文件系統,用於分佈式存儲海量數據。
MapReduce是分佈式數據處理模型,本質是並行處理。
2.用hadoop來做什麼?
1、最簡單的,做個數據備份/文件歸檔的地方,這利用了hadoop海量數據的存儲能力
2、數據倉庫/數據挖掘:分析web日誌,分析用戶的行爲(如:用戶使用搜索時,在搜索結果中點擊第2頁的概率有多大)
3、搜索引擎:設計hadoop的初衷,就是爲了快速建立索引。
4、雲計算:據說,中國移動的大雲,就是基於hadoop的
5、研究:hadoop的本質就是分佈式計算,又是開源的。有很多思想值得借鑑。
3.什麼是MapReduce,它是怎麼工作的
MapReduce借用了函數式編程的概念,是google發明的一種用分佈式來處理大數據集的數據處理模型
[這也是和SQL數據庫重大區別之一,用函數編程(MapReduce)代替聲明查詢SQL。
SQL:聲明查詢結果,讓數據庫引擎判定獲取數據。
MapReduce:數據處理步驟由你自己制定(腳本,代碼)eg:複雜的數據統計模型,或改變圖像數據格式]
工作流程:
1、client提交數據到DFS,然後被分爲多個split,然後通過inputformatter以key-value傳給jobTraker,jobTraker分配工作給多個map(taskTraker),工程師重寫map,在各個taskTraker上分別執行代碼任務,做到數據不動,代碼動(改革之一)。真正實現代碼分佈式。
2、tasktraker執行完代碼後,將結果通過上下文收集起來,再傳給reduce(也是taskTraker),經過排序等操作,再執行工程師重寫的reduce方法,最終將結果通過outputFormatter寫到DFS。
4.什麼是HDFS,它的存儲機制?
HDFS(Hadoop Distributed File System)是Hadoop項目的核心子項目,是分佈式計算中數據存儲管理的基礎,坦白說HDFS是一個不錯的分佈式文件系統,它有很多的優點,但也存在有一些缺點,包括:不適合低延遲數據訪問、無法高效存儲大量小文件、不支持多用戶寫入及任意修改文件。
有一個文件FileA,100M大小。Client將FileA寫入到HDFS上。
HDFS按默認配置。
HDFS分佈在三個機架上Rack1,Rack2,Rack3。
a. Client將FileA按64M分塊。分成兩塊,block1和Block2;
b. Client向nameNode發送寫數據請求,如圖藍色虛線①——>。
c. NameNode節點,記錄block信息。並返回可用的DataNode,如粉色虛線②———>。
Block1: host2,host1,host3
Block2: host7,host8,host4
原理:
NameNode具有RackAware機架感知功能,這個可以配置。
若client爲DataNode節點,那存儲block時,規則爲:副本1,同client的節點上;副本2,不同機架節點上;
副本3,同第二個副本機架的另一個節點上;其他副本隨機挑選。
若client不爲DataNode節點,那存儲block時,規則爲:副本1,隨機選擇一個節點上;副本2,不同副本1,機架上;
副本3,同副本2相同的另一個節點上;其他副本隨機挑選。
d. client向DataNode發送block1;發送過程是以流式寫入。
流式寫入過程,
1>將64M的block1按64k的package劃分;
2>然後將第一個package發送給host2;
3>host2接收完後,將第一個package發送給host1,同時client想host2發送第二個package;
4>host1接收完第一個package後,發送給host3,同時接收host2發來的第二個package。
5>以此類推,如圖紅線實線所示,直到將block1發送完畢。
6>host2,host1,host3向NameNode,host2向Client發送通知,說“消息發送完了”。如圖粉紅顏色實線所示。
7>client收到host2發來的消息後,向namenode發送消息,說我寫完了。這樣就真完成了。如圖黃色粗實線
8>發送完block1後,再向host7,host8,host4發送block2,如圖藍色實線所示。
9>發送完block2後,host7,host8,host4向NameNode,host7向Client發送通知,如圖淺綠色實線所示。
10>client向NameNode發送消息,說我寫完了,如圖黃色粗實線。。。這樣就完畢了。
分析,通過寫過程,我們可以瞭解到:
①寫1T文件,我們需要3T的存儲,3T的網絡流量貸款。
②在執行讀或寫的過程中,NameNode和DataNode通過HeartBeat進行保存通信,確定DataNode活着。
如果發現DataNode死掉了,就將死掉的DataNode上的數據,放到其他節點去。讀取時,要讀其他節點去。
③掛掉一個節點,沒關係,還有其他節點可以備份;甚至,掛掉某一個機架,也沒關係;其他機架上,也有備份。
以後是通過源碼分析,和代碼經驗來慢慢加深這些概念的理解鞏固他們,歡迎大家常駐,一起學習。