MapReduce入门

本文中的代码基于CDH的5.6版本编写

1、MrTest程序,模拟wordcount

输入文件:

hdfs文件路径:/tmp/test.txt
文件内容:
hello  world
hello test
test hadoop
hadoop  hdfs
hive
sql
sqoop

  代码:

package testhadoop;

import java.io.IOException;

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
//定义类
public class MRTest {

	public static void main(String[] args){
		Path inFile = new Path(args[0]);
		Path outFile = new Path(args[1]);

		Job job;
		try {
			job = Job.getInstance();
			job.setJarByClass(testhadoop.MRTest.class);
		       //设置传入文件路径
			FileInputFormat.addInputPath(job , inFile);                         //设置输出文件路径
			FileOutputFormat.setOutputPath(job, outFile);
			//设置Reducer使用的类
			job.setReducerClass(testhadoop.MRreducer.class);                        //设置Mapper使用的类
			job.setMapperClass(testhadoop.MRmapper.class);

			//设置Mapper输出的key的class
			job.setMapOutputKeyClass(Text.class);                        //设置Mapper输出的value的class
			job.setMapOutputValueClass(IntWritable.class);
			                        //设置Reducer输出的key的class
			job.setOutputKeyClass(Text.class);                        //设置Reducer输出的value的class
			job.setOutputValueClass(IntWritable.class);

			try {
				job.waitForCompletion(true);
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

class MRmapper extends Mapper<LongWritable, Text, Text, IntWritable>{

	@Override
	protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context)
			throws IOException, InterruptedException {
		// TODO Auto-generated method stub                //将value转化成string类的数组
		String[] line = value.toString().split(" ");
		for(int i = 0 ; i< line.length-1 ;i++){
		    context.write(new Text(line[i]), new IntWritable(1));
		}
	}

}

class MRreducer extends Reducer<Text, IntWritable, Text, IntWritable>{

	@Override
	protected void reduce(Text arg0, Iterable<IntWritable> arg1,
			Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
		// TODO Auto-generated method stub
		int sum = 0;
		for(IntWritable i : arg1){
			sum += i.get();
		}
		context.write(arg0, new IntWritable(sum));
	}

}

  

导出成MRTest.jar并上传至服务器的/opt目录
执行:
hadoop jar MRTest.jar "MRTest" "/tmp/test.txt" "/tmp/test/out"

再执行:
hadoop fs -ls /tmp/test/out/*  查看输出的文件:


  

2、求最低温度

hdfs文件路径:/tmp/temp.txt
查看文件内容:
0067011990999991950051512004888888889999999N9+00221+9999999999999999999999
0067011990999991950051507004888888889999999N9+00001+9999999999999999999999
0067011990999991950051512004888888889999999N9+00221+9999999999999999999999
0067011990999991950051518004888888889999999N9-00111+9999999999999999999999
0067011990999991949032412004888888889999999N9+01111+9999999999999999999999
0067011990999991950032418004888888880500001N9+00001+9999999999999999999999
0067011990999991950051507004888888880500001N9+00781+9999999999999999999999

代码:

import java.io.IOException;

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

public class TempTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Path fromPath = new Path(args[0]);
		Path toPath = new Path(args[1]);

		try {
			Configuration conf = new Configuration();
			Job job = Job.getInstance();
			job.setJarByClass(TempTest.class);

			FileInputFormat.setInputPaths(job, fromPath);
			FileOutputFormat.setOutputPath(job, toPath);

			job.setMapperClass(TempMapper.class);
			job.setReducerClass(TempReducer.class);

			job.setMapOutputKeyClass(Text.class);
			job.setMapOutputValueClass(IntWritable.class);

			job.setOutputKeyClass(Text.class);
			job.setOutputValueClass(IntWritable.class);

			try {
				job.waitForCompletion(true);
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

class TempMapper extends Mapper<LongWritable,Text,Text,IntWritable>{

	public static final int MISSING = 9999;
	@Override
	protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context)
			throws IOException, InterruptedException {
		// TODO Auto-generated method stub
		String line = value.toString();
		String year = line.substring(15, 19);
		String flag = line.substring(45,46);
		int temp ;
		if("+".equals(flag)){
			temp = Integer.parseInt(line.substring(46,50));
		}else{
			temp = Integer.parseInt(line.substring(45,50));
		}
		String qua  = line.substring(50,51);
		if(temp != MISSING && qua.matches("[01459]")){
			context.write(new Text(year), new IntWritable(temp));
		}
	}
}

class TempReducer extends Reducer<Text ,IntWritable ,Text,IntWritable>{
    public static final Long MIN = Long.MIN_VALUE;

	@Override
	protected void reduce(Text arg0, Iterable<IntWritable> temp,
			Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
		// TODO Auto-generated method stub
		int minValue = Integer.MAX_VALUE;
		for(IntWritable t : temp){
			minValue = Math.min(minValue, t.get());
		}
		context.write(arg0, new IntWritable(minValue));
	}

}

  

导出成temp.jar并上传至服务器的/opt目录
执行:
hadoop jar temp.jar "TempTest" "/tmp/temp.txt" "/tmp/temp/out"

再执行:
hadoop fs -ls /tmp/temp/out/*  查看输出的文件:

				
时间: 2024-12-18 14:06:30

MapReduce入门的相关文章

Hadoop初学指南(5)--MapReduce入门

本文将介绍Hadoop中的重点MapReduce的入门知识. (1)MapReduce概述 MapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,解决海量数据的计算问题. MR由两个阶段组成:Map和Reduce,在Hadoop中用户只需要实现map()和reduce()两个函数,即可实现分布式计算,非常简单.这两个函数的形参是key.value对,表示函数的输入信息. (2)MR执行流程 客户端的代码会提交给JobTracker,也就是JobTracker接受由用户提交

MapReduce入门实例

Hadoop集群(第9期)_MapReduce初级案例 1.数据去重  "数据去重"主要是为了掌握和利用并行化思想来对数据进行有意义的筛选.统计大数据集上的数据种类个数.从网站日志中计算访问地等这些看似庞杂的任务都会涉及数据去重.下面就进入这个实例的MapReduce程序设计. 1.1 实例描述 对数据文件中的数据进行去重.数据文件中的每行都是一个数据. 样例输入如下所示: 1)file1: 2012-3-1 a 2012-3-2 b 2012-3-3 c 2012-3-4 d 201

mapreduce入门之wordcount注释详解

mapreduce版本:0.2.0之前 说明: 该注释为之前学习时找到的一篇,现在只是在入门以后对该注释做了一些修正以及添加. 由于版本问题,该代码并没有在集群环境中运行,只将其做为理解mapreduce的参考吧. 切记,该版本是0.2.0之前的版本,请分辨清楚! 正文: package org.apache.hadoop.examples; import java.io.IOException; import java.util.Iterator; import java.util.Strin

map-reduce入门

近期在改写mahout源代码,感觉自己map-reduce功力不够深厚,因此打算系统学习一下. map-reduce事实上是一种编程范式,从统计词频(wordCount)程序来解说map-reduce的思想最easy理解. 给定一个文件,里面的内容例如以下,要求统计每一个单词的词频. Hello Angela I love you Angela How are you Angela map(每一个单词处理为一行,key,value形式) Hello,1 Angela,1 I,1 love,1 y

Hadoop学习总结之三:Map-Reduce入门

1.Map-Reduce的逻辑过程 假设我们需要处理一批有关天气的数据,其格式如下: 按照ASCII码存储,每行一条记录 每一行字符从0开始计数,第15个到第18个字符为年 第25个到第29个字符为温度,其中第25位是符号+/- 0067011990999991950051507+0000+ 0043011990999991950051512+0022+ 0043011990999991950051518-0011+ 0043012650999991949032412+0111+ 0043012

MapReduce(一) mapreduce基础入门

一.mapreduce入门 1.什么是mapreduce 首先让我们来重温一下 hadoop 的四大组件:HDFS:分布式存储系统MapReduce:分布式计算系统YARN: hadoop 的资源调度系统Common: 以上三大组件的底层支撑组件,主要提供基础工具包和 RPC 框架等 Mapreduce 是一个分布式运算程序的编程框架,是用户开发"基于 hadoop 的数据分析 应用"的核心框架Mapreduce 核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的 分布式

【甘道夫】官方网站MapReduce代码注释具体实例

引言 1.本文不描写叙述MapReduce入门知识,这类知识网上非常多.请自行查阅 2.本文的实例代码来自官网 http://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html 最后的WordCount v2.0,该代码相比源代码中的org.apache.hadoop.examples.WordCount要复杂和完整,更适合作为MapR

【甘道夫】官网MapReduce实例代码详细批注

引言 1.本文不描述MapReduce入门知识,这类知识网上很多,请自行查阅 2.本文的实例代码来自官网 http://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html 最后的WordCount v2.0,该代码相比源码中的org.apache.hadoop.examples.WordCount要复杂和完整,更适合作为MapReduc

hadoop---运行自带的MapReduce WordCount程序

MapReduce入门程序:WordCount hadoop的share目录下 创建一个HDFS数据目录,用于保存mapreduce的输入文件 创建一个目录,用于保存mapreduce的任务输出文件 创建一个单词文件,并上传到HDFS上面 上传该文件到HDFS上在文件所在目录下, 运行wordcount程序 查看输出结果 原文地址:https://www.cnblogs.com/taoHongFei/p/9348013.html