1. 程式人生 > >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:複雜的資料統計模型,或改變影象資料格式]
這裡寫圖片描述
工作流程:
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上的資料,放到其他節點去。讀取時,要讀其他節點去。

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



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