Hadoop 中的 (side data) 边数据

一、用途

  边数据是作业所需的额外的只读数据,通常用来辅助主数据集;

二、方法

1、利用Configuration类来配置,利用setter()和getter()可方便的使用,方便存储一些基本的类型;

2、分布式缓存:

相比这下,分布式缓存更灵活,它能在任务运行过程中及时地将文件和存档复制到任务节点以供使用;

通常每个作业中,各个文件只需复制到一个节点一次。

原理:

  当启动一个作业时,Hadoop会把由-files -archives -libjars添加的文件复制到分布式文件系统HDFS;

  在任务运行之前,tasktracker 将文件从分布式文件系统复制到本地磁盘(缓存)使任务去访问到;

用法:

  1、使用命令行参数,GenericOptionsParser可对命令行参数进行解析:

      使用-files选项指定待分发文件,文件内参数包含以逗号隔开的URL列表。文件可以存放在本地文件系统/HDFS/S3等;默认是本地文件系统;

      使用-archives 选项向自己的任务中复制存档文件(jar, zip, tar 等),这些文件会被解档到任务节点。

      使用 -libjars 选项会把jar文件添加到mapper和 reducer任务的classpath类路径中   

% hadoop jar hadoop-examples.jar MaxTemperatureByStationNameUsingDistributedCacheFile \
-files input/ncdc/metadata/stations-fixed-width.txt input/ncdc/all output

//在作业代码中能直接获取到“ stations-fixed-width.txt ”文件
static class MaxTemperatureReducerWithStationLookup extends Reducer<Text, IntWritable, Text, IntWritable> {
    private NcdcStationMetadata metadata;

    @Override
    protected void setup(Context context) throws IOException, InterruptedException {
        metadata = new NcdcStationMetadata();
        metadata.initialize(new File("stations-fixed-width.txt"));
    }

    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context)
            throws IOException, InterruptedException {
        String stationName = metadata.getStationName(key.toString());
        int maxValue = Integer.MIN_VALUE;
        for (IntWritable value : values) {
            maxValue = Math.max(maxValue, value.get());
        }
        context.write(new Text(stationName), new IntWritable(maxValue));
    }
}

  

  2、使用API,可以完成更多操作,Job中的方法:    

public void addCacheFile(URI uri)
public void addCacheArchive(URI uri)
public void setCacheFiles(URI[] files)
public void setCacheArchives(URI[] archives)
public void addFileToClassPath(Path file)
public void addArchiveToClassPath(Path archive)
public void createSymlink()

   使用命令行参数 和 API 的 对比:

  

  a. API中使用的路径是指共享路径,比如HDFS上的路径;而命令行下的参数路径可以是本地,也可以是HDFS,如果是本地会复制到HDFS上去;

  b. API中的add() set() 不会将文件复制到共享文件系统中去;

  获取缓存的文件:

  public Path[] getLocalCacheFiles() throws IOException;
  public Path[] getLocalCacheArchives() throws IOException;
  public Path[] getFileClassPaths();
  public Path[] getArchiveClassPaths(); 

 

时间: 2024-10-16 08:18:34

Hadoop 中的 (side data) 边数据的相关文章

Hadoop 中利用 mapreduce 读写 mysql 数据

Hadoop 中利用 mapreduce 读写 mysql 数据 有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP 的需求,我们需要 mapreduce 与 mysql 进行数据的交互,而这些特性正是 hbase 或者 hive 目前亟待改进的地方. 好了言归正传,简单的说说背景.原理以及需要注意的地方: 1.为了方便 MapReduce 直接访问关系型数据库(Mysql,Oracle),Hadoop提供了DBInp

浅析 Hadoop 中的数据倾斜

转自:http://my.oschina.net/leejun2005/blog/100922 最近几次被问到关于数据倾斜的问题,这里找了些资料也结合一些自己的理解. 在并行计算中我们总希望分配的每一个task 都能以差不多的粒度来切分并且完成时间相差不大,但是集群中可能硬件不同,应用的类型不同和切分的数据大小不一致总会导致有部分任务极大的拖慢了整个任务的完成时间,硬件不同就不说了,应用的类型不同其中就比如page rank 或者data mining 里面一些计算,它的每条记录消耗的成本不太一

使用jQuery的data方法来为页面中的某个元素存储数据,(获取焦点,清除默认值)

使用data方法可以避免在DOM中存储数据,有些前端开发er喜欢使用HTML的属性来存储数据: 使用”alt”属性来作为参数名存储数据其实对于HTML来说是不符合语义的. 我们可以使用jQuery的data方法来为页面中的某个元素存储数据: html部分: 1 <form id="testform"> 2 <input type="text" class="clear" value="Always cleared&qu

关于JQuery中$.data绑定数据原理或逻辑

问题: JQuery中,对于.data([key],[value])函数,当使用其进行数据绑定时,假设要绑定的数据是“引用数据类型”,也就是对象:那么.data函数绑定的是该对象的副本还是该对象的一个引用?下面通过以下小例子来测试下: 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Test<

Zookeeper 在Hadoop中的应用

Zookeeper 简介 Zookeeper 分布式服务框架是 Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务.状态同步服务.集群管理.分布式应用配置项的管理等. Hadoop简介 Hadoop是一个由Apache基金会所开发的分布式系统基础架构. 用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力进行高速运算和存储. Hadoop主要包含两部分:HDFS,YARN. HDFS有高容错性的特点,并且设计用

Hadoop中自带的examples之wordcount应用案例

大家都知道hadoop中自带了非常多样例.那么怎么用呢,今天主要測试下hadoop中的wordcount程序jar包: 1.首先启动hadoop 2.准备数据:vim words, 写入 hello tom hello jerry hello kitty hello tom hello bbb 3.将数据上传到HDFS hadoop fs -put words /user/guest/words.txt 4.执行examples中自带的wordcount程序jar包 [email protect

在Hadoop中重写FileInputFormat类以处理二进制格式存储的整数

最近开始使用MapReduce,发现网上大部分例子都是对文本数据进行处理的,也就是说在读取输入数据时直接使用默认的TextInputFormat进行处理即可.对于文本数据处理,这个类还是能满足一部分应用场景.但是如果要处理以二进制形式结构化记录存储的文件时,这些类就不再适合了. 本文以一个简单的应用场景为例:对按照二进制格式存储的整数做频数统计.当然,也可以在此基础上实现排序之类的其他应用.实现该应用的主要难点就是如何处理输入数据.参考<权威指南·第三版>得知需要继承FileInputForm

浅谈hadoop中mapreduce的文件分发

最近在做数据分析的时候,需要在mapreduce中调用c语言写的接口,此时就需要把动态链接库so文件分发到hadoop的各个节点上,原来想自己来做这个分发,大概过程就是把so文件放在hdfs上面,然后做mapreduce的时候把so文件从hdfs下载到本地,但查询资料后发现hadoop有相应的组件来帮助我们完成这个操作,这个组件就是DistributedCache,分布式缓存,运用这个东西可以做到第三方文件的分发和缓存功能,下面详解: 如果我们需要在map之间共享一些数据,如果信息量不大,我们可

Hadoop中客户端和服务器端的方法调用过程

Java 动态代理一个简单的demo:(用以对比Hadoop中的动态代理) Hello接口: public interface Hello { void sayHello(String to); void print(String p); } Hello接口的实现类: public class HelloImpl implements Hello { public void sayHello(String to) { System.out.println("Say hello to "