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任務來處理。