将非 HA 的 Hadoop 集群升级为 HA 集群时遇到的两个问题

将非 HA 的 Hadoop 集群升级为 HA 集群时遇到的两个问题


前几天把非 HA 的 Hadoop 集群升级为 HA 集群,遇到了两个问题


1
2
3
4
5
WARN org.apache.hadoop.hdfs.server.namenode.ha.EditLogTailer: Edit log tailer interrupted
...
FATAL org.apache.hadoop.hdfs.server.namenode.FSEditLog: Error: recoverUnfinalizedSegments failed for required journal (JournalAndStream(mgr=QJM to [10.10.10.11:8485, 10.10.10.12:8485, 10.10.10.13:8485], stream=null))
...
Journal Storage Directory /opt/journalnode/journal_id not formatted ; journal id: journal_id
  • 原因是 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
      


具体症状是:

  • 先前能正常运行的 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>
          	<!-- ... -->
          

其实早在最初搭建好 HA 环境的时候,对配置文件进行检查,就意识到这个问题

但因 “大多数情况下,还是 centos7-1 节点跑在 Active 模式,HBase 也就正常运行(使得该问题具备一定隐秘性)”,就急急忙忙继续做后面的事,没去查找解决方法,及时处理

结果这个问题就在一个比较关键的时刻发生了……

人生,就是发现问题要及时解决,不要拖延回避,否则,问题总会在你无法回避的时候让你措手不及!!!

相关内容