`
十三月的
  • 浏览: 165339 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

没有Map和reduce的mapReduce:求解MapReduce过程

阅读更多



    用一个10行代码的案例,一个没有map和reduce的类分解Mapreduce过程

  

操作过程:

  1>:创建MapReduce项目,并配置Run Configuration选项中的Argument输入输出路径.如图

   
 

  2>:再看代 

    

public class MyWordCount{
	/**
	 * @param args
	 * @throws IOException 
	 * @throws ClassNotFoundException 
	 * @throws InterruptedException 
	 */
	public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {

		//根据安装的Hadoop夹下conf文件创建对象
		Configuration conf = new Configuration();
		//根据Run Configuration设置下的arguments 下的选项得到输入输出路径
		String [] otherArgs=new GenericOptionsParser(conf, args).getRemainingArgs();
		      
		   if(otherArgs.length!=2){
			    System.err.println("Usage:wordcount <in> <out>");
			      System.exit(2);
		               }
		   
		   //定义一个job
		  Job job=new Job(conf, "My WordCount");
		   //制定输入输出路径
		  FileInputFormat.addInputPath(job,new Path(args[0]));
		  FileOutputFormat.setOutputPath(job, new Path(args[1]));
		  //等待job执行完毕退出
		  System.exit(job.waitForCompletion(true)?0:1);
	}
	
	

	}

 

 

    

 

3>执行结果

 文件源如图:

 
执行结果如图:                                 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

结果分析:

1>事实

源文件有两个,用户没有自己定义任何Map和Reduce的情况下,执行后依旧可以得到MapReduce结果,当然前提是使用了插件创建的是MapReduce项目.并非是一个单纯的Java 项目.

2>过程解析

   第一步:首先使文件会被分为特定大小的split,叫做分区每一个split会对应启动一个task.分别执行的是MapTask和ReduceTask.

   第二步:每一个split首先会被hadoop框架分解成一个个的<key,Value>对,具体是<偏移量,文本行>(偏移量指的是每个文本行的首字母对文件的初始位置的偏移,文本行是以/r/n来判断的). 如此形式:

    <0,zhong nan da xue>

    <14,hu nan da xue>

    <27,shi fan da xue>

   第三步:交由用户自定义的Map处理.以系统的wordcount为例,执行程序中的命令得到的结果是:          <zhong,1>,<nan,1><da,1>,<xue,1>,<hu,1>,<nan,1>.....

  

   第四步:sort过程.即排序.           

  <zhong,list(1)>

  <nan,list(1,1)>

  <da,list(1,1,1)>....

   显然是将文件中有相同的key的进行排序,以这种格式发送给Reduce,有助于解决带宽问题. 

    第五步:shuffle过程,翻译为洗牌过程.顾名思义,洗牌是将牌打乱再分配的过程.对应的是reduce任务取得map任务输出的文件.这个过程是hadoop框架自动实现的,默认是按照hash函数执行的(此处不做深入分析).此过程后就将文件传给了reduce了.

    第六步:执行reduce.还是以wordcount为例.j将list中的数字相加得到:

     <zhong,1>

     <nan,2>

     <da,3>....

 

分析本案例:

     本案例中没有定义任何map和reduce,得到了上述的结果是因为没有执行用户自定义的map和reduce,所以是以第二步之后的结果形式展现的,这是默认的形式.

    以上只是很概括的展现了map和reduce的过程,还有很多细节值得深入,未完待续.....

 

         

    

      

              

              

     

     

 

 

 

 

 

  • 大小: 39.9 KB
  • 大小: 73 KB
  • 大小: 86.4 KB
2
0
分享到:
评论
2 楼 十三月的 2012-02-08  
小篮子java的家 写道
,默认是按照hash函数执行的(此处不做深入分析).不是叫parting嘛?求解·····

其实上面写的不够严密,按照权威指南的原版介绍

The term shuffle is actually imprecise, since in some contexts it refers to only the part of the process where map outputs are fetched by reduce tasks. In this section, we take it to mean the whole process from the point where a map produces output to where a reduce consumes input.

按照此处的理解 首先进行的是partition,之后是sort和spill to disk.再然后是ferch过程。hash是在partition执行的,所以上面讲的shuffle不是太合理的。
1 楼 小篮子java的家 2012-02-07  
,默认是按照hash函数执行的(此处不做深入分析).不是叫parting嘛?求解·····

相关推荐

Global site tag (gtag.js) - Google Analytics