BigBroteher的大数据之旅 Day 9 yarn原理图 && wordcount

Yarn

1 模块介绍
YARN:负责资源管理和调度
MRAppMaster:负责任务切分、任务调度、任务监控和容错等
MapTask/ReduceTask:任务驱动引擎,与MRv1一致
每个MapRduce作业对应一个MRAppMaster
MRAppMaster任务调度
YARN将资源分配给MRAppMaster
MRAppMaster进一步将资源分配给内部的任务
MRAppMaster容错
失败后,由YARN重新启动
任务失败后,MRAppMaster重新申请资源
2 yarn流程
BigBroteher的大数据之旅 Day 9 yarn原理图 && wordcount_第1张图片
BigBroteher的大数据之旅 Day 9 yarn原理图 && wordcount_第2张图片
补充
1 Job对象的submit方法创建了一个内部的JobSubmitter实例并调用该实例的submitJobInternal方法。一旦提交了作业,waitForCompletion方法每秒钟轮询作业的执行进度,如果进度发生了变化,则向控制台报告进度。当作业成功完成,展示作业计数器的数据。否则展示作业失败的错误日志信息。
2 application master会为作业中所有的map任务以及reduce任务向resourcemanager请求容器。为map任务的请求会首先进行并且相对于reduce任务请求有更高的优先级。当map任务完成率达到了5%之后才会为reduce任务发送容器请求。
3 reduce任务可以运行于集群中的任意位置,而map任务会有本地读取数据的限制。移动计算而不是数据。数据本地。次之为机架本地。
4 请求会指定每个任务需要的内存和cpu资源。默认情况下为每个map任务或reduce任务分配1024MB的内存和一个虚拟核心。这些值对于每个作业都是可以配置的:mapreduce.map.memory.mb,mapreduce.reduce.memory.mb,mapreduce.map.cpu.vcores以及mapreduce.reduce.cpu.vcores
5 只有MRAppMaster才有能力,分配计算资源,所以要开启它
6 waitForCompletion方法之前的代码是在MRAppmaster上运行的,对应第6步

编写自己的wordcount程序

BigBroteher的大数据之旅 Day 9 yarn原理图 && wordcount_第3张图片
mainclass

package com.bjsxt.mr.wordcount;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
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;

public class MainClass {

	public static void main(String[] args) throws Exception {
		
		//创建配置文件
		Configuration conf = new Configuration(true);
		Job job = Job.getInstance(conf);
		
		//设置 程序主入口
		job.setJarByClass(MainClass.class);
		//设置作业名称
		job.setJobName("疯狂数一数");
		
		//指定输入输出路径
		Path inputPath = new Path("/usr/test2.txt");
		FileInputFormat.addInputPath(job, inputPath);
		Path outputPath = new Path("/usr/wc/ouput");
		FileOutputFormat.setOutputPath(job, outputPath);
		
		//指定mapper类
		job.setMapperClass(WCMapper.class);
		job.setReducerClass(WCReducer.class);
		
		//map输出格式
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(LongWritable.class);
		
		//开发人员指定reducer个数,每个reducer对应一个文件
		job.setNumReduceTasks(2);
		//提交作业
		job.waitForCompletion(true);
		
	}

}

WCMapper

package com.bjsxt.mr.wordcount;

import java.io.IOException;

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

public class WCMapper extends Mapper{
	
	private Text outKey = new Text();
	private LongWritable outValue = new LongWritable();
	
	@Override
	protected void map(LongWritable key, Text value,
			Mapper.Context context)
			throws IOException, InterruptedException {
		
		String line =value.toString();
		
		//用空格进行切分
		String [] words = line.split(" ");
		//遍历 words
		for(String word: words){
			outKey.set(word);
			outValue.set(1);
			// 
			//
			context.write(outKey, outValue);
		}
	}
	
	
	
}

WCReducer

package com.bjsxt.mr.wordcount;

import java.io.IOException;
import java.util.Iterator;

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

public class WCReducer extends Reducer{
	private LongWritable outValue = new LongWritable();

	@Override
	protected void reduce(Text arg0, Iterable arg1,
			Reducer.Context arg2)
			throws IOException, InterruptedException {
		// TODO Auto-generated method stub
		//key idicate the time word shows
		long sum = 0;
		
		Iterator itera = arg1.iterator();
		
		while(itera.hasNext()){
			LongWritable va =itera.next();
			long num = va.get();
			sum +=num;
		}
		outValue.set(sum);
		arg2.write(arg0, outValue);
	}
	
	
}

你可能感兴趣的:(大数据)