【原創】大叔問題定位分享(24)hbase standalone方式啟動報錯


hbase 2.0.2

hbase standalone方式啟動報錯:

2019-01-17 15:49:08,730 ERROR [Thread-24] master.HMaster: Failed to become active master

java.lang.IllegalStateException: The procedure WAL relies on the ability to hsync for proper operation during component failures, but the underlying filesystem does not support doing so. Please check the config value of 'hbase.procedure.store.wal.use.hsync' to set the desired level of robustness and ensure the config value of 'hbase.wal.dir' points to a FileSystem mount that can provide it.

        at org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.rollWriter(WALProcedureStore.java:1082)

        at org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.recoverLease(WALProcedureStore.java:423)

        at org.apache.hadoop.hbase.procedure2.ProcedureExecutor.init(ProcedureExecutor.java:714)

        at org.apache.hadoop.hbase.master.HMaster.createProcedureExecutor(HMaster.java:1398)

        at org.apache.hadoop.hbase.master.HMaster.finishActiveMasterInitialization(HMaster.java:857)

        at org.apache.hadoop.hbase.master.HMaster.startActiveMasterManager(HMaster.java:2225)

        at org.apache.hadoop.hbase.master.HMaster.lambda$run$0(HMaster.java:568)

        at java.lang.Thread.run(Thread.java:748)

報錯原因異常message里描述的比較清楚,standalone方式直接使用本地磁盤,而本地磁盤不支持hsync,查看配置:

  <property>

    <name>hbase.procedure.store.wal.use.hsync</name>

    <value>true</value>

  </property>

改為false再啟動,依然報錯,跟進代碼:

org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore

  private final boolean enforceStreamCapability;

  public WALProcedureStore(final Configuration conf, final Path walDir, final Path walArchiveDir,
      final LeaseRecovery leaseRecovery) throws IOException {
...
    this.enforceStreamCapability = conf.getBoolean(CommonFSUtils.UNSAFE_STREAM_CAPABILITY_ENFORCE, true);
...

  boolean rollWriter(final long logId) throws IOException {
...
    final String durability = useHsync ? "hsync" : "hflush";
    if (enforceStreamCapability && !(CommonFSUtils.hasCapability(newStream, durability))) {
        throw new IllegalStateException("The procedure WAL relies on the ability to " + durability +
          " for proper operation during component failures, but the underlying filesystem does " +
          "not support doing so. Please check the config value of '" + USE_HSYNC_CONF_KEY +
          "' to set the desired level of robustness and ensure the config value of '" +
          CommonFSUtils.HBASE_WAL_DIR + "' points to a FileSystem mount that can provide it.");
    }
...

可見hbase.procedure.store.wal.use.hsync如果為true,則使用hsync;如果為false,則使用hflush;
兩種都會報錯,這時注意到還有一個變量控制enforceStreamCapability,這個變量對應的配置為hbase.unsafe.stream.capability.enforce,將該配置設置為false,問題解決;

什么情況下需要standalone hbase,通常是初學者練習使用,不過也有一些產品在用,比如ambari的metrics collector;

關於Standalone HBase

This is the default mode. In standalone mode, HBase does not use HDFS -- it uses the local filesystem instead -- and it runs all HBase daemons and a local ZooKeeper all up in the same JVM. Zookeeper binds to a well known port so clients may talk to HBase.

standalone方式詳見官方文檔:
http://hbase.apache.org/0.94/book/quickstart.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM