Hadoop指南:分析一个MapReduce实例

2019-03-28 14:16|来源: 网络

学了半个月Hadoop 了,都还没见过一行关于 Hadoop 的代码,这是不行的。我们不仅要学习理论 / 方法,还得学习怎么用,我们今天揪个程序出来,瞧瞧一个 Hadoop 程序到底是有哪些部分组成的。


先来看一下这个程序:


package  com.apress.hadoopbook.examples.ch2;


import java.io.IOException;


import  org.apache.hadoop.io.Text;

import  org.apache.hadoop.mapred. FileInputFormat ;

import  org.apache.hadoop.mapred.FileOutputFormat;

import  org.apache.hadoop.mapred.JobClient;

import  org.apache.hadoop.mapred. JobConf ;

import  org.apache.hadoop.mapred.KeyValueTextInputFormat;

import  org.apache.hadoop.mapred.RunningJob;

import  org.apache.hadoop.mapred.lib. IdentityMapper ;

import  org.apache.hadoop.mapred.lib. IdentityReducer ;

import  org.apache.log4j.Logger;


 

public  class  MapReduceIntro {

protected  static Loggerlogger= Logger.getLogger(MapReduceIntro.class);


 

public static  voidmain(final  String[] args) {

try  {


 

final  JobConf conf = new  JobConf(MapReduceIntro.class);


//定义Hadoop运行作业时的临时文件目录

conf.set("hadoop.tmp.dir","/tmp");


 

MapReduceIntroConfig.exampleHouseKeeping(conf, MapReduceIntroConfig.getInputDirectory(), MapReduceIntroConfig.getOutputDirectory());


 

conf.setInputFormat(KeyValueTextInputFormat.class);

FileInputFormat .setInputPaths(conf, MapReduceIntroConfig.getInputDirectory());


 

conf.setMapperClass( IdentityMapper .class);


 

FileOutputFormat.setOutputPath(conf, MapReduceIntroConfig.getOutputDirectory());

conf.setOutputKeyClass(Text.class);

conf.setOutputValueClass(Text.class);

conf.setNumReduceTasks(1);

 

 

conf.setReducerClass( IdentityReducer .class);


logger.info("Launching the job.");

 

final  RunningJob job = JobClient.runJob(conf);

logger.info("The job has completed.");


if  (!job.isSuccessful()) {

logger.error("The job failed.");

System.exit(1);

}

logger.info("The job completed successfully.");

System.exit(0);

} catch  (final  IOException e) {

logger.error("The job has failed due to an IO Exception", e);

e.printStackTrace();

}


}

}



程序很短,而且注释很详细,不过我们还是来看看它有哪些部分组成。


1.日志跟踪。通过日志我们才能跟踪 MapReduceIntro 类,将作业运行期间所发生的动作记录下来,便于后面的分析:


protected static Loggerlogger= Logger.getLogger(MapReduceIntro.class);

相关问答

更多
  • 首先,一个job具体启动多少个map,是由你配置的inputformat来决定的。inputformat在分配任务之前会对输入进行切片。最终启动的map数目,就是切片的结果数目。具体来看 一、如果使用是自定义的inputformat,那么启动多少个map,是由你实现的public InputSplit[] getSplits(JobConf job, int numSplits)方法决定的,返回的切片有多少个就启动多少个map任务。 二、如果是使用系统系统的TextInputFormat(或FileInpu ...
  • 你参考下这个吧eclipse中开发Hadoop2.x的Map/Reduce项目汇总
  • 它们被分离出来,因为这两个包都代表2个不同的API。 org.apache.hadoop.mapred是旧的API, org.apache.hadoop.mapreduce是新的。 这样做是为了让程序员以更方便,更简单和复杂的方式编写MapReduce作业。 您可能会发现此演示文稿很有用,其中详细讨论了不同之处。 希望这回答你的问题。 They are separated out because both of these packages represent 2 different APIs. org.a ...
  • 本教程提到: 下载Hadoop-core-1.2.1.jar,用于编译和执行MapReduce程序。 访问以下链接http://mvnrepository.com/artifact/org.apache.hadoop/hadoop-core/1.2.1下载jar。 所以在这里你可以找到不同版本的所有罐子 This tutorial mentions : Download Hadoop-core-1.2.1.jar, which is used to compile and execute the MapRe ...
  • 在Hadoop中,您处理输入拆分而不是块。 输入拆分是完整的数据集。 您希望避免一个映射器超过两个拆分的情况,因为这会降低性能并创建流量。 在文本世界中,假设您在block1中并且您有一个句子,例如“我是一个哈”,而block2继续“doop developer”,那么这会创建网络流量,因为我们始终必须在一个完整的节点上工作输入拆分和一些数据必须转移到另一个节点。 In Hadoop you work on input splits and not on blocks. An input split is ...
  • 请参阅cloudera的这篇博文,解释小文件的问题。 github中有一个名为FileCrush的项目 ,它可以合并大量的小文件。 从项目的主页: 将许多小文件转换为更小的文件。 还可以在一次传递中从文本更改为序列和其他压缩选项。 See this blog post from cloudera explaining the problem with small files. There is a project in github named FileCrush which does merge larg ...
  • 您可以将LIMIT与任务规范一起使用。 但是,如果您必须一次又一次地执行此操作,那么更好的自动化解决方案是使用OOZIE(hadoop的工作流编辑器),可以在hive中为您的数据创建分区。 You can use LIMIT with task specification. However if you have to do it again and again then a better automated solution is to use OOZIE (work flow editor for ha ...
  • mapper的输出键和值类型应该是reducer的输入类型,因此在你的情况下,reducer必须继承自 Reducer setOutputKeyClass和setOutputValueClass设置作业输出的类型,即map和reduce。 如果要为映射器指定其他类型,则应使用方法setMapOutputKeyClass和setMapOutputValueClass 。 作为旁注,当您不希望输出中的真值时,为什么要从 ...
  • Mapper接口按以下顺序需要4个类型参数:Map输入键,Map输入值,Map输出键和Map输出值。 在您的情况下,由于您正在处理4个整数,其中3个构成您的值,1个是您的密钥,因此使用IntWritable作为Map输入键并且应该使用Text而错误。 此外,您在MapClass定义中指定的类型与传递给Map函数的类型不匹配。 鉴于您正在处理文本文件,您的MapClass应定义如下: public static class MapClass extends MapReduceBase implements M ...
  • MapReduce的作用可以称为“执行引擎”。 Pig作为一个系统正在将Pig Latin命令转换为一个或多个MR Jobs。 Pig本身没有能力运行它 - 它将这项工作委托给Hadoop。 我会在编译器和操作系统之间建立类比。 OS执行时编译器创建程序。 在这个比喻中,Pig是编译器,Hadoop是OS。 猪做的更多 - 它运行作业,监视它们等等。所以除了编译器之外,它可以被视为“shell”。 在我的理解中,从以下角度看,Pig不是100%编译器 - 它不会根据命令编译MR作业。 它传递有关应该对已存在 ...