本文是对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. Python全栈day14(字符串格式化)

    一,%字符串格式化 1,使用%s 后面一一对应输入对应的字符串,%s可以接受任何参数 print ("I am %s hobby is zhangsan"%'lishi') pri ...

  2. Javaweb Tomcat 项目部署方式

    一.静态部署 1.直接将web项目文件件拷贝到webapps 目录中     Tomcat的Webapps目录是Tomcat默认的应用目录,当服务器启动时,会加载所有这个目录下的应用.所以可以将JSP ...

  3. Storm-源码分析-Topology Submit-Nimbus

    Nimbus Server Nimbus server, 首先从启动命令开始, 同样是使用storm命令"storm nimbus"来启动 看下源码, 此处和上面client不同, ...

  4. d3.js:数据可视化利器之 修改文档:DOM操作符

    style: CSS样式操作符 style()操作符用来设置或获取选择集中各DOM元素的CSS样式: selection.style(name[,value[,priority]]) style()操 ...

  5. Period---hdu1358(循环节 kmp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1358 题意 :求给你个串,前i位子串由某个字符串重复k次得到,求所有的i和k(k>1); 例如: ...

  6. qemu网络虚拟化之数据流向分析三

    2016-09-27 前篇文章通过分析源代码,大致描述了各个数据结构之间的关系是如何建立的,那么今天就从数据包的角度,分析下数据包是如何在这些数据结构中间流转的! 这部分内容需要结合前面两篇文章来看, ...

  7. 【我的Android进阶之旅】Jenkins挂载slave节点,增强分布式编译的效率

    由于公司的Jenkins任务越来越多,而且所有的Android Jenkins任务都在同一台服务器上进行编译,而且该服务器配置Jenkins任务最多3个任务同时运行,所以有时候大家一起编译的时候,只能 ...

  8. 【我的Android进阶之旅】解决Center OS 64位系统编译Android APP报错error=2和finished with non-zero exit value 127

    一.错误描述 1.问题 java.io.IOException: error=2, 没有那个文件或目录 今天在刚重新搭建好的64位的Center OS上安装好了Android SDK,Jenkins, ...

  9. 现有mysql加入redis

    spring-dao.xml(注意这里必须加上ignore-unresolvedable): redis.properties: redis.hostname=192.168.1.3 redis.po ...

  10. notepad插件:url变成可以点击的连接