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值。《Hadoop&Spark解決二次排序問題(Hadoop篇)》

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,使用該類的方法如下:

(1)用戶使用靜態方法DistributedCache.addCacheFile()指定要複製的文件,它的參數是文件的URI(如果是HDFS上的文件,可以這樣:hdfs://namenode:9000/home/XXX/file,其中9000是自己配置的NameNode端口號)。JobTracker在作業啟動之前會獲取這個URI列表,並將相應的文件拷貝到各個TaskTracker的本地磁盤上。(2)用戶使用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的作用

(1)、combiner

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

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

(2)、partition

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

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

相關推薦

推薦中...