1. MapReduce的几个特点:
易编程,良好的扩展性,高容错性
适合海量数据的离线处理
2. 应用场景:
简单的数据统计、搜索引擎建索引、海量数据查找、复杂数据分析算法实现
3. MapReduce的主要几个过程
Input->splitting->mapping->shuffling->reducing->output
4. map阶段:由一定数量的Map Task组成,而 Map Task通常包括input,splitting,mapping及shuffling的一部分
spliting阶段:
从HDFS的中输入数据,将各block对应成map task可读取的split(mapreduce中最小的计算单元,默认与block一一对应,可修改)。
mapping阶段:
对输入的split进行格式解析(InputFormat),解析成key/value对(key是行在文件中的偏移量,value是行内容)。
通过MapReduce提供的Partitioner接口,决定map task输出的每条数据交给哪个reduce task处理,默认通过hash(key) mod R实现,用户可以根据需求自定义
map task将生成的key/value对以及partition写入内存缓冲区,通常我们在配置文件中设置缓冲区大小buffer size,同时设置一个溢写spill percent,当缓冲区的数据超过buffer size*spill percent时,启动一个spill线程这一部分数据写入磁盘中,溢写前先按key对其排序。并且可以同步地向buffer写入数据(剩余buffer size*(1-spill percent))
如果设置了combiner(本机reducer),在spill到磁盘之前,运行combiner函数去合并相同的key对应的value,可以减少map task输出数据量(磁盘IO)及减少map->reduce网络传输数据量(网络IO)。hadoop文档中说明即使设置了combiner,也有可能不被执行
每次溢写只能生成一个buffer size*spill percent的文件,map的结果通常由多个spill文件组成。系统使用merge函数对多个spill文件按key合并成一个文件,key/value变成key/group。
reduce阶段:由一定数量的Reduce Task组成,每个reduce task包括一部分shuffling,reducing,output组成
每个reduce task启动溢写数据copy线程(Fetcher)远程拷贝各个map task的最终溢出文件(保存在硬盘上)对应的数据。
采用同map task中merge同样的过程,数据来源于不同的map task,不断对copy过来的数据进行merge,最终形成一个文件(可能保存在内存中,也可能保存在磁盘中)
reducing:对merger后的最终文件进行数据处理reduce,执行编写的reduce函数,将结果写入HDFS中
5. mapreduce 2.XX配置文件/etc/hadoop/mapred-site.xml的几个主要参数
mapreduce.framework.name #yarn
mapreduce.jobtracker.http.address #master:50030
mapreduce.jobtracker.address #master:9001
mapreduce.jobhistory.address #JobHistory Server地址 master:10020
mapreduce.jobhistory.webapp.address #JobHistory Server Web界面地址 master:19888
mapreduce.map.sort.spill.percent #内存缓冲区溢出阀值 0.8
mapreduce.task.io.sort.mb #内存缓冲区大小 100
6. 数据本地性:任务运行在它将处理的数据所在的节点,则该任务具有“数据本地性”
7. 推测执行机制:
作业完成时间取决于最慢的任务完成时间,任务处理速度慢的任务,启动一个备用任务同时任务,谁先运行完,则采用谁的结果
任务间存在严重的负载倾斜,不能启用
特殊任务,比如向数据中心写数据,不能启动
8. mapreduce三种编程方式:
java:最原始的方式
hadoop streaming :支持多语言(shell、python等)
hadoop pipes:支持c/c++
本文出自 “大废” 博客,请务必保留此出处http://bigtrash.blog.51cto.com/8966424/1833842
原文地址:http://bigtrash.blog.51cto.com/8966424/1833842