mapreduce 全局变量共享

在编写MapReduce程序时,经常会遇到这样的问题,全局变量如何保存?如何让每个处理都能获取保存的这些全局变量?使用全局变量是不可避免的,但是 在MapRdeuce中直接使用代码级别的全局变量是不现实的。主要是因为继承Mapper基类的Map阶段类的运行和继承Reducer基类的 Reduce阶段类的运行都是独立的,并不共享一个Java虚拟机的资源,因此,下面介绍三种在MapReduce编程中相对有效的设置全局共享数据的方 法。

1,读写HDFS文件

在MapReduce框架中,Map Task和Reduce Task都运行在Hadoop集群的节点上,所以Map和Reduce Task、甚至不同的Job都可以通过读写HDFS中预定好的同一文件来实现全局共享数据。具体实现是利用Hadoop 的Java API来完成,需要注意的是,多个Map或Reduce的写操作会产生冲突,覆盖原有数据。

这种方法的优点是能够实现读写,也比较直观,但是缺点是需要共享一些很小的全局数据也需要使用IO,这将占用系统资源,增加作业完成的资源消耗。

2,配置Job属性

在MapReduce执行过程中,task可以读取Job的属性。基于这个特性,我们可以在任务启动之初利用Configuration类中的 set(String name,String value)将一些简单的全局数据封装到作业的配置属性中,然后task再利用Configuration中的get(String name)获取配置到属性中的全局数据。

这种方法的优点是简单,资源消耗小,但是对量比较大的共享数据显得比较无力。(个人推荐这种)

3,使用DistributedCache

DistributedCache是MapReduce为应用提供缓存文件的只读工具,它可以缓存文本文件,压缩文件和jar文件等。在使用时,用户可以 在作业配置中使用本地或HDFS文件的URL来将其设置成共享缓存文件。在作业启动之后和task启动之前,MapReduce框架会将可能需要的缓存文 件复制到执行任务节点的本地。

这种方法的优点是每个Job共享文件只会子啊启动之后复制一次,并且它适用与大量的共享数据,而缺点是它是只读的。

下面是一个简单的使用DistributedCache的例子。

1)将要缓存的文件复制到HDFS上

bin/hadoop fs -copyFromLocal lookup /myapp/lookup

2)启动作业的属性配置,并设置待缓存文件

Configuration conf =new Configuration();
DistributedCache.addCacheFile(newURL("/myapp/lookup #lookup"),conf);

3)在Map函数中使用DistributedCache

publicstatic class  Map extendsMapper<Object, Text, Text,Text>{

privatePath[] localArchives;

privatePah[] localFiles;

publicvoid setup(Context context) throws IOException,InterruptedException{

//获取缓存文件

Configuration conf =new Configuration();

localArchives = DistributedCache.getLocalCacheArchives(conf);

localFiles = DistributedCache.getLocalCacheFiles(conf);

}

publicvoid map(K key, V value, Context context)throwsIOException{

//使用缓存文件中获取的数据

...

Context.collect(k,v);

}

}

转载:https://www.cnblogs.com/qquan/articles/4923058.html

 

mapreduce 变量共享的更多相关文章

  1. 如何在Exe和BPL插件中实现公共变量共享及窗口溶入技术Demo源码

    如何在Exe和BPL插件中实现公共变量共享及窗口溶入技术Demo源码 1.Delphi编译方式介绍: 当我们在开发一个常规应用程序时,Delphi可以让我们用两种方式使用VCL,一种是把VCL中的申明 ...

  2. TensorFlow学习笔记3——变量共享

    因为最近在研究生成对抗网络GAN,在读别人的代码时发现了 with tf.variable_scope(self.name_scope_conv, reuse = reuse): 这样一条语句,查阅官 ...

  3. c++ 变量共享内存-联合(union)

    共享内存极少使用,所以这里我们仅作了解. .将几个变量放在相同的内存区,但其中只有一个变量在给定时刻有有效值. .程序处理许多不同类型的数据,但是一次只处理一种.要处理的类型在执行期间才能确定. .在 ...

  4. TF Boys (TensorFlow Boys ) 养成记(三): TensorFlow 变量共享

    上次说到了 TensorFlow 从文件读取数据,这次我们来谈一谈变量共享的问题. 为什么要共享变量?我举个简单的例子:例如,当我们研究生成对抗网络GAN的时候,判别器的任务是,如果接收到的是生成器生 ...

  5. 多线程篇四:ThreadLocal实现线程范围内变量共享

    1.static实现线程范围内变量共享 package com.test.shareData; import java.util.Random; /** * 多线程范围内的数据共享 * @author ...

  6. TensorFlow学习笔记4——变量共享

    因为最近在研究生成对抗网络GAN,在读别人的代码时发现了 with tf.variable_scope(self.name_scope_conv, reuse = reuse): 这样一条语句,查阅官 ...

  7. TensorFlow 使用变量共享

    参考: https://www.tensorflow.org/programmers_guide/variable_scope 举例说明 TensorFlow中的变量一般就是模型的参数.当模型复杂的时 ...

  8. 页面中多个script块之间方法与变量共享问题

    JS是按照代码块来进行编译和执行的,代码块间相互独立,但变量和方法共享,按顺序执行. 如: <script type='text/javascript'> var m = 0,n = 1, ...

  9. java用匿名内部类实现多线程堆内存变量共享

    匿名内部类介绍:http://www.cnblogs.com/nerxious/archive/2013/01/25/2876489.html 用Runnable模拟实现共享堆内存变量 import ...

随机推荐

  1. Exif认识

    找到一个js获取Exif的信息.php的也很简单.打开扩展就可以直接读了.也支持url的 这个是js的 http://code.ciaoca.com/javascript/exif-js/ EXIF ...

  2. python3 + robotframework ride 乱码问题

    执行ride时乱码问题 如果被执行的文件所在路径中含有中文,执行时可能会报如下错误 robotframework版本:robotframework-ride 1.7.3.1python 3.7.3 解 ...

  3. http 307重定向

    刚才在做hexo页面优化,发现了本地测试返回http 307.以前没见过这个响应码,于是做一下调研. 相关文章: hexo页面优化 http 307 在rfc规范中,http 307 Temporar ...

  4. 记录前端开发vue常见问题,不断更新

    1.点击刷新当天组件 1.可以在query中添加一个时间戳,缺点就是不好看 2.加一个重定向页面redirect页面,然后在beforecreate时this.$router.replace原路径 2 ...

  5. kingbase常用语句

    1. 查询数据库名 # select * from SYS_DATABASE; 2. 查询模式名 # select * from SYS_NAMESPACE; 3. 查询表空间 # select * ...

  6. SpringBoot2.0整合fastjson的正确姿势

            SpringBoot2.0如何集成fastjson?在网上查了一堆资料,但是各文章的说法不一,有些还是错的,可能只是简单测试一下就认为ok了,最后有没生效都不知道.恰逢公司项目需要将J ...

  7. 02篇ELK日志系统——升级版集群之kibana和logstash的搭建整合

    [ 前言:01篇LK日志系统已经把es集群搭建好了,接下来02篇搭建kibana和logstash,并整合完成整个ELK日志系统的初步搭建. ] 1.安装kibana 3台服务器: 192.168.2 ...

  8. notepad++ 设置运行python脚本

    按F5 在输入框中输入: cmd /k python “$(FULL_CURRENT_PATH)” &PAUSE & EXIT python路径必须在环境变量中. 否则需要输入完整的p ...

  9. C# Net 去除图片白边

    代码根据别人的进行改写,效果更好 直接拷贝使用 名称空间: using System.Drawing; 代码: /// <summary> /// 裁剪图片(去掉百边) /// </ ...

  10. python数据类型之二

    列表 list #定义:[]内可以有多个任意类型的值,逗号分隔 基本语法 # 定义:[]内可以有多个任意类型的值,逗号分隔 # my_girl_friends=['alex','wupeiqi','y ...