大数据(七)Hadoop-MapReduce
一、MApReduce概念
MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念"Map(映射)"和"Reduce(归约)",是它们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。 当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(归约)函数,用来保证所有映射的键值对中的每一个共享相同的键组。
二、MapReduce核心概念
移动计算,而不是移动数据
三、MapReduce框架图
上图描述如下
步骤一:切割HDFS中的block,切割完毕后会得到每一个block的很多个数据片段;按照键值对格式将数据传递给第二步。
步骤二:map是由我们根据具体的需求编写的程序,有多少个数据片段就有多少个map任务被执行。map任务实际上就是一个java的线程,且一定线程安全。输出键值对格式的数据;
步骤三(洗牌):将步骤二map输出的数据进行排序、分组、合并、拷贝等一系列操作后将数据传递给步骤四;
步骤四(reduce):洗完牌的数据全部传递给一个reduce(默认情况下reduce在一次计算中只有一个,我们可以对其进行设定。需要注意的是,reduce数量并不是越大越好,要恰到好处才是最优。)。
四、MapReduce框架计算过程举例
需求:统计文件中每一个单词出现的次数
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过程
上图中:
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))
这个公式也表示了,碎片大小最大不能超过块大小。