Yarn(MapReduce 2.0)下分佈式緩存(DistributedCache)的注意事項

一、問題

最近公司的集羣從 Apache hadoop 0.20.203 升級到了 CDH 4,邁進了 Hadoop 2.0 的新時代,雖然新一代的 hadoop 努力作了架構、API 上的各類兼容, 但總有「照顧不周」的地方,下面說的這個有關分佈式緩存的案例就是於此有關:一些 MR job 遷移到 Yarn 上後,發覺沒數據了,並且沒有報錯。
查了下數據源和代碼,發現是分佈式緩存(DistributedCache)的用法有點小變化。之前的老代碼大體以下:

(1)在 main 函數中添加分佈式緩存文件:

...
String cacheFilePath = "/dsap/rawdata/cmc_unitparameter/20140308/part-m-00000";
DistributedCache.addCacheFile(new Path(cacheFilePath).toUri(), job.getConfiguration());
...

(2)在 MR 初始化的時候讀取緩存文件作數據字典:

...
// 從當前做業中獲取要緩存的文件
Path[] paths = DistributedCache.getLocalCacheFiles(context.getConfiguration());
for (Path path : paths) {
    if (path.toString().contains("cmc_unitparameter")) {
        ...

(3)結果:

這兩段代碼在 MR1 時代毫無問題,可是到了 MR2 時代 if 是永遠爲 false 的。
特地對比了下 MR1 和 MR2 時代的 path 格式,能夠看到在 MRv2 下,Path 中不包含原始路徑信息了:
MR1 Path:   hdfs://host:fs_port/dsap/rawdata/cmc_unitparameter/20140308/part-m-00000
MR1 Path:   hdfs://host:fs_port/dsap/rawdata/cmc_unitparameter/20140308/part-m-00000


MR2 Path:   /data4/yarn/local/usercache/root/appcache/application_1394073762364_1884/container_1394073762364_1884_01_000006/part-m-00000
MR2 Path:   /data17/yarn/local/usercache/root/appcache/application_1394073762364_1884/container_1394073762364_1884_01_000002/part-m-00000
MR2 Path:   /data23/yarn/local/usercache/root/appcache/application_1394073762364_1884/container_1394073762364_1884_01_000005/part-m-00000
看了上面兩種差別我想你能明白爲啥分佈式緩存在 MR2 下面「失效了」。。。

二、解決方案

解決這個問題不難: html

其實在 MR1 時代咱們上面的代碼是不夠規範的,每次都遍歷了整個分佈式緩存,咱們應該用到一個小技巧:createSymlink java

(1)main 函數中爲每一個緩存文件添加符號連接:相似於 HTTP URL 的 # 錨點同樣

...
String cacheFilePath = "/dsap/rawdata/cmc_unitparameter/20140308/part-m-00000";
Path inPath = new Path(cacheFilePath);
// # 號以後的名稱是對上面文件的連接,不一樣文件的連接名不能相同,雖然由你本身隨便取
String inPathLink=inPath.toUri().toString()+"#"+"DIYFileName";
DistributedCache.addCacheFile(new URI(inPathLink), job.getConfiguration());
...

加了軟連接後,path 信息的最後部分就是你剛纔的 DIYFileName: 緩存

/data4/yarn/local/usercache/root/appcache/application_1394073762364_1966/container_1394073762364_1966_01_000005/cmcs_paracontrolvalues
/data4/yarn/local/usercache/root/appcache/application_1394073762364_1966/container_1394073762364_1966_01_000005/cmc_unitparameter

(2)在須要用緩存文件的地方直接根據你剛纔 # 後面自定義的文件名讀取便可

BufferedReader br = null;
br = new BufferedReader(new InputStreamReader(new FileInputStream("DIYFileName")));

(3)其它地方的用法和代碼與 MR1 無任何變化。

三、Refer:

一、Hadoop 多表 join:map side join 範例 架構

http://my.oschina.net/leejun2005/blog/111963 app

二、Hadoop DistributedCache詳解 分佈式

http://dongxicheng.org/mapreduce-nextgen/hadoop-distributedcache-details/ ide

三、迭代式MapReduce解決方案(二) DistributedCache 函數

http://hongweiyi.com/2012/02/iterative-mapred-distcache/ oop

四、DistributedCache小記 spa

http://www.cnblogs.com/xuxm2007/p/3344930.html

相關文章
相關標籤/搜索