Fork me on GitHub

Hadoop HDFS高可用机制

目录

  • 背景
  • 第一部分 Spark内存管理详解
  • 第二部分 Spark参数说明
  • 第三部分 Spark内存优化
  • 第四部分 常见线上问题解决
  • 参考文献及资料

背景

先从一个生产线上问题说起。生产线上我们使用的华为封装的Hadoop大数据平台,使用开源版本Flink 1.11作为Flink客户端提交任务到平台Yarn集群上运行。

但是提交后报错:

1
cused by: java.lang.NoSuchMethodException: org.aphache.hadoop.hdfs.server.namedode.ha.AdaptiveFailoverProxyProvider.<int>....

即在提交过程中Flink客户端找不到下面这个java class类导致的:

1
org.aphache.hadoop.hdfs.server.namedode.ha.AdaptiveFailoverProxyProvider

通过官网(如下),这个类是用来寻找active状态的HDFS NameNode服务的。通常对于开源集群默认类是:

1
org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider

然而华为集群自定义了这个类(参考客户端中配置文件),所以开源Flink包中并没有这个类,所以会报错找不到类。

重新调整客户端中的配置为开源默认参数(或者集群控制台中修改生效后,重新下载和部署客户端),既能提交任务。

  • dfs.client.failover.proxy.provider.[nameservice ID] - the Java class that HDFS clients use to contact the Active NameNode

    Configure the name of the Java class which will be used by the DFS Client to determine which NameNode is the current Active, and therefore which NameNode is currently serving client requests. The two implementations which currently ship with Hadoop are the ConfiguredFailoverProxyProvider and the RequestHedgingProxyProvider (which, for the first call, concurrently invokes all namenodes to determine the active one, and on subsequent requests, invokes the active namenode until a fail-over happens), so use one of these unless you are using a custom proxy provider. For example:

    1
    2
    3
    <property>
    <name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>

本文将介绍背后的原因。

第一部分 HDFS服务高可用原理

1.1 HDFS服务

Hadoop 2.0.0 之前,集群只有一个Namenode服务,这显然是个单点问题。对于线上生产环境部署NameNode服务的服务器机器发生宕机,会导致整个HDFS服务不可用。即使应急快,NameNode节点从磁盘中将元数据加载至内存也是一个极端缓慢的过程(大数据场景)。显然这对于业务连续性要求是不能容忍的。另外日常运维中,对于NameNode的变更需要计划内停机,在变更过程中,集群同样是不能对外提供服务的。

所以在Hadoop 2.0 +之后的版本引入了HA高可用机制。HA using Quorum Journal Manager (QJM)是当前主流HDFS HA方案,由Cloudera工程师Todd Lipcon在2012年发起,随Hadoop 2.0.3发布,此后一直被视为HDFS HA默认方案。具体架构图如下。

注:我们在架构图(参考网络)中看到FailoverController了。

hdfsHA1

在现有框架下,HDFS一共有下面几类服务:

  • DataNode(DN);数据节点;

    除了通过共享存储系统共享 HDFS 的元数据信息之外,主 NameNode 和备 NameNode 还需要共享 HDFS 的数据块和 DataNode 之间的映射关系。DataNode 会同时向主 NameNode 和备 NameNode 上报数据块的位置信息。

  • NameNode(NN);管理节点;

    Active NameNode 和 Standby NameNode:两台 NameNode 形成互备,一台处于 Active 状态,为主 NameNode,另外一台处于 Standby 状态,为备 NameNode,只有主 NameNode 才能对外提供读写服务。

  • ZKFailoverController(FailoverControllerActive\Standby);服务角色:主备切换控制器;

  • JournalNode(JN);共享存储;

    共享存储系统是实现 NameNode 的高可用最为关键的部分,共享存储系统保存了 NameNode 在运行过程中所产生的 HDFS 的元数据。主 NameNode 和NameNode 通过共享存储系统实现元数据同步。在进行主备切换的时候,新的主 NameNode 在确认元数据完全同步之后才能继续对外提供服务,主要有JournalNode 。

  • Zookeeper集群(ZK);提供主备选举支持(通常和其他HA服务共用);

    ZKFailoverController 作为独立的进程运行,对 NameNode 的主备切换进行总体控制。ZKFailoverController 能及时检测到 NameNode 的健康状况,在主 NameNode 故障时借助 Zookeeper 实现自动的主备选举和切换,当然 NameNode 目前也支持不依赖于 Zookeeper 的手动主备切换。

1.2 HA机制原理

1.2.1 机制

当Active NN故障时,Zookeeper创建的临时节点ActiveStandbyElectorLock将要被删除,其他NN节点注册的Watcher 来监听到该变化,NN节点的ZKFailoverController 会马上再次进入到创建/hadoop-ha/${dfs.nameservices}/ActiveStandbyElectorLock 节点的流程,如果创建成功,这个本来处于 Standby 状态的 NameNode 就选举为主 NameNode 并随后开始切换为 Active 状态。

新当选的Active NN将确保从QJM(Quorum Journal Manager)同步完所有的元数据文件EditLog文件,然后切换为主节点,并向外提供服务。

1.2.2 手动切换

Hadoop客户端提供haadmin命令对NN节点可以实时手动切换,具体命令清单有:

1
2
3
4
5
6
hdfs haadmin -checkHealth <serviceId>
hdfs haadmin -failover [--forcefence] [--forceactive] <serviceId> <serviceId>
hdfs haadmin -getServiceState <serviceId>
hdfs haadmin -help <command>
hdfs haadmin -transitionToActive <serviceId> [--forceactive]
hdfs haadmin -transitionToStandby <serviceId>

其中serviceId可以通过配置文件hdfs.xml中找到service id,配置文件内容如下:

1
2
3
4
5
6
7
<property>
<name>dfs.nameservices</name>
<value>cluster</value>
</property>
<property>
<name>dfs.ha.namenodes.cluster</name>
<value>14,15</value>

所以集群的NN节点有两个,名称为:14、15(比较特别,这是华为大数据产品)。

那么就可以通过下面的命令来查看NN的状态:

1
2
3
4
hdfs haadmin -getServiceState 14
# active
hdfs haadmin -getServiceState 15
# standy

通过下面命令把active服务调整为standy:

1
2
hdfs haadmin -transitionToStandby 14 --forcemanual
# 会回显风险提示确认是否继续

第二部分 客户端交互

便于客户端确定哪个nn是主节点。对于第一次调用,它同时调用所有名称节点以确定活动的名称节点,之后便直接调用主节点(active nn),可以理解帮助客户端获取主节点的代理。 ConfiguredFailoverProxyProvider 和RequestHedgingProxyProvider 选其一即可。

HDFS jar包冲突列表

Jar包名称 描述 处理方案
hadoop-plugins-*.jar HDFS可以直接使用开源同版本的hadoop包运行样例代码,但是MRS 3.x之后的版本默认的主备倒换类是dfs.client.failover.proxy.provider.hacluster=org.apache.hadoop.hdfs.server.namenode.ha.AdaptiveFailoverProxyProvider默认HDFS的LZC压缩格式类io.compression.codec.lzc.class=com.huawei.hadoop.datasight.io.compress.lzc.ZCodec 方式一:参考样例代码里面的pom.xml文件,增加配置:<properties> <hadoop.ext.version>8.0.2-302002</hadoop.ext.version> </properties> ... <dependency> <groupId>com.huawei.mrs</groupId> <artifactId>hadoop-plugins</artifactId> <version>${hadoop.ext.version}</version> </dependency>方式二:将hdfs-site.xml配置文件里面的参数dfs.client.failover.proxy.provider.hacluster改为开源一致的值:org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider不使用LZC压缩格式。

参考文献及资料

1、RuoYi-Cloud项目文档,链接:https://blog.csdn.net/ifenggege/article/details/107968518

本文标题:Hadoop HDFS高可用机制

文章作者:rong xiang

发布时间:2022年01月16日 - 13:01

最后更新:2022年10月25日 - 23:10

原始链接:https://zjrongxiang.github.io/posts/12db6541/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%