您的位置:首页 > 运维架构

Hadoop学习笔记1

2015-09-13 16:53 218 查看

1、MapReduce模型

MapReduce是一个分布式编程模型,主要用于处理和生成大规模数据集。
用户自定义一个Map函数处理一个KV对以生成一批中间的KV对,再定义一个Reduce函数将所有的中间KV对合并起来。
主要由Mapper和Reducer抽象类。Mapper负责对数据的分析处理,转换为KV的数据结构;Reducer获取Mapper出来的 结果,对结果进行统计。

2、MapReduce框架

可以从Application(JobClient、Mapper、Reducer、JbConf、Combiner)、HDFS、JobTracker、TaskTracker考虑
客户端通过JobClient类将应用程序以及配置参数打包成Jar文件存储在HDFS,并把路径提交到JobTracker的master服务,然后由Master创建每一个Task,将它们分发到TaskTracker中执行;
JobTracker接收Job并进行调度Job的每一个子任务运行在TaskTracker上,并监控之,若是发生失败的Task就重新运行。(部署在单独的机器上)

3、MapReduce运行原理

一个MP作业(Job)通常 会把输入的数据集切分为若干独立的数据块,由Map任务以并行的方式处理它们,框架会对Map函数的输出先进行排序,然后把结果输入给Reduce任务,通常作业的输入和输出都会被存储到文件系统中。整个框架负责任务的调度和监控,以及重新执行 已经失败的任务。

1)作业的提交

JobClient端的runJob方法用于新建JobClient实例并调用其submitJob方法,这是便捷方式提交作业后,runJob每秒轮询作业的进度,如果发现自上次上报后的信息有改动,便把进度报告输出到控制台(包含成功时或失败的信息)。
(1)向JobTracker请求一个新的作业ID,(JobTracker的getNewJobID()方法获得)
(2)检查作业的输出说明。如:是否指定的输出目录已经存在?存在返回错误给程序
(3)计算作业的输出划分。检查输入路径是否存在,若不存在Job不会被提交喔
------------------------------------------------------------------------------------------------------------------------
(4)将运行作业所需要的资源(包括作业的Jar文件、配置信息、计算所得的输入划分)复制到一个以作业ID命名的目录中(HDFS),作业Jar的副本较多 ;
(5)通过调用JobTracker的submitJob方法,告诉JobTracker作业准备执行,此时会把此调用放入内部的队列中,交由作业调度器进行调度,并对其进行初始化
(6)TaskTracker通过heartbeat机制告诉JobTracker是否存活并进行消息通信;若是JobTracker接收TaskTracker消息后知道其状态正常,会为其分配一个任务。

4、Shuffle阶段

Shuffle是指从Map的输出开始,包括系统执行排序以及传送Map输出到Reduce作为输入的过程。
Shuffle阶段可以分为:Map端的Shuffle和Reduce端的Shuffle
1)Map端的Shuffle:
当Map开始产生输出时,并不是简单的把数据写到磁盘,因为频繁的磁盘 操作会导致性能严重下降。
每个Map任务都会有一个用来写入输出数据的循环内存缓存区,这个缓存区默认大小是100M,通过io.sort.mb设置大小;当缓存区中数据量达到一定阈值(io.sort.spill.persent默认0.8)时,系统会启动一个后台进程把缓冲区中的内容spill到磁盘中。在Spill过程中,Map的输出将会继续写入到缓存区,若是缓冲区已满,Map端就会被阻塞知道Spill完成。
Spill线程在把缓冲区的数据写到磁盘前,会对它进行一个二次快速排序,首先根据数据所属的Partition排序,然后对每个Partition中数据再按照Key进行排序。输出包括一个索引文件和一个数据文件。
Combiner是一个Mini Reducer,在执行Map任务的节点本身运行,先对Map的输出做一次简单的Reduce,使得Map的输出更加的紧凑,更少的数据会被写入到磁盘和传送到Reducer端。Spill文件保存在由mapred.local.dir指定的目录中,Map任务结束后删除。
2)Reduce端的Shuffle

。。。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: