【hadoop】分布式缓存DistributedCache

本文深入解析Hadoop Map-Join案例,探讨在Hadoop中如何通过DistributedCache机制实现共享全局变量或文件,包括其使用方法、特点及注意事项,如文件可见范围调整、按需拷贝等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文是对MR案例:Map-Join的解读。

在hadoop中,共享全局变量或全局文件的几种方法

  1. 使用Configuration的set()方法,只适合数据内容比较小的场景
  2. 将缓存文件放在HDFS上,每次都去读取,效率比较低
  3. 将缓存文件放在DistributedCache里,在setup()初始化一次后,即可多次使用,缺点是不支持修改操作,仅能读取 

DistributedCache是Hadoop提供的文件缓存机制,使得一个job的所有map或reduce可以访问同一份文件。在任务提交后,hadoop自动将指定的文件分发到各个节点,并缓存到本地目录,供用户程序读取使用。

具有以下特点:

  • 缓存的文件是只读的,修改这些文件内容没有意义
  • 用户可以调整文件可见范围(比如只能用户自己使用,所有用户都可以使用等),进而防止重复拷贝现象
  • 按需拷贝,文件是通过HDFS作为共享数据中心分发到各节点的,且只发给任务被调度到的节点

命令行使用方式:

  1. -files:将指定的 本地/hdfs 文件分发到各个Task的工作目录下,不对文件进行任何处理
  2. -archives:将指定文件分发到各个Task的工作目录下,并对名称后缀为“.jar”、“.zip”,“.tar.gz”、“.tgz”的文件自动解压。默认情况下,解压后的内容存放到工作目录下名称为解压前文件名的目录中,比如压缩包为dict.zip,则解压后内容存放到目录dict.zip中。为此,你可以给文件起个别名/软链接,比如dict.zip#dict,这样,压缩包会被解压到目录dict中。
  3. -libjars:指定待分发的jar包,Hadoop将这些jar包分发到各个节点上后,会将其自动添加到任务的CLASSPATH环境变量中。
  4. 若缓存文件在Linux本地目录,则Job提交之后,首先将缓存文件上传到HDFS的某一目录下,再分发到各个节点上的,因此,HDFS是缓存文件的必经之路。

API使用方法:

  • 在hdfs上准备好要共享的数据(text/jar/archive),这是因为缓存文件的默认访问协议为(hdfs://)
  • 通过 job.addCacheFile(new Path(args[0]).toUri()); 方法加载缓存文件。
  • 在Mapper类的setup()方法中对缓存文件进行初始化
  • 在map()和reduce()方法中,可以使用处理后的缓存文件

需要注意的地方:

  1. 使用DistributedCache的Job要打包成jar包在集群上运行,Local模式会报错!!!
  2. setup()方法的解析,很重要。

 

        @Override
        protected void setup(Context context) throws IOException, InterruptedException {            

            BufferedReader br=null;        // 读取文件流
            String line;

            /**
             *  DistributedCache分发缓存文件后,各个节点
             *  首先,将缓存文件从hdfs上拷贝到本地磁盘
             *  然后,在setup()中对缓存文件进行初始化
         *  最后,在map()或reduce()方法中使用处理后的缓存文件
             */      
            //path是linux文件系统中的路径
            Path[] paths = context.getLocalCacheFiles();

            for(Path path : paths){
                if(path.toString().indexOf("address.txt") >= 0){        //如果是 address文件 
                    
            //如果是 Local模式,则会找不到缓存文件,而报错
            br=new BufferedReader(new FileReader(path.toString()));                        

                    while((line=br.readLine()) != null){    //读取文件中的每一行
                        String[] splited = line.split("\t");

                        map.put(splited[0], splited[1]);    //将小表解析成 key/value 存放进map
                    }
                }
            }
        } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值