初识 Map/Reduce

来源:互联网 发布:电脑cmd打开编程 编辑:程序博客网 时间:2024/05/17 22:52

         刚刚接触hadoop平台三天时间,这三天里由原来的信心百倍变成了现在的无头苍蝇。现在唯一的感觉就是要看要学习的东西太多了。感觉每个知识点里包含了其它你不会的东西,所以就得看A的时候去看B,看B的时候还得学习C。有经验的同事告诉我还是先了解下Map/Reduce再看其它的。那就按着他成功的经历往下走吧。

         首先从http://www.apache.org/dyn/closer.cgi/hadoop/core/ 上下载了hadoop0.20源码。同事说最好的学习方法就是读源码,读完一遍源码后再去看逻辑就不会晕,oh my lady gaga。希望吧  。基于hadoop的Map/Reduce应用程序包括Mapper和Reducer类。以及一个创建jobConf的执行程序。在一些应用程序中还包括Combiner类。它实际也是Reduce的实现。

         (1) Mapper.java : 此类包括一个内部类(Context)和四个方法(setup,run,cleanup,map)。内部类Context继续于MapContext并没有引入任何新的方法。setupcleanup用于管理Mapper生命周期中的资源。setup在完成mapper构造,即将执行map动作前调用。cleanup则在完成所有的map动作后调用。map方法用对一次输入的key,value进行map动作。 run protected void map(KEYIN key, VALUEIN value, Context context) throws IOException, InterruptedException { context.write((KEYOUT) key, (VALUEOUT) value方法执行了上面描述的这一过程。它调用setup,然后迭代所有的key/value键值对,进行map,最后调用cleanup。

       (2)org.apache.hadoop.mapreduce.lib.map中实现了Mapper的三个子类。分别是InverseMapper(将输入<key, value> map为输出<value, key>),MultithreadedMapper(多线程执行map方法)和TokenCounterMapper(对输入的value分解为token并计数),其中最复杂的就是MultithreadMapper。它会地动多个线程执行另一个Mapper的map方法。它会启动mapred.map.multithreadedrunner.threads(配置项)个线程执行。

Mapper:mapred.map.multithreadedrunner.class(配置项)。MultithreadedMapper重写了基类Mapper的run方法,启动N个线程(对应的类为MapRunner)执行mapred.map.multithreadedrunner.class(我们称为目标Mapper)的run方法(就是说,目标Mapper的setup和cleanup会被执行多次)。目标Mapper共享同一份InputSplit,这就意味着,对InputSplit的数据读必须线程安全。为此,MultithreadedMapper引入了内部类SubMapRecordReader,SubMapRecordWriter,SubMapStatusReporter,分别继承自RecordReader,RecordWriter和StatusReporter,它们通过互斥访问MultithreadedMapper的Mapper.Context,实现了对同一份InputSplit的线程安全访问,为Mapper提供所需的Context。这些类的实现方法都很简单。

原创粉丝点击