MapReduce中的分布式缓存使用

@(Hadoop)


简介

DistributedCache是Hadoop为MapReduce框架提供的一种分布式缓存机制,它会将需要缓存的文件分发到各个执行任务的子节点的机器中,各个节点可以自行读取本地文件系统上的数据进行处理。

符号链接

可以同在原本HDFS文件路径上+”#somename”来设置符号连接(相当于一个快捷方式)

这样在MapReduce程序中可以直接通通过:

  1. File file = new File("somename");

来获得这个文件

缓存在本地的目录设置

以下为默认值:

  1. <property>
  2. <name>mapred.local.dir</name>
  3. <value>${hadoop.tmp.dir}/mapred/localdir/filecache</value>
  4. </property>
  5. <property>
  6. <name>local.cache.size</name>
  7. <value>10737418240</value>
  8. </property>

应用场景

1.分发第三方库(jar,so等)

2.共享一些可以装载进内存的文件

3.进行类似join连接时,小表的分发

使用方式

旧版本的DistributedCache已经被注解为过时,以下为Hadoop-2.2.0以上的新API接口,测试的Hadoop版本为2.7.2。

  1. Job job = Job.getInstance(conf);
  2. //将hdfs上的文件加入分布式缓存
  3. job.addCacheFile(new URI("hdfs://url:port/filename#symlink"));

由于新版API中已经默认创建符号连接,所以不需要再调用setSymlink(true)方法了,可以通过

  1. System.out.println(context.getSymlink());

来查看是否开启了创建符号连接。

之后在map/reduce函数中可以通过context来访问到缓存的文件,一般是重写setup方法来进行初始化:

  1. @Override
  2. protected void setup(Context context) throws IOException, InterruptedException {
  3. super.setup(context);
  4. if (context.getCacheFiles() != null && context.getCacheFiles().length > 0) {
  5. String path = context.getLocalCacheFiles()[0].getName();
  6. File itermOccurrenceMatrix = new File(path);
  7. FileReader fileReader = new FileReader(itermOccurrenceMatrix);
  8. BufferedReader bufferedReader = new BufferedReader(fileReader);
  9. String s;
  10. while ((s = bufferedReader.readLine()) != null) {
  11. //TODO:读取每行内容进行相关的操作
  12. }
  13. bufferedReader.close();
  14. fileReader.close();
  15. }
  16. }

得到的path为本地文件系统上的路径。

这里的getLocalCacheFiles方法也被注解为过时了,只能使用context.getCacheFiles方法,和getLocalCacheFiles不同的是,getCacheFiles得到的路径是HDFS上的文件路径,如果使用这个方法,那么程序中读取的就不再试缓存在各个节点上的数据了,相当于共同访问HDFS上的同一个文件。

可以直接通过符号连接来跳过getLocalCacheFiles获得本地的文件。

单机安装的hadoop没有通过,提示找不到该文件,待在集群上进行测试。

注意事项

1.需要分发的文件必须是存储在HDFS上了

2.文件只读

3.不缓存太大的文件,执行task之前对进行文件的分发,影响task的启动速度

作者:@小黑

MapReduce中的分布式缓存使用的更多相关文章

  1. 在mapreduce中做分布式缓存的问题

    一.问题描述: 主要解决一个问题,就是两个表做join,两个表都够大,单个表都无法装入内存. 怎么做呢?思路就是对做join的字段做排序两个表都排序,然后针对一个表a逐行读取,希望能够在内存中加载到另 ...

  2. .NET Core应用中使用分布式缓存及内存缓存

    .NET Core针对缓存提供了很好的支持 ,我们不仅可以选择将数据缓存在应用进程自身的内存中,还可以采用分布式的形式将缓存数据存储在一个“中心数据库”中.对于分布式缓存,.NET Core提供了针对 ...

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

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

  4. .net core中的分布式缓存和负载均衡

    通过减少生成内容所需的工作,缓存可以显著提高应用的性能和可伸缩性,缓存对不经常更改的数据效果最佳,缓存生成的数据副本的返回速度可以比从原始源返回更快.ASP.NET Core 支持多种不同的缓存,最简 ...

  5. (转)C# 中使用分布式缓存系统Memcached

    转自:http://blog.csdn.net/devgis/article/details/8212917 缘起: 在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了 ...

  6. Redis中的Java分布式缓存

    为什么在分布式Java应用程序中使用缓存?今天学习了两节优锐课讲解分布式缓存的内容,收获颇多,分享给大家. 在提高应用程序的速度和性能时,每毫秒都是至关重要的.例如,根据Google的一项研究,如果网 ...

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

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

  8. Asp.Net Core 轻松学-正确使用分布式缓存

    前言     本来昨天应该更新的,但是由于各种原因,抱歉,让追这个系列的朋友久等了.上一篇文章 在.Net Core 使用缓存和配置依赖策略 讲的是如何使用本地缓存,那么本篇文章就来了解一下如何使用分 ...

  9. ASP.Net Core使用分布式缓存Redis从入门到实战演练

    一.课程介绍 人生苦短,我用.NET Core!缓存在很多情况下需要用到,合理利用缓存可以一方面可以提高程序的响应速度,同时可以减少对特定资源访问的压力.  所以经常要用到且不会频繁改变且被用户共享的 ...

随机推荐

  1. 在C#中使用CURL

    private string args = "";          /// <summary>         /// 参数         /// </sum ...

  2. HDU 6186 CS Course

    保存前缀后缀. 保存一下前缀和后缀,去掉第$i$个位置,就是$L[i-1]$和$R[i+1]$进行运算. #include<bits/stdc++.h> using namespace s ...

  3. Java变量和运算符

    1.变量 变量概述 什么是变量?变量是一个内存中的小盒子(小容器),容器是什么?生活中也有很多容器,例如水杯是容器,用来装载水:你家里的大衣柜是容器,用来装载衣裤:饭盒是容器,用来装载饭菜.那么变量是 ...

  4. am335xSD卡启动--文件系统制作

    1.网上下载busybox工具https://busybox.net/downloads/ 2.根据此文章提示制作自己的跟文件系统 链接: https://pan.baidu.com/s/1bp6GK ...

  5. 【Java虚拟机】JVM学习笔记之GC

    JVM学习笔记二之GC GC即垃圾回收,在C++中垃圾回收由程序员自己来做,例如可以用free和delete来回收对象.而在Java中,JVM替程序员来执行垃圾回收的工作,下面看看GC的详细原理和执行 ...

  6. FastReport.Net使用:[8]交叉表一

    1.绘制报表标题,交叉表可以直接放在标题栏内. 2.拖动一交叉表控件到标题栏内. 3.设置交叉表的行列信息. 将Tabel中的[科室名称]列拖到交叉表的列上以创建列,将Tabel中的[姓名]列拖到交叉 ...

  7. 【BZOJ 4229】 4229: 选择 (线段树+树链剖分)

    4229: 选择 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 67  Solved: 41 Description 现在,我想知道自己是否还有选择. ...

  8. manacher算法求最长回文子序列

    一:背景 给定一个字符串,求出其最长回文子串.例如: s="abcd",最长回文长度为 1: s="ababa",最长回文长度为 5: s="abcc ...

  9. [BZOJ4890][TJOI2017]城市(DP)

    题目描述 从加里敦大学城市规划专业毕业的小明来到了一个地区城市规划局工作.这个地区一共有ri座城市,<-1条高速公路,保证了任意两运城市之间都可以通过高速公路相互可达,但是通过一条高速公路需要收 ...

  10. BZOJ3238 [Ahoi2013]差异 SA+单调栈

    题面 戳这里 题解 考虑把要求的那个东西拆开算,前面一个东西像想怎么算怎么算,后面那个东西在建出\(height\)数组后相当于是求所有区间\(min\)的和*2,单调栈维护一波即可. #includ ...