MapReduce分布式计算

MapReduce-分布式计算笔记

简介

1.什么是MapReduce

Hadoop MapReduce is a software framework for easily writing applications which process vast amounts of data (multi-terabyte data-sets) in-parallel on large clusters (thousands of nodes) of commodity hardware in a reliable, fault-tolerant manner.

2.MapReduce组成

Map端
Reduce端

3.MapReduce核心思想

“相同”的key为一组,调用一次Reduce方法,方法内迭代这一组数据进行计算

原理

在这里插入图片描述

1.map task
1.1.map task端从HDFS集群上拿数据

	一个map task由一个split切片,因为HDFS集群上是block块(按字节切割)存储数据,可能回导致乱码,默认情况下,1个split切片 ≈ 1个block块
	目的:防止数据被分开

1.2.map task将数据拉入内存

	1.将处理后的每条记录打上标签,目的是明确这一条记录将来被哪一个reduce task处理
		打标签由分区完成,默认的分区器是HashPartitioner。
		分区策略是根据key的HashCode与reduce task NUM 取模
		进入内存中的每一条记录都由分区号、key、value组成
	2.内存中的数据超过默认的80M后,这80M内存回被封锁,然后对这80M的数据进行combiner(小聚合)

1.3.将内存中的数据写入磁盘小文件中

1.将相同分区的数据放在一起,分区内的数据按照key值进行一定的排序

1.4.磁盘小文件合并成一个大文件

1.在map task计算完毕后进行合并
2.合并时使用归并排序算法
3.产生一个有分区且分区内部有序的大文件

1.2-1.4又称为shuffle write阶段
有序大文件:提高分组的分组效率

2.reduce task

1.去map端读取相应的分区数据,
2.将分区数据写入内存中,内存满时回溢写,溢写之前会排序,写入磁盘小文件中
3.当数据读取、排序完毕后,将磁盘小文件合并、排序成一个大文件
归根结底,四次排序都是为了提高分组的分组效率
2.1-2.2,又被称为shuffle read阶段

3.总结
3.1Map

	1.读懂数据
	2.映射为hey-value模型
	3.并行分布式
	4.计算向数据移动

3.2Reduce

	1.Reduce中可以包含不同的key
	2.相同的key汇聚到一个Reduce中,相同的key调用一次reduce方法

YARN

1.前身

在hadoop1.x版本中,MapReduce框架中自带了一个资源调度器。
1.MapReduce运行流程
在这里插入图片描述

1.客户端将MapReduce任务提交给JobTracker
	hadoop jar
2.JobTracker向NameNode请求计算文件的block位置
3.通知各个TaskTracker在各自节点上启动一个container(容器)
4.JobTracker向TaskTracker上按照数据位置分发任务MapTask(数据本地化)
5.MapTask计算完毕后,每一个MapTask都会产生一个大文件
6.JobTracker告诉某一台TaskTracker节点启动一个container,在container中启动一个ReduceTask进程
7.ReduceTask将MapTask产生的文件拉取过来,计算完毕后,传到HDFS集群上

数据本地化是指数据不移动,计算移动(即计算向数据移动)
目的是为了减少网络IO
ReduceTask最好是与MapTask在同一节点上,减少网络IO

2.总结
2.1JobTracker

1.核心,单点,主节点
2.调度所有的作业
3.监控整个集群的资源负载

2.2TaskTracker

1.从节点,自身节点资源管理
2.向JobTracker汇报资源,获取Task

2.3弊端

1.JobTracker负载过高,容易出现单点故障
2.资源管理与计算调度强耦合,其他计算框架需要重复实现资源管理
3.不同框架对资源不能全局管理,存在资源强度和资源隔离问题

2.YARN

1.核心思想

将JobTracker的资源管理和任务调度两个功能分开,分别由ResourceManager和ApplicationMaster进程实现。

2.角色
2.1ResourceManager

1.主节点、资源调度器的核心
2.集群节点资源管理

2.2NodeManager

1.向ResourceManager汇报资源
2.管理Container生命周期

2.3Container

1.默认NodeManager启动线程监控COntainer大小,超出申请资源额度就kill
2.支持Linux内核的Cgroup

2.4ApplicationMaster

负责应用程序相关的事务,比如任务调度、任务监控和容错等

3.流程
在这里插入图片描述

1.client拿到MR Application计算文件的路径,从NameNode获取每一个block的位置,形成一个报表
2.client向ResourceManager请求,申请ApplicationMaster资源
3.ResourceManager接受client请求,然后查看哪一个节点资源充足,如果大部分节点资源充足,那就随机找一台节点(例如node01)启动Container容器
4. node01上的NodeManager会在Container容器中启动一个ApplicationMaster(负责任务调度)
5.client将报表交给ApplicationMaster
6.ApplicationMaster根据报表向ResourceManager申请资源
7.ResourceManager根据申请查看节点资源是否充足,在资源充足的节点上启动Container容器
8.对应的NodeManager在Container中启动yarn-child进程
9.ApplicationMaster向各个yarn-child中分发MapTask线程
10.MapTask计算完毕后,会生成对应的磁盘文件
11.ApplicationMaster分发ReduceTask线程
	最好是在MapTask线程所在的节点上,减少网络IO
12.ReduceTask线程执行完毕后,将结果写入HDFS集群上

4.优势

1.避免了单点故障
2.使得多个计算框架可以运行在一个集群中

环境搭建

1.集群规划
在之前搭建的高可用集群上搭建YARN集群

NameNode1 NameNode2 DataNode Zookeeper ZKFC JournalNode ResourceManager NodeManager
node01
node02
node03
node04

2.修改配置文件
2.1mapred-site.xml

 <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
 </property>

2.2yarn-site.xml

 <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
</property>
<property>
   <name>yarn.resourcemanager.ha.enabled</name>
   <value>true</value>
 </property>
 <property>
   <name>yarn.resourcemanager.cluster-id</name>
   <value>cluster1</value>
 </property>
 <property>
   <name>yarn.resourcemanager.ha.rm-ids</name>
   <value>rm1,rm2</value>
 </property>
 <property>
   <name>yarn.resourcemanager.hostname.rm1</name>
   <value>node01</value>
 </property>
 <property>
   <name>yarn.resourcemanager.hostname.rm2</name>
   <value>node02</value>
 </property>
 <property>
   <name>yarn.resourcemanager.zk-address</name>
   <value>node02:2181,node03:2181,node04:2181</value>
 </property>

3.启动yarn集群
3.1在node01上执行

 start-yarn.sh

3.2在node02上执行

yarn-daemon.sh start resourcemanager

4.测试
4.1进入hadoop_home下的share/hadoop/mapreduce目录
4.2执行用例

hadoop jar hadoop-mapreduce-examples-2.6.5.jar wordcount  /input  /output

/input是HDFS集群下的目录,目录下需要放一个或多个存有英文单词或语句的文件

猜你喜欢

转载自blog.csdn.net/love__guo/article/details/83099217