MapReduce中的分布式缓存使用

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq1010885678/article/details/50751007 MapReduce中的分布式缓存使用@(Hadoop)简介DistributedCache是Hadoop为MapReduce框架提供的一种分布式缓存机制,它会将需要缓存的文件分发到各个执行任务的子节点的机器中,各个节点可以自行读取本地文件系统上的数据进行处理。
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq1010885678/article/details/50751007

MapReduce中的分布式缓存使用

@(Hadoop)


简介

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

符号链接

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

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

File file = new File("somename");

来获得这个文件

缓存在本地的目录设置

以下为默认值:

<property>
  <name>mapred.local.dir</name>
  <value>${hadoop.tmp.dir}/mapred/localdir/filecache</value>
</property>

<property>
  <name>local.cache.size</name>
  <value>10737418240</value> 
</property>

应用场景

1.分发第三方库(jar,so等)
2.共享一些可以装载进内存的文件
3.进行类似join连接时,小表的分发

使用方式

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

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

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

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

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

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

@Override
    protected void setup(Context context) throws IOException, InterruptedException {
        super.setup(context);
        if (context.getCacheFiles() != null && context.getCacheFiles().length > 0) {
        String path = context.getLocalCacheFiles()[0].getName();
        File itermOccurrenceMatrix = new File(path);
        FileReader fileReader = new FileReader(itermOccurrenceMatrix);
        BufferedReader bufferedReader = new BufferedReader(fileReader);
        String s;
        while ((s = bufferedReader.readLine()) != null) {
            //TODO:读取每行内容进行相关的操作
        }
        bufferedReader.close();
        fileReader.close();
    }
}

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

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

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

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

注意事项

1.需要分发的文件必须是存储在HDFS上了
2.文件只读
3.不缓存太大的文件,执行task之前对进行文件的分发,影响task的启动速度

作者:@小黑

相关文章
|
25天前
|
分布式计算 资源调度 Hadoop
在YARN集群上运行部署MapReduce分布式计算框架
主要介绍了如何在YARN集群上配置和运行MapReduce分布式计算框架,包括准备数据、运行MapReduce任务、查看任务日志,并启动HistoryServer服务以便于日志查看。
34 0
|
28天前
|
缓存 分布式计算 Java
详细解读MapReduce框架中的分布式缓存
【8月更文挑战第31天】
17 0
|
4月前
|
分布式计算 资源调度 Hadoop
MapReduce分布式编程
MapReduce分布式编程
54 1
|
4月前
|
分布式计算 Hadoop
Hadoop系列 mapreduce 原理分析
Hadoop系列 mapreduce 原理分析
69 1
|
3月前
|
分布式计算 Hadoop Java
Hadoop MapReduce编程
该教程指导编写Hadoop MapReduce程序处理天气数据。任务包括计算每个城市ID的最高、最低气温、气温出现次数和平均气温。在读取数据时需忽略表头,且数据应为整数。教程中提供了环境变量设置、Java编译、jar包创建及MapReduce执行的步骤说明,但假设读者已具备基础操作技能。此外,还提到一个扩展练习,通过分区功能将具有相同尾数的数字分组到不同文件。
45 1
|
3月前
|
数据采集 SQL 分布式计算