hadoop学习之路----MapReduce原理与基本架构总结(第三讲)
MapReduce特点
易于编程(熟悉之后确实很简单,大多数是map和reduce两个部分。hive和pig让mapreduce更加简单)
良好的扩展性(简单的添加机器就可以实现)
高容错性(job中任务部分失败,可以重新执行)
适合PB级以上海量数据的离线处理
MapReduce不擅长
实时计算
像MySQL一样,在毫秒级或者秒级内返回结果(可以参考Spark或HBase,HBase随机读写性能好,统计不太好)
流式计算
MapReduce的输入数据集是静态的,不能动态变化
MapReduce自身的设计特点决定了数据源必须是静态的(可以考虑Storm)
DAG计算
多个应用程序存在依赖关系,后一个应用程序的输入为前一个的输出(Tez)
MapReduce编程模式
wordcount过程
大图:
MapReduce将作业的整个运行过程分为两个阶段
Map阶段和Reduce阶段
Map阶段由一定数量的Map Task组成
输入数据格式解析:InputFormat
输入数据处理:Mapper
数据分组:Partitioner
Reduce阶段由一定数量的Reduce Task组成
数据远程拷贝
数据按照key排序
数据处理:Reducer
数据输出格式:OutputFormat
经典流程图,如果看懂这张图,那么你对MapReduce理解的已经不错了
大图:
默认TextInputFormat对文件切分,并处理每一个Split,提供RecordReader生成key/value
TextInputFormat:Key是行在文件中的偏移量,value是行内容若行被截断,则读取下一个block的前几个字符
设计到的概念
Block
HDFS中最小的数据存储单位默认是64MB
Spit
MapReduce中最小的计算单元默认与Block一一对应
Block与Split
Split与Block是对应关系是任意的,可由用户控制
Map阶段
InputFormat(默认TextInputFormat)
Mapper
Combiner(local reducer)
Partitioner
Reduce阶段
Reducer
OutputFormat(默认TextOutputFormat)
Combiner
Combiner可做看local reducer合并相同的key对应的value(wordcount例子)通常与Reducer逻辑一样好处
减少Map Task输出数据量(磁盘IO)
减少Reduce-Map网络传输数据量(网络IO)
结果可叠加
Sum(YES!),Average(NO!)
Partitioner
Partitioner决定了Map Task输出的每条数据交给哪个Reduce Task处理默认实现:hash(key) mod R R是Reduce Task数目
允许用户自定义,很多情况需自定义Partitioner
比如“hash(hostname(URL)) mod R”确保相同域名的网页交给同一个Reduce Task处理
MapReduce架构
大图:
Jobtracker
• 管理所有作业
• 将作业分解成一系列任务
• 将任务指派给TaskTracker
• 作业/任务监控、错误处理等
Tasktracker
• 运行Map Task和Reduce Task
• 与JobTracker交互,执行命令,并汇报任务状态
MapTask
• Map引擎
• 解析每条数据记录,传递给用户编写的map()
• 将map()输出数据写入本地磁盘(如果是map-only作业,则直接写入HDFS)
ReduceTask
• Reduce引擎
• 从Map Task上远程读取输入数据
• 对数据排序
• 将数据按照分组传递给用户编写的reduce()
MapReduce容错性
JobTracker
单点故障,一旦出现故障,整个集群不可用
TaskTracker
周期性向JobTracker汇报心跳
一旦出现故障,上面所有任务将被调度到其他节点上
MapTask/ReduceTask
运行失败后,将被调度到其他节点上重新执行
MapReduce任务提交
原文地址:http://bbs.chinahadoop.cn/forum.php?mod=viewthread&tid=5823