分佈式緩存應用

        在MR作業中,經常有使所有節點的作業共享引用數據的需求,Hadoop爲我們提供了一種可供選擇的機制:分佈式緩存。它可以把map或reduce任務要用的通用只讀文件在所有節點之間共享。這些文件可以是文本數據,也可以是jar包或者二進制文件,任何文件都可以。

        要被共享的文件放置在HDFS,作業驅動將其加入到DistributedCache。在作業執行前,Hadoop的每個節點都會將文件複製到本地文件系統,這意味着每個任務對文件都有本地訪問權限。

        1)將要用的文件上傳到HDFS。

        2)具體使用方法如下,在創建將conf傳遞到job之前,將數據分發到每個節點上:

DistributedCache.addCacheFile(new URI("/user/hadoop/conf/a.txt"), conf);

3)在Job初始化的時候回調函數configure中加載此文件:

Path[] cacheFile = DistributedCache.getLocalCacheFiles(job);

4)在mapper和reduce函數中使用此數據 。

注意:我們一定要把獲取數據的過程放在mapper或reducer類的configure()函數中,這樣對應一個datanode就只有一份數據,N個map可以共享着一份數據。如果放在map和reduce中去獲取,那麼每個都會去加載一次,很容易會導致堆棧溢出。

DistributedCache有以下幾種典型的應用場景:

1)分發字典文件,一些情況下Mapper或者Reducer需要用到一些外部字典,比如黑白名單、詞表等;

2)map-side join:當多表連接時,一種場景是一個表很大,一個表很小,小到足以加載到內存中,這時可以使用DistributedCache將小表分發到各個節點上,以供Mapper加載使用;

3)自動化軟件部署:有些情況下,MapReduce需依賴於特定版本的庫,比如依賴於某個版本的PHP解釋器,一種做法是讓集羣管理員把這個版本的PHP裝到各個機器上,這通常比較麻煩,另一種方法是使用DistributedCache分發到各個節點上,程序運行完後,Hadoop自動將其刪除。

 


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