溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Yarn下分布式緩存的注意事項有哪些

發(fā)布時間:2021-12-16 15:01:59 來源:億速云 閱讀:145 作者:小新 欄目:云計算

這篇文章主要介紹了Yarn下分布式緩存的注意事項有哪些,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

1、問題

最近公司的集群從 Apache hadoop 0.20.203 升級到了 CDH 4,邁進(jìn)了 Hadoop 2.0 的新時代,雖然新一代的 hadoop 努力做了架構(gòu)、API 上的各種兼容, 但總有“照顧不周”的地方,下面說的這個有關(guān)分布式緩存的案例就是于此有關(guān):一些 MR job 遷移到 Yarn 上后,發(fā)覺沒數(shù)據(jù)了,而且沒有報錯。
查了下數(shù)據(jù)源和代碼,發(fā)現(xiàn)是分布式緩存(DistributedCache)的用法有點(diǎn)小變化。以前的老代碼大致如下:
 

(1)在 main 函數(shù)中添加分布式緩存文件:
...
String cacheFilePath = "/dsap/rawdata/cmc_unitparameter/20140308/part-m-00000";
DistributedCache.addCacheFile(new Path(cacheFilePath).toUri(), job.getConfiguration());
...
(2)在 MR 初始化的時候讀取緩存文件做數(shù)據(jù)字典:
...
// 從當(dāng)前作業(yè)中獲取要緩存的文件
Path[] paths = DistributedCache.getLocalCacheFiles(context.getConfiguration());
for (Path path : paths) {
    if (path.toString().contains("cmc_unitparameter")) {
        ...
(3)結(jié)果:

這兩段代碼在 MR1 時代毫無問題,但是到了 MR2 時代 if 是永遠(yuǎn)為 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 下面“失效了”。。。
 

2、解決方案

解決這個問題不難:

其實在 MR1 時代我們上面的代碼是不夠規(guī)范的,每次都遍歷了整個分布式緩存,我們應(yīng)該用到一個小技巧:createSymlink

(1)main 函數(shù)中為每個緩存文件添加符號鏈接:類似于 HTTP URL 的 # 錨點(diǎn)一樣
...
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)在需要用緩存文件的地方直接根據(jù)你剛才 # 后面自定義的文件名讀取即可
BufferedReader br = null;
br = new BufferedReader(new InputStreamReader(new FileInputStream("DIYFileName")));
(3)其它地方的用法和代碼與 MR1 無任何變化。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Yarn下分布式緩存的注意事項有哪些”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI