天天看點

一份關于大資料架構Hadoop的面試問答題

Hadoop是什麼?Hadoop是一個開發和運作處理大規模資料的軟體平台,是Appach的一個用java語言實作開源軟體架構,實作在大量計算機組成的叢集中對海量資料進行分布式計算,下面看看一般情況下,關于Hadoop的面試是會問哪些問題,以及該怎麼回答。

1. 簡單描述如何安裝配置一個apache開源版hadoop,隻描述即可,無需列出完整步驟,能列出步驟更好。

1) 安裝JDK并配置環境變量(/etc/profile)

2) 關閉防火牆

3) 配置hosts檔案,友善hadoop通過主機名通路(/etc/hosts)

4) 設定ssh免密碼登入

5) 解壓縮hadoop安裝包,并配置環境變量

6) 修改配置檔案($HADOOP_HOME/conf)

hadoop-env.sh core-site.xml hdfs-site.xml mapred-site.xml

7) 格式化hdfs檔案系統 (hadoop namenode -format)

8) 啟動hadoop ($HADOOP_HOME/bin/start-all.sh)

9) 使用jps檢視程序

2. 請列出正常工作的hadoop叢集中hadoop都分别需要啟動那些程序,他們的作用分别是什麼,盡可能寫的全面些。

1) NameNode: HDFS的守護程序,負責記錄檔案是如何分割成資料塊,以及這些資料塊分别被存儲到那些資料節點上,它的主要功能是對記憶體及IO進行集中管理

2) Secondary NameNode:輔助背景程式,與NameNode進行通信,以便定期儲存HDFS中繼資料的快照。

3) DataNode:負責把HDFS資料塊讀寫到本地的檔案系統。

4) JobTracker:負責配置設定task,并監控所有運作的task。

5) TaskTracker:負責執行具體的task,并與JobTracker進行互動。

3. 請列出你所知道的hadoop排程器,并簡要說明其工作方法。

比較流行的三種排程器有:預設排程器FIFO,計算能力排程器Capacity Scheduler,公平排程器Fair Scheduler

1) 預設排程器FIFO

hadoop中預設的排程器,采用先進先出的原則

2) 計算能力排程器Capacity Scheduler

選擇占用資源小,優先級高的先執行

3) 公平排程器Fair Scheduler

同一隊列中的作業公平共享隊列中所有資源

4. Hive有那些方式儲存中繼資料的,各有那些特點。

1) 記憶體資料庫derby,較小,不常用

2) 本地mysql,較常用

3) 遠端mysql,不常用

5. 請簡述hadoop怎樣實作二級排序。

在Hadoop中,預設情況下是按照key進行排序,如果要按照value進行排序怎麼辦?

有兩種方法進行二次排序,分别為:buffer and in memory sort和 value-to-key conversion。

buffer and in memory sort

主要思想是:在reduce()函數中,将某個key對應的所有value儲存下來,然後進行排序。 這種方法最大的缺點是:可能會造成out of memory。

value-to-key conversion

主要思想是:将key和部分value拼接成一個組合key(實作WritableComparable接口或者調setSortComparatorClass函數),這樣reduce擷取的結果便是先按key排序,後按value排序的結果,需要注意的是,使用者需要自己實作Paritioner,以便隻按照key進行資料劃分。Hadoop顯式的支援二次排序,在Configuration類中有個setGroupingComparatorClass()方法,可用于設定排序group的key值。

6. 簡述hadoop實作Join的幾種方法。

1) reduce side join

reduce side join是一種最簡單的join方式,其主要思想如下:

在map階段,map函數同時讀取兩個檔案File1和File2,為了區分兩種來源的key/value資料對,對每條資料打一個标簽(tag),比如:tag=0表示來自檔案File1,tag=2表示來自檔案File2。即:map階段的主要任務是對不同檔案中的資料打标簽。

在reduce階段,reduce函數擷取key相同的來自File1和File2檔案的value list, 然後對于同一個key,對File1和File2中的資料進行join(笛卡爾乘積)。即:reduce階段進行實際的連接配接操作。

2) map side join

之是以存在reduce side join,是因為在map階段不能擷取所有需要的join字段,即:同一個key對應的字段可能位于不同map中。Reduce side join是非常低效的,因為shuffle階段要進行大量的資料傳輸。

Map side join是針對以下場景進行的優化:兩個待連接配接表中,有一個表非常大,而另一個表非常小,以至于小表可以直接存放到記憶體中。這樣,我們可以将小表複制多份,讓每個map task記憶體中存在一份(比如存放到hash table中),然後隻掃描大表:對于大表中的每一條記錄key/value,在hash table中查找是否有相同的key的記錄,如果有,則連接配接後輸出即可。

為了支援檔案的複制,Hadoop提供了一個類DistributedCache,使用該類的方法如下:

A:使用者使用靜态方法DistributedCache.addCacheFile()指定要複制的檔案,它的參數是檔案的URI(如果是HDFS上的檔案,可以這樣:hdfs://namenode:9000/home/XXX/file,其中9000是自己配置的NameNode端口号)。JobTracker在作業啟動之前會擷取這個URI清單,并将相應的檔案拷貝到各個TaskTracker的本地磁盤上。

B:使用者使用DistributedCache.getLocalCacheFiles()方法擷取檔案目錄,并使用标準的檔案讀寫API讀取相應的檔案。

3) SemiJoin

SemiJoin,也叫半連接配接,是從分布式資料庫中借鑒過來的方法。它的産生動機是:對于reduce side join,跨機器的資料傳輸量非常大,這成了join操作的一個瓶頸,如果能夠在map端過濾掉不會參加join操作的資料,則可以大大節省網絡IO。

實作方法很簡單:選取一個小表,假設是File1,将其參與join的key抽取出來,儲存到檔案File3中,File3檔案一般很小,可以放到記憶體中。在map階段,使用DistributedCache将File3複制到各個TaskTracker上,然後将File2中不在File3中的key對應的記錄過濾掉,剩下的reduce階段的工作與reduce side join相同。

4) reduce side join + BloomFilter

在某些情況下,SemiJoin抽取出來的小表的key集合在記憶體中仍然存放不下,這時候可以使用BloomFiler以節省空間。

BloomFilter最常見的作用是:判斷某個元素是否在一個集合裡面。它最重要的兩個方法是:add() 和contains()。最大的特點是不會存在false negative,即:如果contains()傳回false,則該元素一定不在集合中,但會存在一定的true negative,即:如果contains()傳回true,則該元素可能在集合中。

因而可将小表中的key儲存到BloomFilter中,在map階段過濾大表,可能有一些不在小表中的記錄沒有過濾掉(但是在小表中的記錄一定不會過濾掉),這沒關系,隻不過增加了少量的網絡IO而已。

7. 請簡述MapReduce中combiner、partition的作用。

combiner:

有時一個map可能會産生大量的輸出,combiner的作用是在map端對輸出先做一次合并,以減少網絡傳輸到reducer的數量。

注意:mapper的輸出為combiner的輸入,reducer的輸入為combiner的輸出。

partition:

把map任務輸出的中間結果按照key的範圍劃分成R份(R是預先定義的reduce任務的個數),劃分時通常使用hash函數,如:hash(key) mod R

這樣可以保證一段範圍内的key,一定會由一個reduce任務來處理。

推薦閱讀文章

大資料零基礎快速入門教程