MapReduce
MR : map + reduce
输入(格式化k,v)数据集 -》 map映射成 一个中间数据集(k,v)-》reduce(sql)
相同的key 为一组,调用一次reduce方法,方法内迭代这一组数据进行计算(类似的sql)
-排序
+ 比较
- 遍历
- 计算
- 各种维度花销,音乐,其他
MapReduce : MapTask & ReduceTask
计算向数据移动
上图可知:
map数量和split数量有关系,一一对应。
split是 对block块逻辑上的切分(block是物理上的切分),可以对block进行逻辑上的切分
reduce数量: 和key个数有关系。同一个key必须交给同一个reduce来处理。可以多个key交个一个reduce来处理。但是不能把一个key拆分交给多个reduce来处理
mr框架分为四个阶段
1 切片 split
2 map
3 shuffle 洗牌 相同key交给reduce
4 reduce
数量变化
block > split
1:1
N:1
1:N
split > map
1:1
map > reduce
N:1
N:N
1:1
1:N
group(key)>partition
1:1
N:1
N:N
shuffle :框架内部实现机制
分布式计算节点数据流转:连接MapTask 和ReduceTask
上图中的是创建一个缓存区。这个缓存存满后生成一个临时文件,清空缓存区后继续处理,直到这个map处理完成split的数据。然后进行对这些临时文件排序,完成后进行将这些文件快排和归并生成一个文件向后发送。
在这个缓存区中进行两次排序,第一次排序(按照分区进行排序,有几个reduce就有几个分区, 可能是粗粒度排序),再进行一次排序(按相同的key分组排序)。
key, value, partition
fetch: 数据的压缩处理,减少磁盘的交互
这个文件经过shuffle后,进行归并,归并到一定数量交给reduce
mr框架 单词统计
map:
- 读懂数据
- 映射为kv模型
- 并行分布式
- 计算向数据移动
Reduce - 数量全量/分量加工(partition/ group) partition可以包含多个 group
- reduce中可以包含不同的key
- 相同的key汇聚到一个reduce中
- 相同的key调用一次reduce方法
- 排序实现key的汇聚
kv使用自定义数据类型(封装成对象)
- 作为参数传递,节省开发成本,提高程序自由度
- Writable序列化,使能分布式程序数据交互,要有序列化接口
- comparable比较器:要有排序接口, 实现具体排序(字典序,数值序等)
hadoop 1.x MR
jobTracker 的作用:
1 client的分配的任务调度
2 整个集群的资源管理 【保持与Task Tracker 时时联系】
Mapper
Reducer
- MRv1角色:
- JobTracker
核心,主,单点
调度所有的作业
监控整个集群的资源负载 与 TaskTracker交互 - TaskTracker
从,自身节点资源管理
和JobTracker心跳,汇报资源,获取Task任务 - Client
作业为单位
规划作业计算分布
提交作业资源到HDFS
最终提交作业到JobTracker
- JobTracker
- 弊端:
- JobTracker:负载过重,单点故障
- 资源管理与计算调度强耦合,其他计算框架需要重复实现资源管理
- 不同框架对资源不能全局管理
YARN(MRv2)资源管理框架
jobTracker的任务调度工作交给了现在的 App Mstr
jobTracker的资源管理 工作交给了 Resource Manager
App Mstr根据Resource Manager的确认消息和 job任务的消息会在节点上创建容器Container(默认1G,如果超过1G则中断停止)
NodeManger 向Resource Manager汇报节点的使用情况
Resource Manager 会进行HA,需要zookeeper
MRv2:On YARN
-
YARN:解耦资源与计算
- ResourceManager
主,核心
集群节点资源管理 - NodeManager
与RM汇报资源
管理Container生命周期
计算框架中的角色都以Container表示 - Container:【节点NM,CPU,MEM,I/O大小,启动命令】
默认NodeManager启动线程监控Container大小,超出申请资源额度,kill
支持Linux内核的Cgroup
- ResourceManager
-
MR :
- MR-ApplicationMaster-Container
作业为单位,避免单点故障,负载到不同的节点
创建Task需要和RM申请资源(Container /MR 1024MB) - Task-Container
- MR-ApplicationMaster-Container
-
Client:
- RM-Client:请求资源创建AM
- AM-Client:与AM交互
-
YARN:Yet Another Resource Negotiator;
-
Hadoop 2.0新引入的资源管理系统,直接从MRv1演化而来的;
- 核心思想:将MRv1中JobTracker的资源管理和任务调度两个功能分开, 分别由ResourceManager和ApplicationMaster进程实现
- ResourceManager:负责整个集群的资源管理和调度
- ApplicationMaster:负 责应用程序相关的事务,比如任务调度、任务监控和容错等
-
YARN的引入,使得多个计算框架可运行在一个集群中
- 每个应用程序对应一个ApplicationMaster
- 目前多个计算框架可以运行在YARN上,比如MapReduce、Spark、Storm等
MapReduce On YARN
- MapReduce On YARN:MRv2
- 将MapReduce作业直接运行在YARN上,而不是由JobTracker和- TaskTracker构建的MRv1系统中
- 基本功能模块
- YARN:负责资源管理和调度
- MRAppMaster:负责任务切分、任务调度、任务监控和容错等
- MapTask/ReduceTask:任务驱动引擎,与MRv1一致
- 每个MapRaduce作业对应一个MRAppMaster
- MRAppMaster任务调度
- YARN将资源分配给MRAppMaster
- MRAppMaster进一步将资源分配给内部的任务
- MRAppMaster容错
- 失败后,由YARN重新启动
- 任务失败后,MRAppMaster重新申请资源
启动yarn
NN-1 | NN-2 | DN | ZK | ZKFC | JNN | RS | NM | |
---|---|---|---|---|---|---|---|---|
Node001 | * | * | * | |||||
Node002 | * | * | * | * | * | * | ||
Node003 | * | * | * | * | * | |||
Node004 | * | * | * | * |
在原来的配置上修改
vi mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
vi yarn-site.xml
<configuration>
<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>node003</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>node004</value>
</property>
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>node002:2181,node003:2181,node004:2181</value>
</property>
</configuration>
分发node002,node003,node004
node003,node004 互相交换添加ssh的公钥,因为 RS在这两个上面。需要进行信息交互,切换主备
首先启动ndoe002,node003,node004的zookeeper
zkServer.sh start
然后在node001启动
start-dfs.sh
start-yarn.sh
RS需要手动启动
在 node003,node004启动RS
yarn-daemon.sh start resourcemanager
输入jps查看
在浏览器输入 ndoe003:8088 查看