MapReduce应用场景
MapReduce特点:易于变成;良好的扩展性;高容错性;适合PB级以上海量数据的离线处理
不适合:
实时计算
像MySQL一样,在毫秒级或者在秒级内返回结果
流式计算
MapReduce的输入数据集是静态的,不能动态变化
MapReduce自身的设计特点决定了数据远必须是静态的
DAG计算
多个应用程序存在依赖关系,后一个应用程序的输入和前一个输入
MapReduce编程模型
内部实现
MapReduce将作业的整个运行过程分为两个阶段:Map阶段和Reduce阶段
Map阶段由一定数量的Map Task组成
输入数据格式解析:InputFormat
输入数据处理:Mapper
数据分组:Partitioner
Reduce阶段由一定数量的Reduce Task组成
数据远程拷贝
数据按照key排序
数据处理:Reducer
数据输出格式:OutputFormat
InputFormat
文件分片(InputFormat)方法
处理跨行问题
将分片数据解析成key/value对
默认实现时TextInputFormat
TextInputFormat
Key是行在文件中的偏移量,value是行内容
若行被截断,则读取下一个block的前几个字符
Blcok
HDFS中最小的数据存储单位
默认是64MB
Spit
MapReduce中的最小的计算单元
默认与Block一一对应
Block与Split
Split与Block的对应关系是任意的,可由用户控制
Combiner可看作local reducer
合并相同的key对应的value(wordcount例子)
通常与Reducer逻辑一样
好处
减少Map Task输出数据量(磁盘IO)
减少Reduce-Map网络传输数据量(网络IO)
如何正确使用
结果可累加
Sum(YES!),Average(NO!)
Partitioner决定了Map Task输出的每条数据
交给哪个Reduce Task处理
默认实现:hash(key)mod R
R是Reduce Task数目
允许用户自定义
很多情况需自定义Partitioner
比如“hash(hash(hostname(URL)) mod R”确保相同域名的网页交给同一个Reduce Task处理
MapReduce架构
JobTracker