Hadoop编写调试MapReduce程序详解

2019-03-28 13:06|来源: 网络

编程学习,最好的方法还是自己动手,所以这里简单介绍在Hadoop上编写调试一个MapReduce程序。

先说一下我的开发环境,我的操作系统是CentOS 6.0,Hadoop版本是0.20.2,开发环境是eclipse。在Hadoop的0.20.0版本以后,都包含一个新的Java MapReduce API,这个API有时也称为上下文对象,新的API在类型上不兼容以前的API。关于新旧API的区别,这里先不做介绍了,只是在编程的时候一定要注意下,网上好多MapReduce的程序是基于旧的API编写的,如果自己安装的是新版的Hadoop,就会在调试时出现错误,初学者不明白这一点或许会走弯路。

1问题描述:查找最高气温。就是从气候日志数据中查找当年的最高气温,假设每一条记录的格式如下:“China2013inbeijing023isok0",其中2013是年份,023是温度记录,ok表示数据是完好的(为了简单易懂,省略其他的信息),我们的任务是从大量的数据记录中找出北京2013年的最高气温。这样的数据很适合用MapReduce来处理。

2问题分析,这个问题很简单,这里用这么简单的数据只是为了说明在Hadoop上编写调试MapReduce程序的过程。对于一条数据这需要提取出来年份和温度,然后找出最大温度就行了。这了类似于分治法,每一个Map过程就是分得过程,Reduce就是合的过程。

3 编码:

3.1Map函数:

//载入一些必要的包
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.OutputCollector;
import org.apache.hadoop.mapred.Reporter;
import org.apache.hadoop.mapreduce.Mapper;
//新版APIMap过程需要继承org.apache.hadoop.mapreduce包Mapper<SPAN style="COLOR: red"></SPAN>类,并重写其map方法
public class MaxtemMapper extends
Mapper<LongWritable,Text,Text,IntWritable>{
 private static final int MISSING=9999;
 public void map(LongWritable key,Text value,Context context)
 throws IOException,InterruptedException{
  String line=value.toString();//把Text类的对象转化为String类来处理
  String year=line.substring(5,9);//该String的第5-9就是年份
  int airtemperature;
              //有的数据中温度前面带”+“,需要处理下,带”+“的话第19到21为温度,不带的的话第18到21
              //为温度
            &nbsp;if(line.charAt(18)=='+'){
   airtemperature=Integer.parseInt(line.substring(19, 21));
  }
  else {
   airtemperature=Integer.parseInt(line.substring(18,21));
  }
  System.out.println("year:"+year+"tem:"+airtemperature);
              判断数据是否是正确的
            &nbsp;String quality=line.substring(23, 25);
  if(airtemperature!=MISSING && quality.matches("ok")){
      context.write(new Text(year), new IntWritable(airtemperature));
  }
 }
}

3.2Reduce函数:

import java.io.IOException;
import java.util.Iterator;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

public class MaxtemReducer extends
Reducer<Text,IntWritable,Text,IntWritable>{
 public void reduce(Text key,Iterator<IntWritable> values,
   Context context)
 throws IOException,InterruptedException{
  int maxValue=Integer.MIN_VALUE;
  while(values.hasNext()){
   maxValue=Math.max(maxValue,values.next().get());
  }
  context.write( key, new IntWritable(maxValue));
 }
 
}

3.3执行MapReduce过程

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;


public class MaxTemperature{
 
 //the main function
 public static void main(String [] args)throws Exception{
  Configuration conf=new Configuration();
 
  if(args.length!=2){
   System.out.println("Usage: Maxtemperature 
                <input path> <output path>");
   System.exit(-1);
  }
  Job job=new Job(conf,"MaxTemperature");
  job.setJarByClass(MaxTemperature.class);
 
  FileInputFormat.addInputPath(job, new
                Path(args[0]));
  FileOutputFormat.setOutputPath(job, new
                Path(args[1]));
 
  job.setMapperClass(MaxtemMapper.class);
  job.setReducerClass(MaxtemReducer.class);
  job.setOutputKeyClass(Text.class);
  job.setOutputValueClass(IntWritable.class);
  job.waitForCompletion(true);
  //output the details of the work
  System.out.println("name:"+job.getJobName());
  System.out.println("isSuccessful?:"+ 
                (job.isSuccessful()?"yes":"no"));
   
 }
}

相关问答

更多
  • 在这个实例中,我将会向大家介绍如何使用Python 为 Hadoop编写一个简单的MapReduce 程序。 尽管Hadoop 框架是使用Java编写的但是我们仍然需要使用像C++、Python等语言来实现Hadoop程序。尽管Hadoop官方网站给的示例程序是使用Jython编写并打包成Jar文件,这样显然造成了不便,其实,不一定非要这样来实现,我们可以使用Python与Hadoop 关联进行编程,看看位于/src/examples/python/WordCount.py 的例子,你将了解到我在说什么。 ...
  • 转载:我们将编写一个简单的 MapReduce 程序,使用的是C-Python,而不是Jython编写后打包成jar包的程序。   我们的这个例子将模仿 WordCount 并使用Python来实现,例子通过读取文本文件来统计出单词的出现次数。结果也以文本形式输出,每一行包含一个单词和单词出现的次数,两者中间使用制表符来想间隔。   先决条件   编写这个程序之前,你学要架设好Hadoop 集群,这样才能不会在后期工作抓瞎。如果你没有架设好,那么在后面有个简明教程来教你在Ubuntu Linux 上搭建(同 ...
  • 使用Python编写MapReduce代码技巧于我使用 HadoopStreaming 帮助我Map Reduce间传递数据通STDIN (标准输入)STDOUT (标准输).我仅仅使用Pythonsys.stdin输入数据使用sys.stdout输数据做HadoopStreaming帮我办其事真别相信!
  • 一、 首先要知道此前提 转载 若在windows的Eclipse工程中直接启动mapreduc程序,需要先把hadoop集群的配置目录下的xml都拷贝到src目录下,让程序自动读取集群的地址后去进行分布式运行(您也可以自己写java代码去设置job的configuration属性)。
  • 用户配置并将一个Hadoop作业提到Hadoop框架中,Hadoop框架会把这个作业分解成一系列map tasks 和reduce tasks。Hadoop框架负责task分发和执行,结果收集和作业进度监控。 下图给出了一个作业从开始执行到结束所经历的阶段和每个阶段被谁控制(用户 or Hadoop框架)。
  • 1. 概述 1970年,IBM的研究员E.F.Codd博士在刊物《Communication of the ACM》上发表了一篇名为“A Relational Model of Data for Large Shared Data Banks”的论文,提出了关系模型的概念,标志着关系数据库的诞生,随后几十年,关系数据库及其结构化查询语言SQL成为程序员必须掌握的基本技能之一。 2005年4月,Jeffrey Dean和Sanjay Ghemawat在国际会议OSDI上发表“MapReduce: Simpli ...
  • 都可以,简单的直接用txt打开java文件,写好后打包成class文件,就可以运行了。你看他原来在哪里放class文件的,你就放在那里
  • 使用ResourceManager的UI : 如果您在群集中运行YARN,那么您的群集中将不会运行JobTracker,因此您无法访问http://localhost:50030/jobtracker.jsp ,而是会运行ResourceManager并且您可以访问ResourceManager的Web页面访问http://RESOURCE_MANAGER_HOST:8088/cluster (用您的ResourceManager的IP地址替换RESOURCE_MANAGER_HOST)。 在Resourc ...
  • 您尝试使用的文件位于本地Linux文件系统上,而不是HDFS上。 所以使用可以使用简单的命令,如: cat /home/Kumar/DEV/Eclipse/eclipse/Workspace/MyFirstMapReduce/Files/input/file1 如果MapReduce程序需要HDFS上的输入文件,则将相同的文件放在作业中的HDFS和HDFS路径上。 您可以使用此命令将文件放在hdfs上: hadoop fs -put
  • 调试MrJobs有时候会是一个很大的挑战。 我的学习曲线开始于使用try ...除了mappers和reducer中的子句,产生了(使用traceback模块)生成的异常,而不是打破了作业流程。 但是第一种方法耗费时间很多次,你需要等待几分钟才能完成工作,最后,大多数错误都会导致未定义的变量或语法错误。 因此,我尝试使用小型测试日志来提供作业,这大大减少了运行作业所花费的时间,以查看问题所在。 另一种方法是测试hadoop之外的映射器和缩减器,这可以非常方便,因为你可以使用pdb来实现这个目的,并快速找出问 ...