目前情况:
HBase和Zookeeper进程均有,而且都没有掉线。
但是进入hbase shell之后,执行list命令报以下错误:
ERROR: org.apache.hadoop.hbase.ipc.ServerNotRunningYetException: Server is not running yet
at org.apache.hadoop.hbase.master.HMaster.checkServiceStarted(HMaster.java:3160)
at org.apache.hadoop.hbase.master.MasterRpcServices.isMasterRunning(MasterRpcServices.java:1159)
at org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos$MasterService$2.callBlockingMethod(MasterProtos.java)
at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:385)
at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:124)
at org.apache.hadoop.hbase.ipc.RpcHandler.run(RpcHandler.java:102)
at org.apache.hadoop.hbase.ipc.RpcHandler.run(RpcHandler.java:82)
网上有很多教程说退出HDFS的安全模式就可以了,然而我并没有进入安全模式,所以没法解决。经过尝试,发现了问题,我在hbase-site.xml文件中添加以下配置,重新启动ZK和HBase就可以了:
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property>
<property>
<name>hbase.wal.provider</name>
<value>filesystem</value>
</property>
这两个配置项在HBase中的含义如下:
-
hbase.unsafe.stream.capability.enforce
:这个配置项控制HBase是否检查流功能(hflush / hsync)。如果你打算在rootdir表示的LocalFileSystem上运行,那就禁用此选项。在你的配置中,这个值被设置为false
,意味着HBase不会检查流功能。 -
hbase.wal.provider
:这个配置项用于设置WAL(Write Ahead Log)提供者。WAL记录了所有对HRegion的持久化修改。这个接口为所有WAL实现者提供了入口点。在你的配置中,这个值被设置为filesystem
,意味着你正在使用文件系统作为WAL提供者。
对于伪分布式环境与分布式环境,关于上面两个配置项的解释如下:
hbase.unsafe.stream.capability.enforce
:在这两种环境中,这个配置项的值通常都设置为false
,因为HBase通常运行在HDFS之上,而HDFS支持hflush和hsync操作。
hbase.wal.provider
:在这两种环境中,这个配置项的值通常都设置为filesystem
,因为HBase通常使用文件系统作为WAL提供者。