`
jbm3072
  • 浏览: 211225 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hadoop MapReduce程序编写备忘

阅读更多

最近在编写Hadoop 的MapReduce程序的时侯,学到了不少东西,记下来备忘:

1.  Mapper和Reducer的上下文执行环境信息:

   在编写Mapper类时,一般使用如下的类继承声明:

 

public class DistinctProcessor extends MapReduceBase implements Mapper<Text,Text,Text,Text> {
 

 

MapReduceBase里面声明了如下方法:

 

public class MapReduceBase
  implements Closeable, JobConfigurable
{
  public void close()
    throws IOException
  {
  }

  public void configure(JobConf job)
  {
  }
}

 

 MapReduce框架在创建Mapper对象后,会调用configure方法,实现类可以从job获得到想要的信息,供map函数使用。不过MapReduce在JobConf也放置了关于MapTask的信息,供实现类使用:

 

 

mapred.job.id	String	The job id
mapred.jar	String	job.jar location in job directory
job.local.dir	 String	 The job specific shared scratch space
mapred.tip.id	 String	 The task id
mapred.task.id	 String	 The task attempt id
mapred.task.is.map	 boolean	Is this a map task
mapred.task.partition	 int	The id of the task within the job
map.input.file	 String	 The filename that the map is reading from
map.input.start	 long	 The offset of the start of the map input split
map.input.length	long	The number of bytes in the map input split
mapred.work.output.dir	 String	The task's temporary output directory

 

 

 

 

map.input.file表示读入的文件,这个比较有用,尤其是在根据不同文件名称进行不同处理的时候,可以据此来进行处理。

mapred.tip.id和mapred.job.id表示task和Job id。map.input.length表示此次map处理的文件长度。

 

总结: 借助Map和Reducer的上下文信息,我们可以在map和reduce函数中增加额外的判断和处理。

 

2. 使用MultipleOutputs使程序支持多输出

 

有时候,我们的输出可能不是一类,而是多类,例如统计每月和每周的交易次数。我们可以在collect(key,value)中的key加上不同的标识来表示不同的输出类型。但我们可能更想得到的是两个不同的文件,一个文件记录每月的交易次数,一个文件则记录每周的交易次数。使用MultiOuputs就可以做到。在Hadoop的文档中介绍了相关的例子,这里贴出来:

 

 

 JobConf conf = new JobConf();

 conf.setInputPath(inDir);
 FileOutputFormat.setOutputPath(conf, outDir);

 conf.setMapperClass(MOMap.class);
 conf.setReducerClass(MOReduce.class);
 ...

 // Defines additional single text based output 'text' for the job
 MultipleOutputs.addNamedOutput(conf, "text", TextOutputFormat.class,
 LongWritable.class, Text.class);

 // Defines additional multi sequencefile based output 'sequence' for the
 // job
 MultipleOutputs.addMultiNamedOutput(conf, "seq",
   SequenceFileOutputFormat.class,
   LongWritable.class, Text.class);
 ...

 JobClient jc = new JobClient();
 RunningJob job = jc.submitJob(conf);

 ...
 
Job configuration usage pattern is:


 public class MOReduce implements
   Reducer<WritableComparable, Writable> {
 private MultipleOutputs mos;

 public void configure(JobConf conf) {
 ...
 mos = new MultipleOutputs(conf);
 }

 public void reduce(WritableComparable key, Iterator<Writable> values,
 OutputCollector output, Reporter reporter)
 throws IOException {
 ...
 mos.getCollector("text", reporter).collect(key, new Text("Hello"));
 mos.getCollector("seq", "A", reporter).collect(key, new Text("Bye"));
 mos.getCollector("seq", "B", reporter).collect(key, new Text("Chau"));
 ...
 }

 public void close() throws IOException {
 mos.close(); //此处一定要加上!!!!!!!
 ...
 }

 }
 
 

 

需要特别注意的就是close方法里面必须要有mos.close(),否则输出无法写出到文件中。

 

 

3.使用MultipleInputs

MultipleOutputs支持多输出,那MultipleInputs自然是指支持多输入啦。但是我们在使用FileInputFormat的addInputPath时,就会发现FileInputFormat支持多输入。但这并不意味着MulitpleInputs就无用武之地了。我们看看MultipleInputs的方法,就可以看到MultipleInputs的作用了:

 

 

public static void addInputPath(JobConf conf, Path path, Class<? extends InputFormat> inputFormatClass) ;

public static void addInputPath(JobConf conf, Path path, Class<? extends InputFormat> inputFormatClass, Class<? extends Mapper> mapperClass) 
 

 

根据提供的方法,就可以看到MultipleInputs的强大了吧。也就是说使用MultipleInputs你可以使用两个完全不同的输入类型,一个可能是TextInputFormat,另一个则可能是SeqFileInputFormat,也可能是DBInputFormat。而针对每一种输入类型,你还可以指定对应的Mapper类,强大的MultipleInputs可以对不同的输入类型进行融合,消化,然后传给reduce方法进行处理。

 

 

4. 多个Job的依赖关系JobControl

 

  使用JobControl可以控制多个Job之间的依赖关系。实现workflow的效果。例如Job2需要在Job1干完之后才能开始干活,那该怎么办?总不能Job1启动执行结束后再启动Job2吧。

 

使用JobControl可以实现工作流。

在JobControl中可以设置Job与Job之间的依赖关系。JobControl根据依赖关系进行Job的调度。 JobControl实现了Runnable接口,意味着这个类可以在线程中启动运行。在运行时,我们可以调用JobControl的getRunningJobs获取到正在运行的Job。Job里面的JobClient可以得到Job运行的详细信息。

 

 

 

1
0
分享到:
评论

相关推荐

    Hadoop MapReduce实战手册(完整版)

    《Hadoop MapReduce实战手册》是一本专注于大数据处理技术的专著,主要针对Apache Hadoop中的MapReduce框架进行了深入的探讨。MapReduce是Hadoop生态系统中的核心组件之一,用于处理和生成大规模数据集。该书旨在...

    Hadoop MapReduce实现tfidf源码

    在Hadoop 2.7.7版本中,开发MapReduce程序通常需要使用Java编程语言。你需要导入Hadoop的相关库,创建Mapper和Reducer类,并实现它们的map()、reduce()方法。此外,还需要配置Job参数,如输入路径、输出路径、Mapper...

    Hadoop mapreduce实现wordcount

    可能包括了 Java 代码示例,讲解如何创建 MapReduce 程序,并将其提交到 Hadoop 集群执行。 7. **运行与调试**: 在实际环境中,我们需要配置 Hadoop 集群,设置输入文件路径,编译并打包 WordCount 程序,最后...

    大数据 hadoop mapreduce 词频统计

    【大数据Hadoop MapReduce词频统计】 大数据处理是现代信息技术领域的一个重要概念,它涉及到海量数据的存储、管理和分析。Hadoop是Apache软件基金会开发的一个开源框架,专门用于处理和存储大规模数据集。Hadoop的...

    Java操作Hadoop Mapreduce基本实践源码

    例如,一个简单的WordCount程序可以如下编写: ```java // 定义Mapper类 public static class TokenizerMapper extends Mapper, Text, Text, IntWritable&gt; { private final static IntWritable one = new ...

    Hadoop MapReduce Cookbook 源码

    《Hadoop MapReduce Cookbook 源码》是一本专注于实战的书籍,旨在帮助读者通过具体的例子深入理解并掌握Hadoop MapReduce技术。MapReduce是大数据处理领域中的核心组件,尤其在处理大规模分布式数据集时,它的重要...

    云计算技术实验报告三运行Hadoop MapReduce程序

    实验报告的标题为“云计算技术实验报告三运行Hadoop MapReduce程序”,这表明实验的核心是了解和实践Hadoop MapReduce的编程模型。MapReduce是一种分布式计算框架,常用于处理和生成大规模数据集,由Google提出并被...

    python hadoop mapreduce 相似用户|mapreduce.rar

    本文将深入探讨如何使用Python来编写Hadoop MapReduce程序,以实现微博关注者之间的相似用户分析。这个任务的关键在于理解并应用分布式计算原理,以及熟悉Python编程语言在大数据环境下的应用。 首先,Hadoop ...

    一个简单的 Hadoop MapReduce 程序示例.rar

    附件是一个简单的 Hadoop MapReduce 程序示例,用于统计文本文件中单词出现的次数。、 要运行这个程序,你需要将上述代码保存为 .java 文件,然后编译并打包成一个 JAR 文件。之后,你可以使用 Hadoop 的命令行工具...

    Hadoop MapReduce v2 Cookbook, 2nd Edition-Packt Publishing(2015) 高清完整版PDF下载

    ### Hadoop MapReduce V2 知识点概览 #### 一、Hadoop MapReduce V2 生态系统介绍 **Hadoop MapReduce V2** 是Hadoop生态系统中的一个关键组件,用于处理大规模数据集。相较于V1版本,V2版本在架构上进行了重大...

    hadoop mapreduce编程实战

    * WordCount 程序编写及代码分析 * 新建一个 MapReduce 工程 * 修改源程序 * 上传处理数据 * 运行以及结果分析 * map 程序分析 * reduce 程序分析 * WordCount 主程序分析 MapReduce 编程模型 MapReduce 编程模型...

    基于Apriori算法的频繁项集Hadoop mapreduce

    在大数据处理领域,Apriori算法与Hadoop MapReduce的结合是实现大规模数据挖掘的关键技术之一。Apriori算法是一种经典的关联规则学习算法,用于发现数据集中频繁出现的项集,进而挖掘出有趣的关联规则。而Hadoop ...

    Hadoop MapReduce.md

    1、程序设计模式不容易使用,而且 Hadoop 的 Map Reduce API 太过低级,很难提高开发者的效率。 2、有运行效率问题,MapReduce 需要将中间产生的数据保存到硬盘中,因此会有读写数据延迟问题。 3、不支持实时处理...

    hadoop学习本地win测试mapreduce程序,所要用到的环境软件.rar

    它包含必要的工具和资源,帮助你配置Hadoop环境,编写并执行MapReduce程序,从而深入理解分布式计算的核心概念。在学习过程中,记得结合文档资料,实践操作,不断调试和优化,才能更好地掌握这一技术。

    Hadoop MapReduce v2 Cookbook (第二版)

    Hadoop MapReduce v2 Cookbook (第二版), Packt Publishing

    基于Hadoop Mapreduce 实现酒店评价文本情感分析(python源码+项目说明).zip

    基于Hadoop Mapreduce 实现酒店评价文本情感分析(python源码+项目说明).zip基于Hadoop Mapreduce 实现酒店评价文本情感分析(python源码+项目说明).zip基于Hadoop Mapreduce 实现酒店评价文本情感分析(python...

    10.Hadoop MapReduce教程1

    Hadoop MapReduce 教程概述 Hadoop MapReduce 是 Hadoop 生态系统中的一部分,它是一种可靠的、可扩展的并行处理框架,用于处理大规模数据集。MapReduce 是一种编程模型,它将计算任务分解为两个阶段:Map 阶段和 ...

    Hadoop MapReduce v2 Cookbook.pdf

    本书《Hadoop MapReduce v2 Cookbook》会详细介绍如何使用Hadoop MapReduce v2进行大数据处理,包括编写MapReduce程序、调试、性能优化等方面的知识。读者将学习到如何利用Java API实现自定义Mapper和Reducer,以及...

Global site tag (gtag.js) - Google Analytics