专栏首页数据之美Yarn(MapReduce 2.0)下分布式缓存(DistributedCache)的注意事项

Yarn(MapReduce 2.0)下分布式缓存(DistributedCache)的注意事项

1、问题

最近公司的集群从 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 下面“失效了”。。。

2、解决方案

解决这个问题不难:

其实在 MR1 时代我们上面的代码是不够规范的,每次都遍历了整个分布式缓存,我们应该用到一个小技巧:createSymlink

(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 无任何变化。

3、Refer:

1、Hadoop 多表 join:map side join 范例

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

2、Hadoop DistributedCache详解

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

3、迭代式MapReduce解决方案(二) DistributedCache

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

4、DistributedCache小记

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Hive 中的 LEFT SEMI JOIN 与 JOIN ON 的前世今生

    hive 的 join 类型有好几种,其实都是把 MR 中的几种方式都封装实现了,其中 join on、left semi join 算是里边具有代表性,且使...

    用户1177713
  • 图文并茂详解 SQL JOIN

    Join是关系型数据库系统的重要操作之一,一般关系型数据库中包含的常用Join:内联接、外联接和交叉联接等。如果我们想在两个或以上的表获取其中从一个表中的行与另...

    用户1177713
  • MapReduce 中的两表 join 几种方案简介

    1. 概述 在传统数据库(如:MYSQL)中,JOIN操作是非常常见且非常耗时的。而在HADOOP中进行JOIN操作,同样常见且耗时,由于Hadoop的独...

    用户1177713
  • 详解hive的join优化

    Hive自动识别各种用例并对其进行优化。Hive 0.11改进了这些情况的优化器:

    Spark学习技巧
  • Hive 中的 LEFT SEMI JOIN 与 JOIN ON 的前世今生

    hive 的 join 类型有好几种,其实都是把 MR 中的几种方式都封装实现了,其中 join on、left semi join 算是里边具有代表性,且使...

    用户1177713
  • SparkSQL的3种Join实现

    Join是SQL语句中的常用操作,良好的表结构能够将数据分散在不同的表中,使其符合某种范式,减少表冗余、更新容错等。而建立表和表之间关系的最佳方式就是Join操...

    王知无
  • inner join、outer join、right join、left join 之间的区别

    一、sql的left join 、right join 、inner join之间的区别   left join(左联接) 返回包括左表中的所有记录和右表中联...

    静谧的小码农
  • MySQL分组统计与多表联合查询的基本知识归纳总结

    having 对分组后的数据进行条件筛选,与where相似,但是只针对分组后的数据,where无法筛选聚合函数

    奋斗蒙
  • Spark SQL 之 Join 实现

    如今Spark SQL(Dataset/DataFrame)已经成为Spark应用程序开发的主流,作为开发者,我们有必要了解Join在Spark中是如何组织运行...

    涂小刚
  • 【2019年8月版本】OCP 071认证考试最新版本的考试原题-第11题

    Which two statements are true about a self join?

    用户5892232

扫码关注云+社区

领取腾讯云代金券