这篇文章主要介绍了Yarn下分布式缓存的注意事项有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
最近公司的集群从 Apache hadoop 0.20.203 升级到了 CDH 4,迈进了 Hadoop 2.0 的新时代,虽然新一代的 hadoop 努力做了架构、API 上的各种兼容, 但总有“照顾不周”的地方,下面说的这个有关分布式缓存的案例就是于此有关:一些 MR job 迁移到 Yarn 上后,发觉没数据了,而且没有报错。
查了下数据源和代码,发现是分布式缓存(DistributedCache)的用法有点小变化。以前的老代码大致如下:
... String cacheFilePath = "/dsap/rawdata/cmc_unitparameter/20140308/part-m-00000"; DistributedCache.addCacheFile(new Path(cacheFilePath).toUri(), job.getConfiguration()); ...
... // 从当前作业中获取要缓存的文件 Path[] paths = DistributedCache.getLocalCacheFiles(context.getConfiguration()); for (Path path : paths) { if (path.toString().contains("cmc_unitparameter")) { ...
这两段代码在 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 下面“失效了”。。。
解决这个问题不难:
其实在 MR1 时代我们上面的代码是不够规范的,每次都遍历了整个分布式缓存,我们应该用到一个小技巧:createSymlink
... 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
BufferedReader br = null; br = new BufferedReader(new InputStreamReader(new FileInputStream("DIYFileName")));
感谢你能够认真阅读完这篇文章,希望小编分享的“Yarn下分布式缓存的注意事项有哪些”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。