MapReduce Job 全局共享数据

MapReduce Job 全局共享数据:

    编写MapReduce代码时候,全局变量应该如何保存?如何让每个处理器都能获取保存的这些全局变量?
    由于在MapReduce中直接使用代码的全局变量是不可行的,因为继承Mapper基类的Map阶段类的运行和继承Reducer基类的Reduce阶段类的运行都是独立的。并不像代码那样看起来像是共享同一个java虚拟机的资源。下面有几种方法有效是遏制全局共享数据的方法。
**1. 读写HDFS文件。**
    在mapreduce框架中,map task和reduce task 都运行在Hadoop集群的节点上。所以map task 和reduce task 甚至是不同的jiob都可以通过读写hdfs中预定好的同一个文件来实现全局共享数据。具体是ianshi利用hadoop的java API(《Hadop实战》第九章)来完成。需要注意的是多个map或reduce的写操作会产生冲突,覆盖原有的数据。
     **优点是:能实现读写,也比较直观。
     缺点是:要共享一些很小的全局数据也要使用I/O,这将会占用系统资源,增加作业完成的资源耗费。**

**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 -copuFromLocl lookup /myapp/lookup

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

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

3)在Map函数中使用DistributedCache。

public static class Map extends Mapper<object,Text,Text,Text>{
  private Path[] localArchives;
  private Path[] localFiles;
  public void setup(Context context) throws IOException,InterruptedException{
  //获取缓存文件
   Configuration conf=context.getConfiguration();
   localArchives = DistributedCache.getLocalCacheArchives(conf);
  }

  public void map(K kjey, V value, Context context) throws IOException
  {
   //使用从缓冲文件中获取的数据
   //
   //
   Context.collect(k,v);
  }
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值