MapReduce实际操作

MapReduce

1. 简介

1.1 MapReduce是Hadoop中进行分布式计算的框架
1.2 MapReduce会将整个计算拆分为

MapReduce在计算的时候,会将要处理的文件进行切片,注意:切片和切块不一样
Map阶段:每一个切片都会对应一个MapTask
在这里插入图片描述
在这里插入图片描述
初步理解:MaoReduce在处理数据时,会将数据切分成片
Map阶段

  1. MapReduce在处理数据时,会将数据切分成片
  2. 数据将会被分片处理,处理的出来的数据类型是:键值对(k,v)
  3. 多个分片处理完结果后,将相同的键对应,以及他们的值放到一组
    Reduce阶段
    键这些Map的数据交给Reduce处理,Reduce将数据进行汇总

2.实际操作

代码实现:
结构图:
在这里插入图片描述
WordCountMapper.java

package MapRduces01;
/**
 * 代码实现功能,统计字符串
 */
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;

public class WordCountMapper 
		extends Mapper<LongWritable,Text,Text,IntWritable> {
	/*
	 * Mapper是Hadoop的顶级父类
	 * Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>
	 * MapReduce要求被传输的类型必须能够被序列化
	 * MapReduce的序列化机制默认使用的是AVRO
	 * KEYIN:输入键的类型,现阶段这个泛型表示行偏移量,是以字节来计算的
	 * VALUEIN:指的是输入类型的值,现阶段表示读取这一行的数据
	 * KEYOUT:输出的键的类型
	 * VALUEOUT:输出的值的类型
	 */
	
	protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context)
			throws IOException, InterruptedException {
		/*
		 * key:行偏移量
		 * value:读取的一行数据
		 * context:环境参数,利用这个参数将结果输出给Reduce
		 * 数据存放在value中
		 */
		
		//将value转成字符串,对空格进行划分
		String[] arr = value.toString().split(" ");
		for (String str : arr) {
			//Map阶段的键值对
			context.write(new Text(str), new IntWritable(1));
		}
		
	}
}

WordCountReducer.java

package MapRduces01;

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

public class WordCountReducer 
			extends Reducer<Text, IntWritable, Text, IntWritable>{
	/*
	 * Reducer<K, V, K, V>
	 * 用来收集Map的结果
	 * key = hello
	 * value = 1,1,1,1,1,1
	 */
	
	@Override
	protected void reduce(Text key, Iterable<IntWritable> values,
			Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
		// Reducer在计算过程中自动的将相同的键对应的值放在一起
		// 将这一组值转化为一个迭代器values
		int sum = 0;
		//遍历这个迭代器,求和
		for (IntWritable val : values) {
			sum += val.get();
		}
		context.write(key, new IntWritable(sum));
	}
	
}

WordCoutDriver.java

package MapRduces01;

import java.io.IOException;

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;


/*
 * 定义完Map类,Reduce类后,我们需要定义一个入口类
 */
public class WordCountDriver {
	public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
		
		//向MapReduce申请一个任务用于执行程序
		Job job = Job.getInstance();
		
		//申请完成后,设置Mapper类
		job.setMapperClass(WordCountMapper.class);
		
		//设置Reducer类
		job.setReducerClass(WordCountReducer.class);
		
		//设置驱动类
		job.setJarByClass(WordCountDriver.class);
		
		//设置Map的执行结果类型
		job.setMapOutputKeyClass(Text.class);
		job.setMapOutputValueClass(IntWritable.class);
		
		//设置Reducer的执行结果类型
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(IntWritable.class);
		
		//设置输入的文件
		FileInputFormat.addInputPath(job, new Path("hdfs://10.42.103.110:9000/txt/words.txt"));
		
		//设置输出的路径
		//要求输出的路径不存在,有result下面的路径会自动创建
		FileOutputFormat.setOutputPath(job, new Path("hdfs://10.42.103.110:9000/result/wordcount"));
		
		//提交事务,等待结束
		job.waitForCompletion(true);
	}
}

HDFS中的文件结构是:
在这里插入图片描述

由于Windows对hadoop兼容不是很好,所以需要配置windows

在这里插入图片描述

运行win***会出现一个黑框一闪而过,说明成功!!!
否则会出现一下结果,缺少****.dll文件,说明的你的系统是盗版的,这时候把备用的dll文件放到系统文件中

在这里插入图片描述
解决办法:
在这里插入图片描述

此外,还需要配置两个环境变量
不要在path中写%HADOOP_HOOM%\bin
hadoop不兼容这种写法

在这里插入图片描述

自己配置Path,就是hadoop路径后面加bin

在这里插入图片描述

在src中加入日志文件会打印更多信息

在这里插入图片描述

运行成功

在这里插入图片描述
其中源码资源以及配置资源,请留言获取,留邮箱~
欢迎大家留言交流

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值