本文是对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") >= ){ //如果是 address文件             //如果是 Local模式,则会找不到缓存文件,而报错
            br=new BufferedReader(new FileReader(path.toString())); while((line=br.readLine()) != null){ //读取文件中的每一行
String[] splited = line.split("\t"); map.put(splited[], splited[]); //将小表解析成 key/value 存放进map
}
}
}

分布式缓存DistributedCache的更多相关文章

  1. hadoop中的分布式缓存——DistributedCache

    分布式缓存一个最重要的应用就是在进行join操作的时候,如果一个表很大,另一个表很小很小,我们就可以将这个小表进行广播处理,即每个计算节点 上都存一份,然后进行map端的连接操作,经过我的实验验证,这 ...

  2. 分布式缓存DistributedCache的使用

    分布式缓存用于将使用的小文件首先分发到各个datanode节点上,然后利用map/reduce阶段的setup()方法将文件内容读入内存,加快程序执行.具体实现方法如下: http://demievi ...

  3. .Net Core 跨平台开发实战-服务器缓存:本地缓存、分布式缓存、自定义缓存

    .Net Core 跨平台开发实战-服务器缓存:本地缓存.分布式缓存.自定义缓存 1.概述 系统性能优化的第一步就是使用缓存!什么是缓存?缓存是一种效果,就是把数据结果存在某个介质中,下次直接重用.根 ...

  4. 9.3.1 map端连接- DistributedCache分布式缓存小数据集

    1.1.1         map端连接- DistributedCache分布式缓存小数据集 当一个数据集非常小时,可以将小数据集发送到每个节点,节点缓存到内存中,这个数据集称为边数据.用map函数 ...

  5. Hadoop DistributedCache分布式缓存的使用

    做项目的时候遇到一个问题,在Mapper和Reducer方法中处理目标数据时,先要去检索和匹配一个已存在的标签库,再对所处理的字段打标签.因为标签库不是很大,没必要用HBase.我的实现方法是把标签库 ...

  6. Hadoop 之 分布式缓存的原理和方法——DistributedCache

    1.什么时Hadoop的分布式缓存 答:在执行MapReduce时,可能Mapper之间需要共享一些信息,如果信息量不大,可以将其从HDFS中加载到内存中,这就是Hadoop分布式缓存机制. 2.如何 ...

  7. .net 分布式架构之分布式缓存中间件

    开源git地址: http://git.oschina.net/chejiangyi/XXF.BaseService.DistributedCache 分布式缓存中间件  方便实现缓存的分布式,集群, ...

  8. 一个技术汪的开源梦 —— 公共组件缓存之分布式缓存 Redis 实现篇

    Redis 安装 & 配置 本测试环境将在 CentOS 7 x64 上安装最新版本的 Redis. 1. 运行以下命令安装 Redis $ wget http://download.redi ...

  9. hadoop 分布式缓存

    Hadoop 分布式缓存实现目的是在所有的MapReduce调用一个统一的配置文件,首先将缓存文件放置在HDFS中,然后程序在执行的过程中会可以通过设定将文件下载到本地具体设定如下: public s ...

随机推荐

  1. Boss Group Worker Group NioEventLoopGroup

    宜人贷蜂巢API网关技术解密之Netty使用实践 - honeycomb2017的博客 - CSDN博客 https://blog.csdn.net/honeycomb2017/article/det ...

  2. Android Studio升级后报 method not found: 'runProguard'的错误

    今天升级了下Android Studio,然后发现更新gradle,然后在sync项目的时候总是报  method not found: 'runProguard'的错误 找了很多发现不对. 最后解决 ...

  3. 并发编程 - io模型 - 总结

    1.提交任务得方式: 同步:提交完任务,等结果,执行下一个任务 异步:提交完,接着执行,异步 + 回调 异步不等结果,提交完任务,任务执行完后,会自动触发回调函数2.同步不等于阻塞: 阻塞:遇到io, ...

  4. GITLAB服务基础

    1.GITLAB介绍 一个基于GIT的源码托管解决方案基于Ruby on rails开发集成了nginx postgreSQL redis sidekiq等组件 2. 资源 官网:https://ab ...

  5. log4cpp简单示例

    log4cpp简单示例 下载地址 Sample.cpp #include <iostream> #include <log4cpp/FileAppender.hh> #incl ...

  6. Apache mahout 源码阅读笔记--协同过滤, PearsonCorrelationSimilarity

    协同过滤源码路径: ~/project/javaproject/mahout-0.9/core/src $tree main/java/org/apache/mahout/cf/taste/ -L 2 ...

  7. Flask与pyaudio实现音频数据流的传输(电话会议语音交互式应用)

    1.声卡设备验证 #查看音频设备 dong@dong-ubuntu:~$ arecord -l**** CAPTURE 硬體裝置清單 ****card 0: PCH [HDA Intel PCH], ...

  8. linux内核源代码、配置与编译

    内核源代码下载:www.kernel.org Linux内核源代码采用树形结构进行组织,非常合理地把功能相关的文件都放在同一个子目录下,使得程序更具可读性. linux内核代码最好不要在windows ...

  9. 一道仅有7人通过的超5星微软比赛题目-------解题思路&优秀代码分享,邀你来“找茬儿”

    6月23日英雄会平台发布了一道难度为超5星的微软比赛题目,截止活动结束共有300多名编程爱好者参与线上答题,而最终通过者仅有7人,通过率仅为2%.为什么成绩如此出人意料?是因为题目的英文描述难以理解? ...

  10. spark[源码]-TaskSchedulerlmpl类源码

    TaskSchedulerImpl概述 TaskSchedulerlmpl是创建三大核心TaskSheduler的实现类,TaskScheduler是一个特征类,DAGScheduler在提交Task ...