将非 HA 的 Hadoop 集群升级为 HA 集群时遇到的两个问题
将非 HA 的 Hadoop 集群升级为 HA 集群时遇到的两个问题
1 背景
前几天把非 HA 的 Hadoop 集群升级为 HA 集群,遇到了两个问题
2 问题一:HDFS 启动报错
|
|
-
原因是 HA 环境下,HDFS 会通过共享机制(这里采用了 qjournal )实现 NN(active)、NN(standby) 都能够访问 Edit log
-
而这个存放 Edit log 的 Journal Storage Directory 也是需要格式化后才能使用的
- 如果是新建的 HA 集群,在对 HDFS 的 name node 执行格式化的时候,会一并进行 Journal Storage Directory 的格式化
- 而这里是将已经使用了一段时间的非 HA 集群升级为 HA 集群,此时如果对 name node 进行格式化,会导致数据擦除
-
后来在这个网页找到了解决方法: “ format the JournalNode directory without formatting the NameNode ”
-
1
hdfs namenode -initializeSharedEdits
-
3 问题二:HBase 启动问题
具体症状是:
-
先前能正常运行的 java 写的 hbase-client 应用,运行报错,发现 HMaster 进程没有启动
-
试着重启 HBase ,结果 HMaster 进程启动若干秒后自行退出
-
检查日志发现:
-
1 2
FATAL [centos7-1:16000.activeMasterManager] master.HMaster: Failed to become active master org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.ipc.StandbyException): Operation category READ is not supported in state standby
-
原因是:
HDFS 现在是 HA 模式了,而 HBase 的配置文件,还是使用了非 HDFS-HA 环境的配置
-
具体是这里,
$HBASE_HOME/conf/hbase-site.xml
-
1 2 3 4 5 6 7 8
<configuration> <!-- 指定hbase在HDFS上存储的路径 --> <property> <name>hbase.rootdir</name> <value>hdfs://centos7-1:9000/hbase</value> </property> <!-- ... -->
- 这样配置,由于大多数情况下,还是 centos7-1 节点跑在 Active 模式,HBase 也就正常运行(使得该问题具备一定隐秘性)
- 而一旦 centos7-1 节点跑在 Standby 模式,就会造成 HBase 启动失败(读取不到存放在 HDFS 上的 HBase 根目录)
-
需要把配置修改为如下,才是 HDFS-HA 环境下正确的
hbase.rootdir
配置,参考-
1 2 3 4 5 6 7 8
<configuration> <!-- 指定hbase在HDFS上存储的路径 --> <property> <name>hbase.rootdir</name> <value>hdfs://clustername/hbase</value> </property> <!-- ... -->
-
对应
$HADOOP_HOME/etc/hadoop/hdfs-site.xml
的集群nameservices
配置-
1 2 3 4 5 6
<!-- ... --> <property> <name>dfs.nameservices</name> <value>clustername</value> </property> <!-- ... -->
-
-
-
4 感想
其实早在最初搭建好 HA 环境的时候,对配置文件进行检查,就意识到这个问题
但因 “大多数情况下,还是 centos7-1 节点跑在 Active 模式,HBase 也就正常运行(使得该问题具备一定隐秘性)”,就急急忙忙继续做后面的事,没去查找解决方法,及时处理
结果这个问题就在一个比较关键的时刻发生了……
人生,就是发现问题要及时解决,不要拖延回避,否则,问题总会在你无法回避的时候让你措手不及!!!