Hadoop-MapReduce计算过程-Yarn资源调度-HA的方式

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值