0479-如何禁用HDP2.6.5的HDFS HA

温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。

Fayson的github: https://github.com/fayson/cdhproject

提示:代码块部分可以左右滑动查看噢

1

文档编写目的

Fayson为了方便接下来从HDP迁移到CDH的工作,这里先补充一篇如何禁用HDP的HDFS的HA,从HDP原地迁移到CDH,如果你的原HDP集群有HA的话,为了因为Zookeeper,JournalNode配置带来的不适应,先取消HA会更保险一些。这里还是要吐槽一下HDP的HDFS HA功能,使用Ambari可以界面化的启用HA,但是要禁用会非常非常麻烦,需要手动做很多个步骤才能最终取消成功。Cloudera Manager还是要方便很多,这一块可以参考Fayson之前的文章《如何使用Cloudera Manager启用HDFS的HA》和《如何使用Cloudera Manager禁用HDFS HA》。本文Fayson主要是介绍如何手动禁用HDP的HDFS的HA。前置条件当然是你使用Ambari开启了HDFS的HA了,如何开启Fayson在本文就不会再做描述了。

  • 内容概述

1.测试环境说明

2.禁用HDFS的HA

3.组件服务验证

4.总结

  • 测试环境

1.HDP2.6.5

2.Ambari2.6.2.2

3.集群已启用HDFS HA

4.Redhat7.4

5.集群未启用Kerberos

6.采用root用户操作

2

测试环境说明

1.首先Fayson已经预先在4台机器预先安装好了HDP,安装了一些常见服务,HDFS已经启用了HA,并且在HDFS,Hive表和HBase中都导入了数据。

2.集群主要角色划分如下,因为禁用HDFS的HA主要跟Ambari和HDFS服务相关,所以其他角色不做介绍。

主机名

IP地址

角色

ip-172-31-1-163.ap-southeast-1.compute.internal

172.31.1.163

Active NameNode,ZooKeeper,DataNode,ZKFC,JournalNode

ip-172-31-12-114.ap-southeast-1.compute.internal

172.31.12.114

ZooKeeper,DataNode,JournalNode

ip-172-31-13-13.ap-southeast-1.compute.internal

172.31.13.13

ZooKeeper,DataNode

ip-172-31-4-109.ap-southeast-1.compute.internal

172.31.4.109

ZKFC,Standby NameNode,JournalNode

3.Ambari Server安装在172.31.4.109节点上,账号密码是默认的admin/admin,端口是默认的8080,禁用HA以后NameNode将会在172.31.4.109节点,使用172.31.12.114节点作为Secondary NameNode,2个ZKFC和3个JournalNode角色都将会删除。

3

禁用HDFS的HA

3.1

停止HBase服务

1.这一步官网单独拎出来,估计主要因为担心HBase还有数据写入,而HBase的数据又是保存在HDFS上的,会影响后面的HDFS保存元数据的检查点。

2.操作比较简单,直接在Ambari页面上进行操作。

3.2

保存Active NameNode的检查点

为了阻断HDFS的写入,这里先将HDFS进入安全模式,并持久化保存HDFS元数据。

1.确认集群的Active NameNode节点

2.在集群的Active NameNode上执行以下命令:

sudo -u hdfs hdfs dfsadmin -safemode enter 
sudo -u hdfs hdfs dfsadmin -saveNamespace

3.3

停止集群所有服务

3.4

确认HBase的HDFS数据目录配置

1.在Ambari节点上执行以下命令

/var/lib/ambari-server/resources/scripts/configs.py --user=admin --password=admin --port=8080 --action=get --host=localhost --cluster=Cluster1 --config-type=hbase-site

注意以上参数需要替换为集群的实际名称,包括user,password,port,cluster等,Fayson的HDP集群名称为Cluster1,注意本文Fayson这里只做一次说明,后面的所有命令将不在注释。

2.主要是确认hbase.rootdir的配置,如上图所示,如果你跟Fayson的集群情况一样不是绝对路径而是/apps/hbase/data,则跳过这步,不用做操作。否则你需要做如下操作:

"hbase.rootdir":"hdfs://<name-service-id>:8020/apps/hbase/data"

修改为

"hbase.rootdir":"hdfs://<nn01.mycompany.com>:8020/apps/hbase/data"

3.5

删除ZKFC

1.在Ambari节点上执行一下命令确认ZKFC的两个节点

curl -u admin:admin -H "X-Requested-By: ambari" -i http://localhost:8080/api/v1/clusters/Cluster1/host_components?HostRoles/component_name=ZKFC

2.删除这2个节点的ZKFC角色

curl -u admin:admin -H "X-Requested-By: ambari" -i -X DELETE http://localhost:8080/api/v1/clusters/Cluster1/hosts/ip-172-31-1-163.ap-southeast-1.compute.internal/host_components/ZKFC 

curl -u admin:admin -H "X-Requested-By: ambari" -i -X DELETE http://localhost:8080/api/v1/clusters/Cluster1/hosts/ip-172-31-4-109.ap-southeast-1.compute.internal/host_components/ZKFC

3.再次确认已经删除成功,就是执行第一步的命令

curl -u admin:admin -H "X-Requested-By: ambari" -i http://localhost:8080/api/v1/clusters/Cluster1/host_components?HostRoles/component_name=ZKFC

“items”为空表明删除成功

3.6

修改HDFS配置

主要是删除hdfs-site.xml和core-site.xml里跟HA配置相关的操作,这一个步骤是操作内容最多也最复杂的,如果不仔细容易少删或者多删配置项而最终导致HA禁用不成功。

1.首先是在Ambari节点上执行以下命令检查hdfs-site.xml的配置项

/var/lib/ambari-server/resources/scripts/configs.py --user=admin --password=admin --port=8080 --action=get --host=localhost --cluster=Cluster1 --config-type=hdfs-site

2.执行以下命令删除HA相关的配置

/var/lib/ambari-server/resources/scripts/configs.py --user=admin --password=admin --port=8080 --action=delete --host=localhost --cluster=Cluster1 --config-type=hdfs-site -k dfs.nameservices
/var/lib/ambari-server/resources/scripts/configs.py --user=admin --password=admin --port=8080 --action=delete --host=localhost --cluster=Cluster1 --config-type=hdfs-site -k dfs.internal.nameservices
/var/lib/ambari-server/resources/scripts/configs.py --user=admin --password=admin --port=8080 --action=delete --host=localhost --cluster=Cluster1 --config-type=hdfs-site -k dfs.client.failover.proxy.provider.nameservice1
/var/lib/ambari-server/resources/scripts/configs.py --user=admin --password=admin --port=8080 --action=delete --host=localhost --cluster=Cluster1 --config-type=hdfs-site -k dfs.ha.namenodes.nameservice1
/var/lib/ambari-server/resources/scripts/configs.py --user=admin --password=admin --port=8080 --action=delete --host=localhost --cluster=Cluster1 --config-type=hdfs-site -k dfs.ha.fencing.methods
/var/lib/ambari-server/resources/scripts/configs.py --user=admin --password=admin --port=8080 --action=delete --host=localhost --cluster=Cluster1 --config-type=hdfs-site -k dfs.ha.automatic-failover.enabled
/var/lib/ambari-server/resources/scripts/configs.py --user=admin --password=admin --port=8080 --action=delete --host=localhost --cluster=Cluster1 --config-type=hdfs-site -k dfs.namenode.http-address.nameservice1.nn1
/var/lib/ambari-server/resources/scripts/configs.py --user=admin --password=admin --port=8080 --action=delete --host=localhost --cluster=Cluster1 --config-type=hdfs-site -k dfs.namenode.http-address.nameservice1.nn2
/var/lib/ambari-server/resources/scripts/configs.py --user=admin --password=admin --port=8080 --action=delete --host=localhost --cluster=Cluster1 --config-type=hdfs-site -k dfs.namenode.https-address.nameservice1.nn1
/var/lib/ambari-server/resources/scripts/configs.py --user=admin --password=admin --port=8080 --action=delete --host=localhost --cluster=Cluster1 --config-type=hdfs-site -k dfs.namenode.https-address.nameservice1.nn2
/var/lib/ambari-server/resources/scripts/configs.py --user=admin --password=admin --port=8080 --action=delete --host=localhost --cluster=Cluster1 --config-type=hdfs-site -k dfs.namenode.rpc-address.nameservice1.nn1
/var/lib/ambari-server/resources/scripts/configs.py --user=admin --password=admin --port=8080 --action=delete --host=localhost --cluster=Cluster1 --config-type=hdfs-site -k dfs.namenode.rpc-address.nameservice1.nn2
/var/lib/ambari-server/resources/scripts/configs.py --user=admin --password=admin --port=8080 --action=delete --host=localhost --cluster=Cluster1 --config-type=hdfs-site -k dfs.namenode.shared.edits.dir
/var/lib/ambari-server/resources/scripts/configs.py --user=admin --password=admin --port=8080 --action=delete --host=localhost --cluster=Cluster1 --config-type=hdfs-site -k dfs.journalnode.edits.dir
/var/lib/ambari-server/resources/scripts/configs.py --user=admin --password=admin --port=8080 --action=delete --host=localhost --cluster=Cluster1 --config-type=hdfs-site -k dfs.journalnode.http-address
/var/lib/ambari-server/resources/scripts/configs.py --user=admin --password=admin --port=8080 --action=delete --host=localhost --cluster=Cluster1 --config-type=hdfs-site -k dfs.journalnode.https-address
/var/lib/ambari-server/resources/scripts/configs.py --user=admin --password=admin --port=8080 --action=delete --host=localhost --cluster=Cluster1 --config-type=hdfs-site -k dfs.journalnode.kerberos.internal.spnego.principal
/var/lib/ambari-server/resources/scripts/configs.py --user=admin --password=admin --port=8080 --action=delete --host=localhost --cluster=Cluster1 --config-type=hdfs-site -k dfs.journalnode.kerberos.principal
/var/lib/ambari-server/resources/scripts/configs.py --user=admin --password=admin --port=8080 --action=delete --host=localhost --cluster=Cluster1 --config-type=hdfs-site -k dfs.journalnode.keytab.file

注意nameservice1需要根据实际情况进行替换。

这里理论应该将这些参数与第一步的打印结果进行比较,对于存在的则删除,具体的参数官网有列出来,参考:

https://docs.hortonworks.com/HDPDocuments/Ambari-2.6.2.2/bk_ambari-operations/content/modify_hdfs_configurations.html

为了方便比较,可以写一个脚本进行校验,这里时间关系Fayson没有再准备。

3.注意HDP官网的配置项少列了两个,如果不删除,后面依旧会导致HDFS服务无法正常启动,如下

/var/lib/ambari-server/resources/scripts/configs.py --user=admin --password=admin --port=8080 --action=delete --host=localhost --cluster=Cluster1 --config-type=hdfs-site -k dfs.namenode.https-address.nameservice1.nn1
/var/lib/ambari-server/resources/scripts/configs.py --user=admin --password=admin --port=8080 --action=delete --host=localhost --cluster=Cluster1 --config-type=hdfs-site -k dfs.namenode.https-address.nameservice1.nn2

4.另外还要增加以下配置,单个NameNode的http地址,这也是官方没有说明的。

/var/lib/ambari-server/resources/scripts/configs.py --user=admin --password=admin --port=8080 --action=set --host=localhost --cluster=Cluster1 --config-type=hdfs-site -k dfs.namenode.http-address -v "ip-172-31-4-109.ap-southeast-1.compute.internal:50070"

/var/lib/ambari-server/resources/scripts/configs.py --user=admin --password=admin --port=8080 --action=set --host=localhost --cluster=Cluster1 --config-type=hdfs-site -k dfs.namenode.https-address -v "ip-172-31-4-109.ap-southeast-1.compute.internal:50470"

5.再次检查hdfs-site.xml的配置

/var/lib/ambari-server/resources/scripts/configs.py --user=admin --password=admin --port=8080 --action=get --host=localhost --cluster=Cluster1 --config-type=hdfs-site

请确认所有HA相关的配置项都已经删除。

6.通过以下命令检查core-site.xml文件的配置。

/var/lib/ambari-server/resources/scripts/configs.py --user=admin --password=admin --port=8080 --action=get --host=localhost --cluster=Cluster1 --config-type=core-site

7.删除配置项ha.zookeeper.quorum

/var/lib/ambari-server/resources/scripts/configs.py --user=admin --password=admin --port=8080 --action=delete --host=localhost --cluster=Cluster1 --config-type=core-site -k ha.zookeeper.quorum

8.重新设置参数fs.defaultFS

/var/lib/ambari-server/resources/scripts/configs.py --user=admin --password=admin --port=8080 --action=set --host=localhost --cluster=Cluster1 --config-type=core-site -k fs.defaultFS -v hdfs://ip-172-31-4-109.ap-southeast-1.compute.internal

9.检查ha.zookeeper.quorum删除成功,fs.defaultFS重新配置成功

/var/lib/ambari-server/resources/scripts/configs.py --user=admin --password=admin --port=8080 --action=get --host=localhost --cluster=Cluster1 --config-type=core-sitere-site -k fs.defaultFS -v hdfs://ip-172-31-4-109.ap-southeast-1.compute.internal

3.7

重新创建Secondary NameNode

1.首先确认集群里没有Secondary NameNode角色

curl -u admin:admin -H "X-Requested-By: ambari" -i -X GET http://localhost:8080/api/v1/clusters/Cluster1/host_components?HostRoles/component_name=SECONDARY_NAMENODE

“items”为空符合预期

2.创建Secondary NameNode角色

curl -u admin:admin -H "X-Requested-By: ambari" -i -X POST -d '{"host_components" : [{"HostRoles":{"component_name":"SECONDARY_NAMENODE"}}] }' http://localhost:8080/api/v1/clusters/Cluster1/hosts?Hosts/host_name=ip-172-31-12-114.ap-southeast-1.compute.internal

3.检查角色创建成功

curl -u admin:admin -H "X-Requested-By: ambari" -i -X GET http://localhost:8080/api/v1/clusters/Cluster1/host_components?HostRoles/component_name=SECONDARY_NAMENODE

3.8

重新启用Secondary NameNode

1.重新启用Secondary NameNode

curl -u admin:admin -H "X-Requested-By: ambari" -i -X PUT -d '{"RequestInfo":{"context":"Enable Secondary NameNode"},"Body":{"HostRoles":{"state":"INSTALLED"}}}' http://localhost:8080/api/v1/clusters/Cluster1/hosts/ip-172-31-12-114.ap-southeast-1.compute.internal/host_components/SECONDARY_NAMENODE

这里需要注意,如果执行命令后返回200,则直接跳过一下步骤到下一个步骤删除JournalNode角色,如果返回202,则等待几分钟后执行以下命令。

2.Fayson这里的环境返回的是202,等待几分钟后再次执行以下命令

curl -u admin:admin -H "X-Requested-By: ambari" -i -X GET "http://localhost:8080/api/v1/clusters/Cluster1/host_components?HostRoles/component_name=SECONDARY_NAMENODE&fields=HostRoles/state"

如果"state": "INSTALLED"不是INSTALLED,则继续等待然后重复执行。

3.为Secondary NameNode角色添加http端口配置

/var/lib/ambari-server/resources/scripts/configs.py --user=admin --password=admin --port=8080 --action=set --host=localhost --cluster=Cluster1 --config-type=hdfs-site -k dfs.namenode.secondary.http-address -v "ip-172-31-12-114.ap-southeast-1.compute.internal:50090"

注意:该步骤是官网文档里不包含的,如果不重新set这个参数,则HDFS回头启动时,Secondary NameNode角色会报异常。

4.检查配置增加成功

/var/lib/ambari-server/resources/scripts/configs.py --user=admin --password=admin --port=8080 --action=get --host=localhost --cluster=Cluster1 --config-type=hdfs-site

3.9

删除三个JournalNode

1.首先确认三个JournalNode在哪3个主机

curl -u admin:admin -H "X-Requested-By: ambari" -i http://localhost:8080/api/v1/clusters/Cluster1/host_components?HostRoles/component_name=JOURNALNODE

2.删除这3个节点上的JournalNode角色

curl -u admin:admin -H "X-Requested-By: ambari" -i -X DELETE http://localhost:8080/api/v1/clusters/Cluster1/hosts/ip-172-31-1-163.ap-southeast-1.compute.internal/host_components/JOURNALNODE
curl -u admin:admin -H "X-Requested-By: ambari" -i -X DELETE http://localhost:8080/api/v1/clusters/Cluster1/hosts/ip-172-31-12-114.ap-southeast-1.compute.internal/host_components/JOURNALNODE
curl -u admin:admin -H "X-Requested-By: ambari" -i -X DELETE http://localhost:8080/api/v1/clusters/Cluster1/hosts/ip-172-31-4-109.ap-southeast-1.compute.internal/host_components/JOURNALNODE

3.确认已经删除成功

curl -u admin:admin -H "X-Requested-By: ambari" -i http://localhost:8080/api/v1/clusters/Cluster1/host_components?HostRoles/component_name=JOURNALNODE

“items”返回为空则表明删除成功

3.10

删除Standby NameNode

1.检查NameNode所在的2个节点

curl -u admin:admin -H "X-Requested-By: ambari" -i http://localhost:8080/api/v1/clusters/Cluster1/host_components?HostRoles/component_name=NAMENODE

2.删除其中一个NameNode

curl -u admin:admin -H "X-Requested-By: ambari" -i -X DELETE http://localhost:8080/api/v1/clusters/Cluster1/hosts/ip-172-31-1-163.ap-southeast-1.compute.internal/host_components/NAMENODE

3.确认已经删除成功

curl -u admin:admin -H "X-Requested-By: ambari" -i http://localhost:8080/api/v1/clusters/Cluster1/host_components?HostRoles/component_name=NAMENODE

显示只有1个NameNode

3.11

确认HDFS服务的相关角色

1.使用Ambari回到HDFS主页面,查看HDFS服务应该包含NameNode,Secondary NameNode和DataNode,不包含JournalNode和Standby NameNode,表明上述的操作成功。

3.12

重新启动HDFS服务

1.使用Ambari界面操作HDFS服务启动

提示NameNode没有启用HA的警告,这里忽略

2.根据需要重新启动其他的服务

4

组件服务验证

4.1

HDFS

[root@ip-172-31-4-109 ~]# hadoop fs -ls /
[root@ip-172-31-4-109 ~]# hadoop fs -cat /tpcds/10/call_center/data-m-00009 | head -1

4.2

HBase

[root@ip-172-31-4-109 ~]# hbase shell
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 1.1.2.2.6.5.0-292, r897822d4dd5956ca186974c10382e9094683fa29, Fri May 11 08:00:59 UTC 2018

hbase(main):001:0> list
TABLE                                                                                                 
TestTable                                                                                             
1 row(s) in 0.4850 seconds

=> ["TestTable"]
hbase(main):002:0> scan 'TestTable',{LIMIT=>10}

4.3

Hive

[root@ip-172-31-12-114 nameservice1]# hive
hive> show databases;
hive> use tpcds_text_10;
hive> select * from call_center limit 1;
hive> select count(*) from call_center;

5

总结

1.在HDP中,启用HDFS HA可以在Ambari界面上直接向导式操作,但是禁用比较麻烦,没办法界面直接操作,得手动一个一个配置项修改,是非常复杂的事情,稍有不慎就有可能操作失败。

2.本文是严格按照官网的文档的步骤来进行操作的,实际可以考虑对于很多配置项的delete和set可以考虑使用Ambari的配置版本管理回滚,尤其是HDFS的hdfs-site.xml和core-site.xml回滚到启用HA之前的状态,这样可以大大节省工作量,也即是本文第三章描述的“3.6 修改HDFS配置”,Fayson没有再实测了,理论可行,网上有这么个玩法的。

3.按照HDP官网的操作步骤有一些坑,会导致后面服务没办法正常启动。

对于hdfs-site.xml需要额外删除以下2个HA相关的参数:

dfs.namenode.https-address.nameservice1.nn1
dfs.namenode.https-address.nameservice1.nn2

另外还需要添加以下配置:

dfs.namenode.http-address
dfs.namenode.https-address

具体参考“3.6 修改HDFS配置”有重点说明

对于Secondary NameNode还需要额外添加以下配置,否则Secondary NameNode服务会告警

dfs.namenode.secondary.http-address

具体参考“3.8 重新启用Secondary NameNode”有重点说明

4.对于HDP官网的步骤缺失问题,有国外网友到HDP社区提问,但是没人理他,他自己找到答案了并解决了。参考如下地址:

dfs.namenode.secondary.http-address

“@Hortonworks社区

没有人帮我,但是我自己找到了解决办法,我认为这些应该加入到官网的“手动回滚NameNode HA”手册的“modify_hdfs_configurations”章节,因为手册的描述有些地方并不清楚。”

最后本文参考地址:

https://docs.hortonworks.com/HDPDocuments/Ambari-2.6.2.2/bk_ambari-operations/content/how_to_roll_back_namenode_ha.html

提示:代码块部分可以左右滑动查看噢

为天地立心,为生民立命,为往圣继绝学,为万世开太平。 温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。

原文发布于微信公众号 - Hadoop实操(gh_c4c535955d0f)

原文发表时间:2018-12-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券