一、MApReduce概念

        MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念"Map(映射)"和"Reduce(归约)",是它们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。 当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(归约)函数,用来保证所有映射的键值对中的每一个共享相同的键组。

二、MapReduce核心概念

        移动计算,而不是移动数据

三、MapReduce框架图

       

hadoop mapreduce 如何debug_数据传递

        上图描述如下

                步骤一:切割HDFS中的block,切割完毕后会得到每一个block的很多个数据片段;按照键值对格式将数据传递给第二步。

                步骤二:map是由我们根据具体的需求编写的程序,有多少个数据片段就有多少个map任务被执行。map任务实际上就是一个java的线程,且一定线程安全。输出键值对格式的数据;

                步骤三(洗牌):将步骤二map输出的数据进行排序、分组、合并、拷贝等一系列操作后将数据传递给步骤四;

                步骤四(reduce):洗完牌的数据全部传递给一个reduce(默认情况下reduce在一次计算中只有一个,我们可以对其进行设定。需要注意的是,reduce数量并不是越大越好,要恰到好处才是最优。)。

四、MapReduce框架计算过程举例

        需求:统计文件中每一个单词出现的次数

       

hadoop mapreduce 如何debug_数据传递_02

        1、Input:元文件

        2、Splitting:将元文件切割为block

        3、Mapping:数据进行分析(统计属于自己的碎片段的文件中每个单词的键值对数据,【键:单词   值:出现次数】)

        4、Shuffling:洗牌。对map输出的数据进行排序(字典序)和分组(按照键分组)

        5、Reducing:接收数据,累加

        6、Final result:得到结果

五、MapReduce中的Mapper

        – Map-reduce的思想就是“分而治之”
            • Mapper负责“分”,即把复杂的任务分解为若干个“简单的任务”执行
        – “简单的任务”有几个含义:
            • 数据或计算规模相对于原任务要大大缩小;
            • 就近计算,即会被分配到存放了所需数据的节点进行计算;
            • 这些小任务可以并行计算,彼此间几乎没有依赖关系

六、MapReduce中的Reduce

     – 对map阶段的结果进行汇总。
     – Reducer的数目由mapred-site.xml配置文件里的项目mapred.reduce.tasks决定。缺省值为1,用户可以覆盖之

七、MapReduce中的shuffler

      – 在mapper和reducer中间的一个步骤
      – 可以把mapper的输出按照某种key值重新切分和组合成n份,把key值符合某种范围的输出送到特定的reducer那里去处理
      – 可以简化reducer过程

   

hadoop mapreduce 如何debug_数据_03

       上图中:

            1、map将我们程序处理的键值对传递给reduce内存

            2、内存大小有限(一般设置为32或64MB),满了之后会写入磁盘

            3、写入磁盘后会有一个partitions程序,其做用是

                    •对数据进行分区后根据数据的分区号将数据传递给不同分区的reduce。

                            我们之前说了,默认是一个reduce。分区号的产生算法是:键值的HASH值对reduce数量取模。

                            (注:任何一个数字模n就有n种可能,因此这种算法产生的分区号数量刚好等于reduce数量,因此便可以根据分区号将数据分配到某一个reduce task中)

                    •排序

                          通过键的ASCII排序

            4、磁盘数据慢慢多了之后会将其合并为一个大数据

            5、fetch:将第一阶段的洗牌数据按照分区号  抓 到reduce端

            6、Sort Phase:对抓过来的数据再次排序;排序后进行分组

            7、将每一组数据传递给reduce计算

            8、得到计算结果

八、MapReduce中的split

MapReduce的 Split大小
               – max.split(100M)
               – min.split(10M)
               – block(64M)
               – max(min.split,min(max.split,block))

        这个公式也表示了,碎片大小最大不能超过块大小。