Hadoop原理之——MapReduce原理

Hadoop 3个核心组件:

分布式文件系统:Hdfs——实现将文件分布式存储在很多的服务器上(hdfs是一个基于Linux本地文件系统上的文件系统)点击查看(Hadoop原理之——HDFS原理)

分布式运算编程框架:Mapreduce——实现在很多机器上分布式并行运算

分布式资源调度平台:Yarn——帮用户调度大量的mapreduce程序,并合理分配运算资源

 

什么是MapReduce?

MapReduce是一种编程模型,其理论来自Google公司发表的三篇论文(MapReduce,BigTable,GFS)之一,主要应用于海量数据的并行计算。

1、MapReduce是一种分布式批处理(离线计算)计算框架,由Google提出,解决了海量数据的计算问题。

2、MapReducesh是由两个阶段组成:Map和Reduce,用户只需要实现两个函数:map()与reduce(),即可实现分布式计算,非常简单。这两个函数都是key、value对,表示函数的输入信息。

3.MapReduce输入数据来源于HDFS,输出数据到HDFS。

 

MapReduce原理

执行过程

1、Map任务处理

1)、按行读取输入文件的内容,解析成Key、Value对的形式,每一行调用一次map()函数。

2)、写自己的逻辑,对输入的key,value处理转化成新的key、value对输出。

3)、对输出的Key,value对ji进行分区,(默认分区方法为哈希值取模,key相同的数据会分到同一个Reduce区),分区是为了解决数据的不均衡,解决负载问题。

4)、对不同分区的数据进行排序。(key的字典排序)

2、Reduce任务处理

1)、对于多个不同Map任务的输出,按照不同的分区,通过网络copy到不同的Reduce节点。

2)、到达同一个分区的数据进行合并,排序,写Reduce自己的逻辑,将sh数据转化成新的key、value对。

3)、将新的数据上传到HDFS中。

MapReduce编程之基本数据类型

BooleanWritable 布尔型

ByteWritable bite型

DubleWritable 双精度浮点型

FloatWritable  单精度fu'd浮点型

IntWritable  整型  

LongWritable 长整型

Text  字符串类型

NullWritable 空类型

自定义数据类型

MapReduce编程之环境配置

1、创建工程

2、引入依赖jar到classpath

3、修改YarnRunner.java($HADOOP_HOME\src\hadoop-mapreduce-project\hadoop-mapreduce-client\hadoop-mapreduce-client-jobclient\src\main\java\org\apache\hadoop\mapred) (在src下添加)

4、 替换本地执行文件($HADOOP_HOME/bin) (添加驱动文件)

(3、4需要的配置文件:链接:https://pan.baidu.com/s/1tl05sP0LxhWwLSvXm3-HiQ 密码:1iu8)

5、 修改本地配置文件($HADOOP_HOME/etc/hadoop) (修改配置文件,添加到src下,与HDFS配置相同)

6、配置本地环境变量

          

MapReduce编程之WordCount(默认)

1、MapReduce编程之Mapper实现

package cn.Vdata.CSDN.WordCount;

import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

/*
 * MapReduce编程之Mapper实现
 */

public class WordCountMap extends Mapper<Object, Text, Text, IntWritable>{
	/*
	 * 重写map()方法
	 * @see org.apache.hadoop.mapreduce.Mapper#map(KEYIN, VALUEIN, org.apache.hadoop.mapreduce.Mapper.Context)
	 */
	@Override
	protected void map(Object key, Text value, Mapper<Object, Text, Text, IntWritable>.Context context)
			throws IOException, InterruptedException {
		IntWritable I = new IntWritable(1); //向下输出时用
		//读取传进来的数据
		String line = value.toString();
		//按照逻辑处理数据
		String[] words = line.split(" ",-1);  /* 将数据以空格为分割符分割,-1代表无限制,即最大化 */
		//对数据进行处理
		if(words != null && words.length != 0) {
			//遍历单词数组
			for (String word : words) {
				if(word != null){
					context.write(new Text(word), I);
				}
			}
		}
	}
}

二、MapReduce编程之Reducer实现

package cn.Vdata.CSDN.WordCount;

import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
/*
 * MapReduce编程之Reducer实现
 *  
 * 	在此过程前,Map中的数据已经进行分区(默认的哈希值取模,相同的数据一定到了相同的Reduce区),      并进行排序  
 * 	
 *  	Shuffle过程(洗牌过程):把数据从Map的输出导入到负责Reduce的程序的过程,在这个过程中每      个Map将分好的数据溢写在硬盘中,
 *  在硬盘中按照分区合并的数据(到达同一个分区,数据一定相同),将所有的Map所分的相同的数据到达一个分区,传给Reduce,然后合并
 * 
 */
public class WordCountReduce extends Reducer<Text, IntWritable, Text, IntWritable>{
	@Override
	protected void reduce(Text key, Iterable<IntWritable> value,
			Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
		int num = 0;
		//统计,累计单词出现的次数
		for (IntWritable tmpnum : value) { 
			num+=tmpnum.get(); /* 调用get()方法使得IntWritable对象转化成int数据类型 */
		}
		//利用context将数据写出去(HDFS上)
		context.write(key, new IntWritable(num)); 
	}
}

三、MapReduce编程之Driver实现

package cn.Vdata.test.WordCount;

import java.io.IOException;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.Job;
import com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider.Text;

public class WordCountDriver {
	public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
		// 开启权限
		System.getProperty("HADOOP_USER_NAME", "root");
		// 输入路径
		String InputPath = "/gyb/wordcount/input";
		// 输出路径
		String OutputPath = "/gyb/wordcount/output";
		// 创建Job实例
		Job job = Job.getInstance();
		// 设置job名称
		job.setJobName("WordCount");
		// 生成jar包
		job.setJar("C:\\Users\\lenovo\\Desktop\\wordcount.jar");
		// 设置驱动类
		job.setJarByClass(WordCountDrive.class);
		// 设置Mapper类
		job.setMapperClass(WordCountMap.class);
		// 设置Reducer类
		job.setReducerClass(WordCountReduce.class);
		// 设置Reducer类的输出类型
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(IntWritable.class);
		// 设置Mapper类的输出类型
		job.setMapOutputKeyClass(Text.class);
		job.setMapOutputValueClass(IntWritable.class);
		// 设置输入路径
		FileInputFormat.addInputPath(job, new Path(InputPath));
		FileOutputFormat.setOutputPath(job, new Path(OutputPath));
		// 检测结束
		System.exit(job.waitForCompletion(true) ? 0 : 1);
	}
}

四、执行

1)、直接在eclipse上执行

2)、生成jar包,在Linux下执行。执行命令:hadoop jar wordcount.jar

 

后续发布与MapRudece相关的大数据实验

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值