MapReduce流程讲解以及源码分析
MapReduce流程讲解
一.简介
对于用户来说只需要书写map操作和reduce操作
mapreduce计算数据的时间较长
整个过程分为map和reduce,map负责处理原始数据,reduce负责处理map数据
二.原理分析
1.map过程
block:块-->物理上的概念,默认是128M
split:切片-->本次map任务要处理的数据的大小;默认大小等于block的大小
maptask:map的任务-->一个split对应一个maptask
处理的都是切片数据,属于最原始的数据
kvbuffer:maptask临时结果输出的目的地.它是内存中的一块环形的空间,默认大小是100M;设置阈值,默认大小是80%,达到阈值之后进行溢写
spill:将环形数据缓冲区的临时结果写出到硬盘上;如果文件足够大,那么会溢写出很多的小文件,大概80M左右
partation:分区的数量和reduce的数量完全相同;
溢写的时候回提前计算出key所对应的的分区reduce
sort:排序先按照partation进行排序;然后按照key进行快速排序
merge:就是将溢写的多个小文件合并成一个大文件;使用归并算法,先按照分区,然后按照key进行归并排序
2.reduce
fetch:从maptask节点拉取reduce需要的数据
reducetask:我们必须将key相同临时数据拉取到同一个reducetask中进行计算;一个箱子里可以有不同的key,但是相同key必须在一个箱子里
output:因为每次产生结果不一样,为了防止产生的文件过大出现问题;每次产生的结果会默认存放到HDFS上;
3.搭建MapReduce集群
搭建的环境完全基于HA的环境
修改mapred-site.xml文件
cp mapred-site.xml.template mapred-site.xml
vim mapred-site.xml
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
修改yarn-site.xml文件
vim yarn-site.xml
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>mr_shsxt</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>node03</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>node01</value>
</property>
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>node01:2181,node02:2181,node03:2181</value>
</property>
拷贝配置文件(yarn-mapred)到其他节点
scp mapred-site.xml yarn-site.xml root@node02:pwd
scp mapred-site.xml yarn-site.xml root@node02:`pwd
先启动Zookeeper
zkServer.sh start
zkServer.sh status
启动DFS
start-all.sh( start-dfs.sh start-yarn.sh)
在备用节点输入命令
MapReduce源码分析
1.提交工作至客户端(client)
1.1创建job类
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.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
/**
* 作业类的主类
* @author Administrator
*
*/
public class WordCountJob {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
//获取配置文件对象
Configuration configuration = new Configuration(true);
//创建本次的作业对象
Job job = Job.getInstance(configuration);
//设置作业Jar的主类
job.setJarByClass(WordCountJob.class);
//设置作业的名称
job.setJobName("shsxt-WorkCount");
//设置ReduceTask的数量
job.setNumReduceTasks(3);
//设置输入路径(要处理的文件路径)
FileInputFormat.setInputPaths(job, new Path("/shsxt/java/武动乾坤.txt"));
//设置切片的大小
// CombineTextInputFormat.setMaxInputSplitSize(job, 1024 * 1024 * 100);
// CombineTextInputFormat.setMinInputSplitSize(job, 1024 * 1024 * 1);
//设置输入路径(结果要输出的位置)
FileOutputFormat.setOutputPath(job,
new Path("/shsxt/java/武动乾坤_result" + System.currentTimeMillis()));
//定义Map的输出格式
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
//设置Mapper类
job.setMapperClass(WordCountMapper.class);
//设置Reducer类
job.setReducerClass(WordCountReducer.class);
//提交作业
job.waitForCompletion(true);
}