06-Hadoop HA

一、Hadoop的HA

1、HA

H(high)A(avilable): 高可用,意味着必须有容错机制,不能因为集群故障导致不可用!

HDFS: 满足高可用
    NN: 一个集群只有一个,负责接受客户端请求!
    DN: 一个集群可以启动N个
YARN: 满足高可用
    RM: 一个集群只有一个,负责接受客户端请求!
    NM: 一个集群可以启动N个

实现hadoop的HA,必须保证在NN和RM故障时,采取容错机制,可以让集群继续使用!

2、防止故障

核心: 避免NN和RM单点故障

以HDFS的HA为例:

① NN启动多个进程,一旦当前正在提供服务的NN故障了,让其他的备用的NN继续顶上

② NN负责接受客户端的请求

    在接收客户端的写请求时,NN还负责记录用户上传文件的元数据

    保证:正在提供服务的NN,必须和备用的NN之中的元数据必须是一致的!

  元数据的同步: ①在active的nn格式化后,将空白的fsimage文件拷贝到所有的nn的机器上

             ②active的nn在启动后,将edits文件中的内容发送给Journalnode进程,standby状态的nn主动从Journalnode进程拷贝数据,保证元数据的同步

  注意: ①Journalnode在设计时,采用paxos协议, Journalnode适合在奇数台机器上启动。在hadoop中,要求至少需要3个Journalnode进程。

      ②如果开启了hdfs的ha,不能再启动2nn

③ 当启动了多个NN时,是否允许多个NN同时提供服务?

    不允许多个NN同时对外提供服务,因为如果多个NN同时对外提供服务,那么在同步元数据时,非常消耗性能,而且容易出错!

    在同一时刻,最多只能有一个NN作为主节点,对外提供服务,其余的NN,作为备用节点!

    使用active状态来标记主节点,使用standby状态标记备用节点!

3、HDFS HA的搭建步骤

①配置

  1. fs.defaultFS=hdfs://hadoop101:9000 进行修改
  2. 在整个集群中需要启动N个NN,配置N个NN运行的主机和开放的端口!
  3. 配置Journalnode

②启动

  1. 先启动Journalnode
  2. 格式化NN,精格式化后的fsimage文件同步到其他的NN
  3. 启动所有的NN,需要将其中之一转为active状态

4、自动故障转移

借助Zookeeper实现自动的故障转移!

在每个NN所在的机器,启动一个ZKFC进程,这个进程会维护一个zookeeper客户端!
在启动了这个进程后,如果当前机器的NN可用,ZKFC进程会抢先向ZK集群中注册一个临时节点!
哪个ZKFC进程拥有对这个临时节点的所有权,会对节点加锁!在此进程的Session未断开前,占用此节点!
此时,这个ZKFC进程会将当前机器的NN提升为active!

每个ZKFC进程负责和NN进行进行ping通信,一旦发现ping命令回复超时,会认为此NN已经假死,假死后,zkfc会断开
session,放弃对zookeeper上节点的控制权,其他的ZKFC进程负责监听节点,一旦节点不存在,其他的zkfc进行开始
抢占此节点,哪个ZKFC进程抢占成功,就会把它所在机器的NN提升为active,在提升之前,必须保证不能出现脑裂,
因此使用fence机制,将之前的NN进行隔离!

二、压缩

1、压缩的目的

压缩的目的是在MR运行期间,提高MR运行的效率!
压缩可以减少MR运行期间的磁盘IO和网络IO!

2、 压缩的场景

IO密集型,可以多用压缩!

运行密集型,CPU负载过重,少用或不用压缩!

3、在MR中压缩的位置

输入的文件采用压缩格式:
  当单个文件压缩之后,如果超过130M,可以考虑使用带切片的压缩格式!

在shuffle阶段使用压缩:
  考虑速度!速度快即可!

reduce输出的结果采用压缩:
  考虑当前Job的输出是否还会作为下一个Job的输入,再考虑输出的结果每个大小是否会超过130M,

  如果超过,还需要作为下一个Job的输入,可以考虑使用带切片的压缩格式!

4、常见的压缩格式

4.1、默认: deflate,bzip2,gzip

4.2、额外安装的: lzo,snappy

4.3、特点:

  • bzip2压缩比最高,压缩速度最慢
  • snappy压缩速度最快,压缩比凑合
  • deflate,gzip折中

4.4、使用便利性:

  LZO压缩格式最麻烦!

    ①额外安装LZO压缩格式
    ②如果JOB输入目录中的文件为LZO压缩格式,需要为每个文件创建索引,如果不创建索引,那么输入的文件无法切片,整个文件作为1片。还需要使用LZO特定的输入格式,使用LZOInputFormat!

  其他的压缩格式,和纯文本文件使用一致的,不需要额外设置!

4.5、可切片的角度: 

如果Job的输入采用了以下压缩格式,只有以下格式支持切片!
只有bzip2和lzo可以切片!

4.6、使用场景:

  ① Bzip2: 对速度没有要求,常作为reduce输出结果的压缩格式!
        即便job运行后,输出的结果还需要被另一个Job继续处理,Bzip2格式也可以支持切片!

  ② Lzo:    作为Job输入文件的压缩格式!

  ③ Snappy: 作为shuffle阶段的压缩格式!

Mapper 运算结束后,需要向磁盘溢写 500M的数据,没有用压缩之前,写的速度100M/s

采用了Snappy压缩,需要向磁盘溢写 500M的数据,采用了snappy压缩,写的速度100M/s,500M--->300M

Reduce拷贝300M的数据----> 解压缩(速度很快,解压缩消耗的时间可以忽略不计)------>

4.7、压缩的考虑:

① Mapper的输入: 主要考虑每个文件的大小,如果文件过大,需要使用可以切片的压缩格式!

② Reducer的输出: reducer的输出主要考虑,输出之后,是否需要下一个Job继续处理!
单个reducer输出的结果的大小!

如果需要被下个Job继续处理,且单个文件过大,也要使用可以切片的压缩格式!

③shuffle阶段: 速度快即可

三、调度器

1、FIFO调度器

FIFO调度器的特点就是单队列,所有的Job按照客户端提交的先后顺序,先到先服务!

弊端: 如果当前队列中有一个大的Job,非常消耗资源,那么这个Job之后的其他Job都需要付额外的等待时间,造成集群的资源利用率不足!

解决: 采取多队列的配置

2、容量调度器

容量调度器的本质是多个FIFO的队列组成!

Hadoop默认使用就是容量调度器!

特点: 容量

  1. 每个队列可以配置一定的容量,空闲的资源可以匀给其他队列临时使用
  2. 可以配置每个job使用的容量的限制,防止一个大的job独占所有资源
  3. 可以配置每个用户可以使用的容量限制,防止当个用户占用所有资源

优点

  1. 配置灵活,及时刷新即可、
  2. 资源利用率高
  3. 安全,可以配置每个队列的访问用户限制

3、公平调度器

公平调度器的设置和容量调度器大致相同,也是多条队列,每天队列都可以设置一定的容量。每个Job,用户可以设置容量!

区别: 公平调度器在调度策略上,采用最大最小公平算法,来调度Job,这个算法会保证同一个队列中,所有已经提交,未运行结束的Job,获取到队列中的资源是平等的!

导致在一个队列中,小的Job运行有优势,大的Job可能不能及时获取到必须的所有资源,但是不至于饿死!

四、推测执行

在MR运行期间,MRAppMaster会为最慢的任务启动一个备份任务,备份任务和当前任务先运行完的会采用其结果!

不适用场景:

①数据有倾斜
②特殊场景: 向数据库写记录

推测执行是典型的以空间换时间,因此在集群资源不足时,如果开启了推测执行,反而不能取得效果!

五、Hadoop的优化

1、小文件的优化

① 源头上处理,在上传到集群之前,提前处理小文件

② 小文件已经在HDFS存在,可以使用hadoop archieve进行归档

③ 在运行MR时,可以使用CombineTextInputFormat将多个小文件规划到一个切片中

④ 小文件过多,可以开启JVM重用

2、MR的优化

① 合理设置MapTask和ReduceTask的数量:在合理利用资源的情况下,提高程序并行运行的效率

② 避免数据倾斜

  Map端的数据倾斜: 在切片时,注意每片数据尽量均匀。防止有些不可切片的数据!

  Reduce端的数据倾斜: 提前对数据进行抽样调查,统计出大致的分布范围,根据分布范围,合理编写Partitioner,让每个分区的数据尽量均衡

③ 优化磁盘IO和网络IO
  a)启用combiner
  b)启动压缩
  c)调大MapTask缓冲区的大小,减少溢写次数
  d)调大MapTask中merge阶段一次合并的片段数,减少合并花费的时间
  e)调大reduceTask中shuffle线程可以使用的内存,减少溢写次数
  d)调大reduceTask中,input.buffer的大小,提前缓存部分数据到buffer中

posted @ 2022-03-06 22:33  bug开发工程师  阅读(49)  评论(0编辑  收藏  举报