mapreduce的一个模版

import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapreduce.*;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

/**
 * map就是把key先分出来,系统会自动把相同key的value放到一个iterator里面,reduce就是去处理key和已经归并好的iterator
 */
public class Template extends Configured implements Tool {	

	/**
	 * 计数器
	 * 用于计数各种异常数据
	 */
	enum Counter
	{
		LINESKIP,	//出错的行
	}

	/**
	 * MAP任务
	 */
	public static class Map extends Mapper<LongWritable, Text, Text, Text> //输入的key(在这里是行号),输入的value,输出的key,输出的value
	{
		public void map ( LongWritable key, Text value, Context context ) throws IOException, InterruptedException
		{
			String line = value.toString();				//读取源数据

			try
			{
				//数据处理
				String [] lineSplit = line.split(" ");
				String anum = lineSplit[0];
				String bnum = lineSplit[1];

				context.write( new Text(bnum), new Text(anum) );	//输出
			}
			catch ( java.lang.ArrayIndexOutOfBoundsException e )
			{
				context.getCounter(Counter.LINESKIP).increment(1);	//出错令计数器+1
				return;
			}
		}
	}

	/**
	 * REDUCE任务
	 */
	public static class Reduce extends Reducer<Text, Text, Text, Text>
	{
		public void reduce ( Text key, Iterable<Text> values, Context context ) throws IOException, InterruptedException
		{
			String valueString;
			String out = "";

			for ( Text value : values )
			{
				valueString = value.toString();
				out += valueString + "|";
			}

			context.write( key, new Text(out) );
		}
	}

	@Override
	public int run(String[] args) throws Exception
	{
		Configuration conf = getConf();

		Job job = new Job(conf, "Test_2");								//任务名
		job.setJarByClass(Test_2.class);								//指定Class

		FileInputFormat.addInputPath( job, new Path(args[0]) );			//输入路径
		FileOutputFormat.setOutputPath( job, new Path(args[1]) );		//输出路径

		job.setMapperClass( Map.class );								//调用上面Map类作为Map任务代码
		job.setReducerClass ( Reduce.class );							//调用上面Reduce类作为Reduce任务代码,没有这行就调<span style="white-space:pre">													</span>//用默认的reduce
		job.setOutputFormatClass( TextOutputFormat.class );
		job.setOutputKeyClass( Text.class );							//指定输出的KEY的格式
		job.setOutputValueClass( Text.class );							//指定输出的VALUE的格式

		job.waitForCompletion(true);

		//输出任务完成情况
		System.out.println( "任务名称:" + job.getJobName() );
		System.out.println( "任务成功:" + ( job.isSuccessful()?"是":"否" ) );
		System.out.println( "输入行数:" + job.getCounters().findCounter("org.apache.hadoop.mapred.Task$Counter", "MAP_INPUT_RECORDS").getValue() );
		System.out.println( "输出行数:" + job.getCounters().findCounter("org.apache.hadoop.mapred.Task$Counter", "MAP_OUTPUT_RECORDS").getValue() );
		System.out.println( "跳过的行:" + job.getCounters().findCounter(Counter.LINESKIP).getValue() );

		return job.isSuccessful() ? 0 : 1;
	}

	/**
	 * 设置系统说明
	 * 设置MapReduce任务
	 */
	public static void main(String[] args) throws Exception
	{

		//判断参数个数是否正确
		//如果无参数运行则显示以作程序说明
		if ( args.length != 2 )
		{
			System.err.println("");
			System.err.println("Usage: Test_2 < input path > < output path > ");
			System.err.println("Example: hadoop jar ~/Test_2.jar hdfs://localhost:9000/home/james/Test_2 hdfs://localhost:9000/home/james/output");
			System.err.println("Counter:");
			System.err.println("\t"+"LINESKIP"+"\t"+"Lines which are too short");
			System.exit(-1);
		}

		//记录开始时间
		DateFormat formatter = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );
		Date start = new Date();

		//运行任务
		int res = ToolRunner.run(new Configuration(), new Test_2(), args);

		//输出任务耗时
		Date end = new Date();
		float time =  (float) (( end.getTime() - start.getTime() ) / 60000.0) ;
		System.out.println( "任务开始:" + formatter.format(start) );
		System.out.println( "任务结束:" + formatter.format(end) );
		System.out.println( "任务耗时:" + String.valueOf( time ) + " 分钟" ); 

        System.exit(res);
	}
}

时间: 2024-12-16 16:38:33

mapreduce的一个模版的相关文章

markdonw 一个模版

项目名称======================在这里我写一个项目概述 段落分明.[空行](http://example.com/) 的项目概述. 如何使用------### 排队 ###内嵌代码.**反引号** (`` ` ``) . ### 块级 ### <script type="text/javascript" src="jquery.min.js"></script> <script type="text/jav

编写一个模版函数count

返回值是数组的a[0:n-1]的数组个数. 知识点:数组的两个特殊性质对我们定义和使用作用在数组上的函数有影响,这两个性质分别是:不允许拷贝数组以及使用数组时(通常)会将其转换成指针.因为不能拷贝数组,所以我们无法以值传递的方式使用数组参数.因为数组会被转换成指针,所以当我们为函数传递一个数组时,实际上传递的饰指向数组首元素的指针. ex: void print(const int*); void print(const int[]); void print(const int[10]) 答案:

自己动手制作一个模版解析

① 解析if <?php $str = '{if $data===1} 1 {elseif $data===2} 2 {else} 3 {/if}'; echo $str; $T_P=array( '#\{if(.*)\}#', '#\{(?:else if|elseif)(.*)\}#', '#\{else\}#', '#\{/if\}#', ); $T_R=array( '<?php if (\1){ ?>', '<?php else if (\1) { ?>', '&l

做一个模仿Smarty的简易模版

---恢复内容开始--- 今天终于学习完了一个慕课网的正则表达式的视频,感觉挺不错的,推荐给大家 下面是我学习写的一些代码 首先要先明白什么是Smarty模版. 这种模版就是将一个文件中的代码运用正则替换为令一段代码以供下一步的运行.也就是说可以通过这个模版来省略很多语法,结构上面的规则,从而很好的将前端开发和后端开发分离,不需什么都懂,在这个山寨的模版里面主要是将前端的HTML代码中的一些字段替换成可被运行的PHP代码,完成给用户的最后的输出. 好,首先是新建的项目,既然有编译,就有个源文件和

MapReduce: 一个巨大的倒退

前言 databasecolumn 的数据库大牛们(其中包括PostgreSQL的最初伯克利领导:Michael Stonebraker)最近写了一篇评论当前如日中天的MapReduce 技术的文章,引发剧烈的讨论.我抽空在这儿翻译一些,一起学习. 译者注:这种 Tanenbaum vs. Linus 式的讨论自然会导致非常热烈的争辩.但是老实说,从 Tanenbaum vs. Linus 的辩论历史发展来看,Linux是越来越多地学习并以不同方式应用了 Tanenbaum 等 OS 研究者的经

初步掌握MapReduce的架构及原理

目录 1.MapReduce定义 2.MapReduce来源 3.MapReduce特点 4.MapReduce实例 5.MapReduce编程模型 6.MapReduce 内部逻辑 7.MapReduce架构 8.MapReduce框架的容错性 9.MapReduce资源组织方式 1.MapReduce 定义 Hadoop 中的 MapReduce是一个使用简单的软件框架,基于它写出来的应用程序能够运行在由上千个商用机器组成的大型集群上,并以一种可靠容错式并行处理TB级别的数据集 2.MapR

初始化一个Express项目

首先新建一个目录mkdir myblog,在该目录下运行npm init 生成package.json 然后安装express,加--save写入package.json npm i [email protected] --save 新建index.js并写入: var express = require('express'); var app = express(); app.get('/', function(req, res) { res.send('hello, express'); }

【C++】认识模版函数

模板是泛型编程的基础.所谓泛型编程就是编写与类型无关的逻辑代码,是一种复用的方式.模板分为模板函数和模板类. 首先,我们不使用模版函数,该函数用来实现比较两个数是否相等. bool IsEqual(int left, int right)//--->int型 {     return left == right; } bool IsEqual(const string& left, const string& right)//-->string型 {     return le

Linux上搭建Hadoop2.6.3集群以及WIN7通过Eclipse开发MapReduce的demo

近期为了分析国内航空旅游业常见安全漏洞,想到了用大数据来分析,其实数据也不大,只是生产项目没有使用Hadoop,因此这里实际使用一次. 先看一下通过hadoop分析后的结果吧,最终通过hadoop分析国内典型航空旅游业厂商的常见安全漏洞个数的比例效果如下: 第一次正式使用Hadoop,肯定会遇到非常多的问题,参考了很多网络上的文章,我把自己从0搭建到使用的过程记录下来,方便以后自己或其他人参考. 之前简单用过storm,适合实时数据的处理.hadoop更偏向静态数据的处理,网上很多hadoop的