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