Hadoop,MapReduce,HDFS面試題

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:複雜的數據統計模型,或改變圖像數據格式]

640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy

  工作流程:

  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是一個不錯的分佈式文件系統,它有很多的優點,但也存在有一些缺點,包括:不適合低延遲數據訪問、無法高效存儲大量小文件、不支持多用戶寫入及任意修改文件。

640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy

  有一個文件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上的數據,放到其他節點去。讀取時,要讀其他節點去。

  ③掛掉一個節點,沒關係,還有其他節點可以備份;甚至,掛掉某一個機架,也沒關係;其他機架上,也有備份。


  以後是通過源碼分析,和代碼經驗來慢慢加深這些概念的理解鞏固他們,歡迎大家常駐,一起學習。


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