mapreduce框架学习

Map和Reduce阶段都是分离的

map阶段–程序mapTask

mapTask可以运行在多个服务器上面,具体启动的数量取决于数据的数量。将文件化分给不同的mapTask的过程叫做切片。

因为每个文件的大小不一致,所以并不是单纯的按照文件的个数进行分配。所以其实是将文件分为一些固定大小的数据块,并且将数据块分配给不同的map程序。

首先是对文件的大小进行扫描,之后根绝文件的整体的大小启动相应数量的map程序

需要给map程序提供一个接口类,map将数据直接传给接口类,之后接口类处理完的数据内容再递交给mapTask使用context。

reduce阶段–程序ReduceTask

mapTask所处理的数据需要提供给reduce程序,能把相同Key的数据给一个程序就可以完成对于某一个单词的统计。

shuffle程序将key相同的kv数据一定发给同一个reduce程序。

分发给reduce的过程是固定的框架完成的,但是reduce里面需要的逻辑需要使用者提供给框架,这个也是需要实现一个接口的实现类。

reduce会得到一些数据,统计其中所有属于同一个key的数量。

使用MapReduce完成一次wordcount的过程

reduce和map都需要通过继承hadoop所提供的类,并且重载其中的函数。

public class WordCounter extends Mapper<KEYIN,VALUEIN,KEYOUT,VALUEOUT>{

}

Mapper还有Reducer里面有四个模板类型需要完善

  • KEYIN: 是map task读取到的数据的key的类型,是一行的起始偏移量Long。
  • VALUEIN: 是map task读取到的数据的value的类型,是一行的内容String。
  • KEYOUT:是用户的自定义map方法要返回的结果kv数据的key的类型,在wordcount逻辑中,我们需要返回的是单词String。
  • VALUEOUT: 是用户的自定义map方法要返回的结果。kv数据的value的类型,在wordcount逻辑中,我们需要返回的是整数Integer。

在mapreduce中,map产生的数据需要传输给reduce,需要进行序列化和反序列化,而jdk中的原生序列化机制产生的数据量比较冗余,就会导致数据在mapreduce运行过程中传输效率低下。

所以hadoop专门设计了自己的序列化机制,那么mapreduce中传输的数据类型就必须实现hadoop自己的序列化接口

hadoop为jdk中的常用基本类型Long String Integer Float等数据类型封住了自己的实现了hadoop序列化接口的类型:LongWritable,Text,IntWritable,FloatWritable

public class WordcountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{
	
	@Override
	protected void map(LongWritable key, Text value, Context context)
			throws IOException, InterruptedException {

		// 切单词
		String line = value.toString();
		String[] words = line.split(" ");
		for(String word:words){
			context.write(new Text(word), new IntWritable(1));
			
		}
	}
}

public class WordcountReducer extends Reducer<Text, IntWritable, Text, IntWritable>{
		
	@Override
	protected void reduce(Text key, Iterable<IntWritable> values,Context context) throws IOException, InterruptedException {
		
		int count = 0;
		
		Iterator<IntWritable> iterator = values.iterator();
		while(iterator.hasNext()){
			
			IntWritable value = iterator.next();
			count += value.get();
		}		
		
		context.write(key, new IntWritable(count));
		
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章