Mapper-Reducer实例

在这里插入图片描述
一、MapReduce-分布式计算系统

1.含义:

MapReduce是一个基于集群的高性能并行计算平台。

MapReduce也是一个并行计算与运行软件框架。

MapReduce也是一个并行程序设计模型与方法。

2.工作原理:

Mapper:分割/提取

-流程

-读取文件每行数据

-按需要的形式进行分割

-产生键值对<K,V>

-按key值排序,分组

-输出<K,V>

eg:读取

-产生键值对<java 1><c 1><php 1><java 1>

-排序后<c 1><java 1><java 1><php 1>

-分组后<c {1}><java {1,1}><php {1}>

Reducer:数据清洗-shuffle/结果汇总

-对Mapper键值对操作

例如累加、批量修改

-输出原有或新类型键值对<K,V>

eg:<c {1}><java {1,1}><php {1}>

新键值对:<c 1><java 2><php 1>

Driver:设置对应类及输入输出/执行任务

-获取配置对象Configuration

-新建任务对象Job

-指定Mapper/Reducer组件

Mapper/ReduerClass OutputKeyClass OutputValueClass

-(自定义) 分区、分区数量

-输入输出路径

-提交Job

waitForCompletion

二、JAVA 实现

操作文件:(根目录下wordcount)

java c c c++ python
hadoop java python
php mysql c++ java
php

Mapper:

package wc;

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.mapreduce.Mapper;
/**
 * mapper组件
 * 前两个参数固定:LongWritable,Text
 * 
 * 输出格式为 <String,int> --> Text,IntWritable
 */
public class CountMapper extends Mapper<
LongWritable, Text, Text , IntWritable>{
	@Override
	protected void map(LongWritable key, Text value, Mapper<
			LongWritable, Text, Text, IntWritable>.Context context)
			throws IOException, InterruptedException {
		//获取每一行数据并转变为String
		String line=value.toString();
		//line="java c c c++ python" 按照空格切分,得到字符串数组
		String[] strs=line.split(" ");
		//遍历数组得到每一个单词
		for(String str:strs){
			//按照指定格式输出结果:java 1
			if(!str.equals("")){
				context.write(new Text(str), new IntWritable(1));
			}
		}

	}
}

-继承Mapper类并实现map方法

-Mapper四个参数< >

-默认输入类型LongWritable,Text (自定义可改变)

-输出类型为Text,IntWritable对应输出类型<String,int>

Reducer:

package wc;

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
/**
 * Reducer组件
 * Reducer组件的输入就是mapper的输出
 * java,3
 *   ↑  ↑
 * Text,IntWritable
 * 指定Reducer组件的输出格式
 * 
 */
public class CountReducer extends Reducer<
Text, IntWritable, Text, IntWritable> {
	@Override
	protected void reduce(Text key, Iterable<IntWritable> values,
			Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
		//定义保存结果int变量
		int res=0;
		//遍历 累加操作
		for(IntWritable value:values){
			res+=value.get();//获取得到当前value值的int类型
		}
		//将结果输出->最终结果文件
		context.write(key, new IntWritable(res));
	}
}

对Mapper得到的键值对累加并写出 (输入输出类型保持不变)

Driver:

package wc;

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;




/**
 * 驱动程序,用来执行MapReduce任务
 * 
 *
 */
public class CountDriver {
	public static void main(String[] args) throws Exception {
		//1.获取配置信息
		Configuration conf=new Configuration();
		//2.创建任务对象
		Job job=Job.getInstance(conf);
		//3.指定mapper组件的相关内容
		job.setMapperClass(CountMapper.class);
		job.setMapOutputKeyClass(Text.class);
		job.setOutputValueClass(IntWritable.class);
		
		//4.指定Reducer组件相关内容
		job.setReducerClass(CountReducer.class);
		job.setMapOutputKeyClass(Text.class);
		job.setOutputValueClass(IntWritable.class);
		
		
		/*FileInputFormat.setInputPaths(job,
				new Path("hdfs://hadoop:9000/mr/wc/in/wordcount"));*/
		//指定输出路径的时候,其实是在指定结果文件存放的目录
		//该目录必须是不存在的
		/*FileOutputFormat.setOutputPath(job, 
				new Path("hdfs://hadoop:9000/mr/wc/in/out"));*/
		
		//5.指定输入输出路径
		FileInputFormat.setInputPaths(job,
				new Path("wordcount"));
		FileOutputFormat.setOutputPath(job, 
				new Path("G:\\count"));
		
		//6.提交job任务
		job.waitForCompletion(true);
	}
}


输出文件在G:\count

文件内容:

c 2
c++ 2
hadoop 1
java 3
mysql 1
php 2
python 2

关注公众号" 编译未来 "

回复 " mapreduce "获得配置信息及更多源码

在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值