Hadoop 键值对的mapreduce过程剖析

来源:互联网 发布:深入php 编辑:程序博客网 时间:2024/06/05 09:51

    Hadoop的Mapreduce是一个分布并行处理大数据的程序框架,一个Map/Reduce 作业(job) 通常会把输入的数据集切分为若干独立的数据块,由 map任务(task)以完全并行的方式处理它们。框架会对map的输出先进行排序, 然后把结果输入给reduce任务。通常作业的输入和输出都会被存储在文件系统中。

            MapReduce程序是通过键值对来操作数据的,其单个输入输出形式如下:

                              map: key1,value1 ----> list(key2,value2)

                              reduce: (key2,list(value2))----> key3,value3

一、Mapreduce操作的数据也是保存在文件系统HDFS上,InputFormat接口定义的就是如何读取文件和分割文件提供分片给mapper,TextInputFormat文本格式输入 是InputFormat的默认实现类                   

        它主要负责:

                1. 把输入文件切分成多个逻辑InputSplit实例, 并把每一实例分别分发给一个 Mapper.

                 2.提供RecordReader的实现,这个RecordReader从逻辑InputSplit中获得输入记录, 这些记录将由Mapper处理

二、在input输入的进来的(key1,value1)经过mapper处理变成list(key2,value2),可由combiner进行进行一次本地聚合,减少mapper输出的list(key2,value2)的数量

三、对于mapper的的结果,然后在经过shuffle阶段由partitioner定义如何分配(key,value)给reducer作为输入(key2,list(value2))进行最后的合并,得到输出结果(key3,value3)

四、与InputFormat对应,如何将mapreduce的结果输出是由OutputFormat接口来定义的,每个reducer将自己的输入写入自己的文件中,而RecordWriter对象将输出结果进行格式化的

[plain] view plain copy
  1. 摘自官方文档上的WordCount数据示例部分来分析下mapreduce中(key,value)是如果分解合并的  
  2. 文件file0:  Hello World Bye World   
  3.    file1:  Hello Hadoop Goodbye Hadoop  
  4.   
  5. 第一个输入,默认的采用TextInputFormat的map输入 (key:一行的字节偏移 value:就是这行的内容)  
  6. 输出是:  
  7. < Hello, 1>  
  8. < World, 1>  
  9. < Bye, 1>  
  10. < World, 1>  
  11. 第二个输入,map输出是:  
  12. < Hello, 1>  
  13. < Hadoop, 1>  
  14. < Goodbye, 1>  
  15. < Hadoop, 1>  
  16.   
  17. Map运行之后,会对输出按照key进行排序,然后把输出传递给本地的combiner(按照作业的配置与Reducer一样),进行本地聚合,数据不会在节点上传输的  
  18. 所以第一个map的输出会变成:  
  19. < Bye, 1>  
  20. < Hello, 1>  
  21. < World, 2>  
  22. 第二个map的输出会变成:  
  23. < Goodbye, 1>  
  24. < Hadoop, 2>  
  25. < Hello, 1>  
  26. 然后在经过shuffle阶段把map的结果传给Reducer,将每个key(本例中就是单词)出现的次数求和,节点间的  
  27. 数据交换就是在shuffle阶段的,至于每个(key,value)是如何分配给不同的reduce是通过Partitioner指定的,默认采用的是HashPartitioner。  
  28. 最后这个作业的输出就是:  
  29. < Bye, 1>  
  30. < Goodbye, 1>  
  31. < Hadoop, 2>  
  32. < Hello, 2>  
  33. < World, 2>  


原创粉丝点击