HA问答题

一、Hadoop中的压缩作为一种常用的优化手段,经常被用在什么场景下?

​ 执行MR任务时Mapper结束的时候对落盘的结果文件压缩,从而减轻Reduce任务的压力,进而提升整个MR的执行效率

​ MR执行前直接读压缩好的文件,也会提升效率,但是要注意压缩格式能不能切片的问题

​ 在Reduce阶段结束的时候压缩,提升磁盘使用率

二、如果想要使用压缩,Hadoop如何对某一种压缩编码格式进行取舍?

​ 根据业务需要综合考虑压缩率、压缩速度、是否支持切片、是否Hadoop自带

三、你们公司常用的压缩方式有哪些?

不经常使用、长久存储的情况,使用Bzip2压缩

MR中Mapper阶段落盘文件压缩的情况,使用Snappy(考虑压缩、解压缩速度)

四、从哪些方面定位MR执行的效率

硬件:

​ 服务器配置

软件:

​ 小文件场景、数据倾斜、不可切片压缩文件、shuffle阶段环形缓冲区配置不合理、文件合并次数过多

五、如果想对MR程序进行优化,应该从哪些方面入手以及可能用到的优化手段?

主要考虑优化IO和内存,可能用到以下手段:

  1. 读数据的阶段,如果面临大量小文件的场景,可以用CombineTextInputFormat来解决

  2. Mapper阶段,减少溢写次数:

     修改环形缓冲区比例
    
     通过配置减少合并次数
     
     不影响业务的情况下加入Combiner
    
  3. Reduce阶段:

     合理设置Reduce的Buffer--->减少落盘操作
    

六、在Hadoop针对小文件的处理方案有哪些?

  1. 数据输入阶段使用Hadoop专门针对小文件场景的CombineTextInputFormat实现
  2. uber模式实现JVM重用,但是一般不用这个方案,局限性比较大
  3. 在存储之前就合并小文件

七、如何解决MR中Reduce的数据倾斜问题?

需要join的场景下,尽量不用Reduce Join

对倾斜的业务数据,可以用一些手段打乱其输出分区,也可以根据业务自己自定义分区

八、大概简述一下 Hadoop每一代版本的新特性?

一代和二代间最大的新特性就是二代多了yarn

二代和和三代最大的新特性就是三代支持多NN,从而支撑HA高可用集群的实现

九、什么是Hadoop的HA?

​ HA高可用的愿景是让Hadoop集群在任何情况下都能正常提供服务,二代Hadoop的实现是搭建两台NN,一台Active对外服务,一台Standby替补,而三代可以搭建多台NN,一台Active,多台Standby

十、描述一下HDFS-HA的工作机制?

思想是通过多NameNode消除单点故障

1. 改变元数据管理方式:
  	1. 不同NN间各自保存一份元数据
  	2. 编辑日志只能Active状态的NN写,但是所有NN都能读
	2. 实现一个状态管理功能模块
  	1. zk负责切换状态
	3. NN隔离:同一时间有且仅有一台NN对外服务
	4. 保证NN之间ssh免密登录
	5. 实现自动故障转移

十一、如何实现HA的集群搭建?

搭建zookeeper集群、改hdfs-site.xml配置文件,改core-site.xml配置文件,改yarn-site.xml配置文件,配置HDFS-HA自动故障转移

十二、HDFS如何实现自动故障转移?

​ 集群中的每台NN都绑定一个ZKFC服务,用于监视自己的健康状态,如果自己挂了, 由ZKFC告诉ZK,从而把ZK中保存自己健康状态的临时数据节点干掉,此时ZK通知其他Standby状态的NN,让他们来ZK里边抢着创建节点

这个临时节点谁先创建到,谁就是Active状态,那么没创建到临时节点的NN就只能是Standby状态

十三、什么是脑裂问题?HDFS-HA中如何解决的脑裂问题?

Active状态的NN假死,ZK通知其他NN来创建节点,但是假死的NN又活了,导致ZK不知所措的情况,就是脑裂问题

为了防止脑裂问题,如果遇到Active状态的NN挂掉,不管是真死还是假死,ZK都会通知其他NN来创建健康状态的临时数据节点,在其他NN成为新的Active状态之前,先远程登录到之前那个挂掉的NN上执行kill命令,让它死的彻底,然后新的NN上位,成为Active状态对外提供服务

十四、YARN-HA 实现高可用的思路

Active状态的RM向ZK集群写自己的状态,如果写入失败,启动Standby状态的RM,再次向ZK集群注册,注册成功后ZK同步RM的状态信息

十五、简单说一下联邦架构(HDFS Federation) 架构设计思想。

为了水平扩展名称服务,Federation使用多组独立的Namenodes/Namespaces。所有的Namenodes是联邦的,也就是说,他们之间相互独立且不需要互相协调,各自分工,管理自己的区域。Datanode被用作通用的数据块存储设备,每个DataNode要向集群中所有的Namenode注册,且周期性的向所有Namenode发送心跳和块报告,并执行来自所有Namenode的命令。