MapReduce
(分布式计算框架)
计算思想:靠近数据源计算,处理的都是key-value形式
设计思路:分而治之
Mapreduce的计算过程
1,按照块进行分片
一般默认每一个block块对应一个spilt分片,数据以一条记录为单位(有时为一行),每一个切片由一个maptask处理
2,map
每个分片会对应一个Map,运行map进行数据的进一步切割,经过map的方法映射成K:V:p
3,shuffle(Map产生输出开始到Reduce取得数据作为输入之前的过程称作shuffle。)
分区—(由map生成区号p,map进行分区,默认有一个reduce分区,一个分区对应一个reduce),
排序—(由map进行排序),
规约—(Hadoop完成,把一个区中弄成同组数据),
合并—(在分区内进行合并,按照key:list)
4,Reduce
获取map的键值对,把分散的键值对在内存上中进行计算,相同的k为一组,这一组数据调用一次reduce方法迭代计算,由reduce进行合并排序,写入HDFS中
5,数据展示
数据会存储到HDFS的目录下
词频的计算方法
#hdfs创建input
hdfs dfs -mkdir /input
#上传数据文件到/input
hdfs dfs -put /root/a.txt /input
#mp中计算词频包的位置
/export/server/hadoop-3.3.0/share/hadoop/mapreduce
#计算词频的jar包
hadoop jar hadoop-mapreduce-examples-3.3.0.jar wordcount /input /output
实现map和reduce的方法
- 创建mapper.py实现map过程
- 将原始的字符串数据转为key value形式
- key是单词 value是1 key和value使用\t分割
- 数据计算传输过程使用是二进制流形式
- sys.stdin可以获取流式数据,按照行获取数据
map的方法实现
import sys
for line in sys.stdin:
line = line.strip()
words = line.split()
for word in words:
print('%s\t%d'%(word,1))
验证
cat a.txt | python mapper.py
reduce的方法实现
- 创建reducer.py实现reduce过程
- reduce从map输出结果中对数据进行合并计算
- 按行获取流式数据
- 数据的前后空格去除
- 数据的切割
- 数据计算
- 数据输出
import sys
data_dict={}
for line in sys.stdin:
line = line.strip()
# xiaomi 1 [xiaomi,1]
data = line.split()
key_world=data[0]
value_count=data[1]
# 合并计算
if key_world in data_dict:
data_dict[key_world]+=int(value_count)
else:
data_dict[key_world]=int(value_count)
for key,value in data_dict.items():
print('%s\t%d'%(key,value))
验证
cat a.txt | python mapper.py | python reduce.py
使用MapReduce执行写好的代码
hadoop jar /export/server/hadoop-3.3.0/share/hadoop/tools/lib/hadoop-streaming-3.3.0.jar \
-D mapred.reduce.tasks=1 \
-mapper "python mapper.py" \
-reducer "python reducer.py" \
-file mapper.py -file reducer.py \
-input /input/* \
-output /outpy
Yarn资源调度服务
-
提供计算资源(cpu , 内存)
-
只负责资源提供, 不参与计算过程
-
yarn的角色任务
resourcemanager:
①主管角色实际资源监控管理nodemanager
②负责协调整个集群的资源分配,
③单点故障
nodemanager:
①负责每一个datanode的资源监控
②datanode定时将自己的信息告知给nodemanager
③把resourcemanager分配好的资源进行再分配
applicationmaster:
①在进行计算时,resourcemanager会生成一个applicationmaster
②applicationmaster管理计算,获取计算运行状态,
③一个applicationmaster对应一个计算任务
负责资源回收,计算完之后会通知resourcemanager把自己释放
Yarn的资源调度流程图
客户端提交计算请求,APPlocationmanager接收到计算任务会生成一个applicationmaster,然后applicationmaster向RM申请计算资源,通知NM按照分配资源提供相应的计算资源MapReduce将计算信息通知给applicationmaster, 并且在计算完成后将MP的计算资源收回,之后告知APPlocation释放自己的资源
资源调度的三种方案
第一种:FIFO调度多个任务并排为队列的形式,依次执行,先进先出
第二种:容量调度的动态调整机制可以设置资源上限,如果发现其中一个通道中没有计算任务,将会把这个通道分配给另一个通道(初始值;30%小通道: 70%大通道
max : 45% : 85%)
第三种:公平调度把一个大的任务中的mapreduce中的释放的map资源进行利用给小任务
hadoop服务的高可用
- 定义: 高可用是为了能够持续不间断的对外提供服务功能(主备形式:一主一备,一主多备)
Hadoop: HDFS服务, yarn服务
要实现高可用需要有两个Hadoop服务,在主服务宕机后,备用服务能够对外提供功能
Hadoop1:HDFS-namenode Yarn--resourcemanager
Hadoop2:HDFS-namenode Yarn--resourcemanager
datanode至少有三台
注: 一旦NN启动JN存储之后,NN就不会启动SNN了
HA的流程:
- NN的备份服务
①主服务和备用服务有zookeeper的唯一节点确定的,两个服务同时创建相同的节点,谁创建成功了谁作为主服务
②zookeeper会创建监听机制watch,如果主服务宕机了,会触发监听机制,备用服务会创建新的zookeeper节点
③数据的一致和可用性问题:主服务和备用服务之间会用三个Joural manager(JN之间也通过过半选举机制) 用来备份元数据(JN数量有几个就本分几个)
④ZKFC服务负责监控各自NN的状态,并连接ZK创建节点确认主服务是谁,然后创建监听机制从服务会监听主服务的节点(ZKFC服务是Hadoop服务启动的)
- resourcemanager的备份服务
RM的备份和NN的备份原理一样,但RM只用到了zookeeper的机制切换服务,没有用到JN的存储机制
拓展
脑裂:
在高可用的场景下出现两个主服务的情况
假死状态:
ZKFC因为网络延迟,因获取不到NN的状态,会认为NN已经宕机,并通知备用NN启动,备用NN启动时回去连接原来的NN,强制杀死原来的主服务NN