分布式缓存DistributedCache
本文是对MR案例:Map-Join的解读。
在hadoop中,共享全局变量或全局文件的几种方法
- 使用Configuration的set()方法,只适合数据内容比较小的场景
- 将缓存文件放在HDFS上,每次都去读取,效率比较低
- 将缓存文件放在DistributedCache里,在setup()初始化一次后,即可多次使用,缺点是不支持修改操作,仅能读取
DistributedCache是Hadoop提供的文件缓存机制,使得一个job的所有map或reduce可以访问同一份文件。在任务提交后,hadoop自动将指定的文件分发到各个节点,并缓存到本地目录,供用户程序读取使用。
具有以下特点:
- 缓存的文件是只读的,修改这些文件内容没有意义
- 用户可以调整文件可见范围(比如只能用户自己使用,所有用户都可以使用等),进而防止重复拷贝现象
- 按需拷贝,文件是通过HDFS作为共享数据中心分发到各节点的,且只发给任务被调度到的节点
命令行使用方式:
- -files:将指定的 本地/hdfs 文件分发到各个Task的工作目录下,不对文件进行任何处理
- -archives:将指定文件分发到各个Task的工作目录下,并对名称后缀为“.jar”、“.zip”,“.tar.gz”、“.tgz”的文件自动解压。默认情况下,解压后的内容存放到工作目录下名称为解压前文件名的目录中,比如压缩包为dict.zip,则解压后内容存放到目录dict.zip中。为此,你可以给文件起个别名/软链接,比如dict.zip#dict,这样,压缩包会被解压到目录dict中。
- -libjars:指定待分发的jar包,Hadoop将这些jar包分发到各个节点上后,会将其自动添加到任务的CLASSPATH环境变量中。
- 若缓存文件在Linux本地目录,则Job提交之后,首先将缓存文件上传到HDFS的某一目录下,再分发到各个节点上的,因此,HDFS是缓存文件的必经之路。
API使用方法:
- 在hdfs上准备好要共享的数据(text/jar/archive),这是因为缓存文件的默认访问协议为(hdfs://)
- 通过 job.addCacheFile(new Path(args[0]).toUri()); 方法加载缓存文件。
- 在Mapper类的setup()方法中对缓存文件进行初始化
- 在map()和reduce()方法中,可以使用处理后的缓存文件
需要注意的地方:
- 使用DistributedCache的Job要打包成jar包在集群上运行,Local模式会报错!!!
- 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的更多相关文章
- hadoop中的分布式缓存——DistributedCache
分布式缓存一个最重要的应用就是在进行join操作的时候,如果一个表很大,另一个表很小很小,我们就可以将这个小表进行广播处理,即每个计算节点 上都存一份,然后进行map端的连接操作,经过我的实验验证,这 ...
- 分布式缓存DistributedCache的使用
分布式缓存用于将使用的小文件首先分发到各个datanode节点上,然后利用map/reduce阶段的setup()方法将文件内容读入内存,加快程序执行.具体实现方法如下: http://demievi ...
- .Net Core 跨平台开发实战-服务器缓存:本地缓存、分布式缓存、自定义缓存
.Net Core 跨平台开发实战-服务器缓存:本地缓存.分布式缓存.自定义缓存 1.概述 系统性能优化的第一步就是使用缓存!什么是缓存?缓存是一种效果,就是把数据结果存在某个介质中,下次直接重用.根 ...
- 9.3.1 map端连接- DistributedCache分布式缓存小数据集
1.1.1 map端连接- DistributedCache分布式缓存小数据集 当一个数据集非常小时,可以将小数据集发送到每个节点,节点缓存到内存中,这个数据集称为边数据.用map函数 ...
- Hadoop DistributedCache分布式缓存的使用
做项目的时候遇到一个问题,在Mapper和Reducer方法中处理目标数据时,先要去检索和匹配一个已存在的标签库,再对所处理的字段打标签.因为标签库不是很大,没必要用HBase.我的实现方法是把标签库 ...
- Hadoop 之 分布式缓存的原理和方法——DistributedCache
1.什么时Hadoop的分布式缓存 答:在执行MapReduce时,可能Mapper之间需要共享一些信息,如果信息量不大,可以将其从HDFS中加载到内存中,这就是Hadoop分布式缓存机制. 2.如何 ...
- .net 分布式架构之分布式缓存中间件
开源git地址: http://git.oschina.net/chejiangyi/XXF.BaseService.DistributedCache 分布式缓存中间件 方便实现缓存的分布式,集群, ...
- 一个技术汪的开源梦 —— 公共组件缓存之分布式缓存 Redis 实现篇
Redis 安装 & 配置 本测试环境将在 CentOS 7 x64 上安装最新版本的 Redis. 1. 运行以下命令安装 Redis $ wget http://download.redi ...
- hadoop 分布式缓存
Hadoop 分布式缓存实现目的是在所有的MapReduce调用一个统一的配置文件,首先将缓存文件放置在HDFS中,然后程序在执行的过程中会可以通过设定将文件下载到本地具体设定如下: public s ...
随机推荐
- document.selection window.getSelection()
IE9以下支持:document.selection IE9.Firefox.Safari.Chrome和Opera支持:window.getSelection() 屏幕取词 function ge ...
- JavaWeb基于session和cookie的数据共享
在了解session和cookie技术之前,我们需要先了解一下什么是会话?会话可以简单理解为用户打开一个浏览器,点击多个超链接,访问服务器的多个web资源,然后关闭浏览器,整个过程称为一个会话.这样, ...
- 前端开发 - JQuery - 中
十四.jquery属性操作 attr prop <!DOCTYPE html> <html lang="en"> <head> <meta ...
- Django 框架之Form组件
1. Django的Form主要具有以下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交的数据 初始化页面显示内容 2. 第一个案例: # 第一步: 创建 ...
- 优秀Python学习资源收集汇总--强烈推荐(转)
原文:http://www.cnblogs.com/lanxuezaipiao/p/3543658.html Python是一种面向对象.直译式计算机程序设计语言.它的语法简捷和清晰,尽量使用无异义的 ...
- (0.2)linux下Mysql的安装配置与管理入门(目录篇)
本章学习内容: 1.基于Linux平台的Mysql项目场景介绍 1.1.互联网各类网站.购物网站.门户网站.博客系统.IDC,云平台,VPS,虚拟主机空间,论坛,嵌入式. 2.mysql数据库运行环境 ...
- db-mysql-001- 语句备份表
1.备份表 CREATE TABLE AAbak( SELECT * FROM AA ); 2.两个已存在表导数据 INSERT INTO AAbak(c1,c2) SELECT c1,c2 FROM ...
- [笔记]mosh使用笔记
听说mosh好使,那么怎么在Mac本下使用mosh来登录Ubuntu及AWS服务器呢? mosh介绍 mosh官网在:https://mosh.org/ 代码开源在:https://github.co ...
- JPush相关概念
JPush相关概念 连接极光服务器前提 在连接极光服务器之前需要先将APP进行注册,连接Server时需要用到下发的两个字段:AppKey:应用唯一标识.Master Secret:服务器秘钥,用于服 ...
- 【源码分享】仿网易客户端源码效果 apkbus的~
http://www.apkbus.com/forum.php?mod=viewthread&tid=184867 内容我就不说了,直接点开看吧.