MapReduce将复杂的、运行于大规模集群上的并行计算过程高度地抽象到了两个函数:Map和Reduce
编程容易,不需要掌握分布式并行编程细节,也可以很容易把自己的程序运行在分布式系统上,完成海量数据的计算
MapReduce采用“分而治之”策略,一个存储在分布式文件系统中的大规模数据集,会被切分成许多独立的分片(split),这些分片可以被多个Map任务并行处理
MapReduce设计的一个理念就是“计算向数据靠拢”,而不是“数据向计算靠拢”,因为,移动数据需要大量的网络传输开销
MapReduce框架采用了Master/Slave架构,包括一个Master和若干个Slave。Master上运行JobTracker,Slave上运行TaskTracker
Hadoop框架是用Java实现的,但是,MapReduce应用程序则不一定要用Java来写
MapReduce体系结构主要由四个部分组成,分别是:Client、JobTracker、TaskTracker以及Task
MapReduce主要有以下4个部分组成:
1)Client
用户编写的MapReduce程序通过Client提交到JobTracker端
用户可通过Client提供的一些接口查看作业运行状态
2)JobTracker
JobTracker负责资源监控和作业调度
JobTracker 监控所有TaskTracker与Job的健康状况,一旦发现失败,就将相应的任务转移到其他节点
JobTracker 会跟踪任务的执行进度、资源使用量等信息,并将这些信息告诉任务调度器(TaskScheduler),而调度器会在资源出现空闲时,选择合适的任务去使用这些资源
3)TaskTracker
TaskTracker 会周期性地通过“心跳”将本节点上资源的使用情况和任务的运行进度汇报给JobTracker,同时接收JobTracker 发送过来的命令并执行相应的操作(如启动新任务、杀死任务等)
TaskTracker 使用“slot”等量划分本节点上的资源量(CPU、内存等)。一个Task 获取到一个slot 后才有机会运行,而Hadoop调度器的作用就是将各个TaskTracker上的空闲slot分配给Task使用。slot 分为Map slot 和Reduce slot 两种,分别供MapTask 和Reduce Task 使用
4)Task
Task 分为Map Task 和Reduce Task 两种,均由TaskTracker 启动
(1) MapReduce框架使用InpuFormat模块做Map前的预处理,比如验证输人的格式是否符合前人定义,然后,将输入文件切分为逻料上的多个InputSplit,InputSplit是MapReduce对文件进行处理和运靠的输人单位,只是一个逻料概念,每个InputSplit并没有对文件进行实际切割,只是记录了要处理的数据的位置和长度。
(2)因为InputSplit是逻辑切分而非物理切分,所以还需要通过RecordReader (RR)根据InputSplit中的信息来处理InputSplit中的具体记录,加载数据并转换为适合Map任务读取的键值对,输入给Map任务。
(3) Map任务会根据用户自定义的映射规则,输出一系列的
(4)为了让Reduce可以并行处理Map的结果,需要对Map的输出进行一定的分区( Portition)、排序(Sort)、合并(Combine)归并(Merge)等操作,得到
(5) Reduce以一系列
(6) OutputFormat模块会验证输出目录是否已经存在以及输出结果类型是否符合配置文件中的配置类型,如果都满足,就输出Reduce 的结果到分布式文件系统。
shuffle的过程 区分合并及归并
首先是 Mapreduce经过SplitInput 输入分片 决定map的个数在用Record记录 key value。然后分为以下三个流程:
Map:输入 key(long类型偏移量) value(Text一行字符串)输出 key value
Shuffle:
(1)合并(merge)map输出时先输出到环形内存,当内存使用率达到60%时开始溢出写入到文件,溢出文件都是小文件,所以就要合并他们,在这个构成中就会排序,根据key值比较排序
(2) 排序(sort)如果你自定义了key的数据类型要求你的类一定是WriteableCompartor的子类,不想继承WriteableCompartor,至少实现Writeable,这时你就必须在job上设置排序比较器job.setSortCmpartorClass(MyCompartor.class);而MyCompartor.class必须继承RawCompartor的类或子类
(3) 分区(partition)会根据map输出的结果分成几个文件为reduce准备,有几个reducetask就分成几个文件,在job上设置分区器job.setPartitionerClass(MyPartition.class)Myrtition.class要继承Partitioner这个类
(4) 分组(group)分区时会调用分组器,把同一分区中的相同key的数据对应的value制作成一个iterable,并且会在sort。在job上设置分组器。Job.setGroupCompartorClass(MyGroup.class)MyGroup.class必须继承RawCompartor的类跟子类
上面的结果储存到本地文件中,而不是hdfs上;
上面只要有完成结果,reduce就开始复制上面的结果,通过http方式。
Reduce
(1)输入key时map输出时的key value是分组器分的iterable
(2) 输出 key value
(3) 输出结果保存在hdfs上而不是本地文件中
1、MapReduce设计的理念是数据向计算靠拢。()
答案:错;MapReduce设计的理念是计算向数据靠拢。
2、( 错 )MapReduce 适于 PB 级别以上的海量数据在线处理。 (离线)
3、MapReduce计算过程中,相同的key默认会被发送到同一个reduce task处理。( 对 )
1、在MapReduce的整个执行过程中,Map任务的输入文件,Reduce 任务的的处理结果都是保存在_________而Map任务处理得到的中间结果则保存在_________
分布式文件系统 本地存储
2、shuffle过程是指 的过程。
答案:对Map输出结果进行分区、排序、合并等处理并交给Reduce
3、策略:分而治之
1、下列说法错误的是(A)
A.Hadoop框架是用Java实现的,MapReduce应用程序则一定要用Java来写
B.不同的Map任务之间不能互相通信
C.MapReduce框架采用了Master/Slave架构,包括一个Master和若干个Slave
D.Map函数将输入的元素转换成
2、在使用MapReduce程序WordCount进行词频统计时,对于文本行“hello hadoop hello world”,经过WordCount程序的Map函数处理后直接输出的中间结果,应该是下面哪种形式:(C)
A.<“hello”,<1,1>>、<“hadoop”,1>和<“world”,1>
B.<“hello”,1,1>、<“hadoop”,1>和<“world”,1>
C.<“hello”,1>、<“hello”,1>、<“hadoop”,1>和<“world”,1>
D.<“hello”,2>、<“hadoop”,1>和<“world”,1>
3、MapReduce的Shuffle过程中哪个操作是最后做的? (D)
A、 溢写 B、分区 C、排序 D、合并
解答:MapReduce编程模型分为Mapper和Reducer阶段,在mapper和reducer的中间还有一个shuffle阶段。但是Shuffle也分为MapperShuffle和ReducerShuffler两个阶段。这个Shuffle非常的重要,而且也是导致MapReduce执行效率低的一个重要原因。shuflle中的执行顺序是先分区,然后在溢写之前进行排序,最后溢出的多个磁盘文件会进行合并成一个大文件。
4、Hbase依赖MapReduce提供强大的计算能力,下列对MapReduce的叙述正确的是(D)
A. Map函数的输入来自于分布式文件系统的文件块,键和值的类型不是任意的
B. 通常计算节点和存储节点在同一节点上,设计理念是“数据向计算靠拢”
C. 一个Map操作就是对每个Reduce所产生的一部分中间结果进行合并操作。
D. 输入键值对不需要和输出键值对类型一致
5、Reduce函数的输入端是(D) 。
A、List( C、
答案:D
6、下面哪个进程负责 MapReduce 任务调度( B)
A. NameNode B. Jobtracker C. TaskTracker D. secondaryNameNode
7、HDFS有一个gzip文件大小75MB,客户端设置Block大小为64MB。当运行mapreduce
任务读取该文件时input split大小为?(B)
A 64MB B 75MB C 一个map读取64MB,另外一个map读取11MB