第五部分:MapReduce Shuffle过程

###Shuffle概念

  • 意思:洗牌或弄乱
  • Collections.shuffle(List):随机地打乱参数list里的元素顺序
  • MapReduce里Shuffle:描述着数据从map task输出到reduce task 输入的这段过程

第五部分:MapReduce Shuffle过程_第1张图片

第五部分:MapReduce Shuffle过程_第2张图片



过程:
	-step 1:
		设置一个输入input数据 
			InputFormat
				读取数据,按行形成转换成
			FileInputFormat
				-TextInputFormat
	-step 2:
		map
			ModuleMapper
				map(KEYIN,VALUEIN,KEYOUT,VALUEOUT)
			-默认情况下
				KEYIN: LongWritable
				VUALEIN: TEXT
	
	========================================================
-step 3:	
		shuffle
			-process
				-map,output
					开始是放在内存memory中的,当内存满了
					就会spill,溢写到磁盘中
					往内存中写的过程中做两件事情:
					一是分区 partition(分区对应reduce);
					二是排序sort。
				
				map输出结束后,磁盘中很多小文件,然后,
				对这些文件进行合并,合并也需要排序,
				最后合并成一个大文件
					大文件--->Map任务运行的机器的本地磁盘
				----------------------------------------
			     
				Reduce Task通过网络, 
				会到Map Task运行的机器上,拷贝要处理的数据
				拷贝来了后,进行合并,排序
				拷贝完了,合并完了后进行分组group
				将相同Key的value放在一起
========================================================
最后交给reduce任务的reduced方法去处理
			总的来说:
				-分区
					partitioner
				-排序
					sort
				-copy -- 用户无法干涉
					拷贝
				-分组
					group

				-可设置
					-压缩
						compress -可设置
					-combiner
						Map Task端的Reduce





	-step 4:
		reduce
			reduce(KEYIN,VALUEIN,KEYOUT,ALUEOUT)
			map输出数据类型与reduce输入一致
	-step 5:
		output
			OutputFormat
		FileOutputFormat
			TextOutputFormat
			每个对,输出一行,key与value中间分隔符为\t,默认调用key 和Value的toString()
	
			Map-01
			Map-02
			Map-03

设置分区

1)patitioner
job.setPartitionerClass(cls)

设置排序

2)sort
job.setSortComparatorClass(cls);

设置combiner

3)optional ,combiner
job.setCombinerclass(cls)

设置分组

4)group
job.setGroupingCompatorClass(cls)

设置压缩

可以在配置文件中设置下面俩个属性
mapreduce.output.fileoutputformat.compress	false	
mapreduce.output.fileoutputformat.compress.type	RECORD

也可以在Configeration设置
Configuration confg = new Configuration();
confg.set("mapreduce.output.fileoutputformat.compress",true);
confg.set("mapreduce.output.fileoutputformat.compress.typ","org.apache.hadoop.io.compress.SnappyCodec");

###MapReduce 调优

  • Reduce Task Number
  • Map Task 输出压缩
  • Shuffle Phase 参数
Reduce的个数默认1
通过如下代码设置:
job.setNumReduceTasks();

设置reduce的个数,通过测试评估: 看运行时间
mapreduce.task.io.sort.factor 10 The number of streams to merge at once while sorting files. This determines the number of open file handles.
mapreduce.task.io.sort.mb 100 The total amount of buffer memory to use while sorting files, in megabytes. By default, gives each merge stream 1MB, which should minimize seeks.
mapreduce.map.sort.spill.percent 0.80 The soft limit in the serialization buffer. Once reached, a thread will begin to spill the contents to disk in the background. Note that collection will not block if this threshold is exceeded while a spill is already in progress, so spills may be larger than this threshold when it is set to less than .5
mapreduce.map.cpu.vcores 1 The number of virtual cores required for each map task.
mapreduce.reduce.cpu.vcores 1 The number of virtual co

经验:
需求,数据不写入缓存可以调下面两个参数
mapreduce.task.io.sort.mb |100
mapreduce.map.sort.spill.percent| 0.80
调参数:0.8–>0.1

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