异常信息
2023-10-27 22:12:23,674 ERROR [master/master:16000:becomeActiveMaster] master.HMaster: ***** ABORTING master master,16000,1698415940227: Unhandled exception. Starting shutdown. *****
org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.ipc.StandbyException): Operation category READ is not supported in state standby. Visit https://s.apache.org/sbnn-error
问题描述
这个问题是我部署hbase的时候遇到的,其实在hive部署也遇到过,问题大概就是因为master现在节点状态为standby,所以不能操作到账异常。这里遇到的时候我也奇怪,所以提问了csdn提问,具体我那个时候的描述都在里面。
异常信息:
hbase配置:
<property>
<!--是否开启hbase集群模式 -->
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>master:2181,slave1:2181,slave2:2181,slave3:2181</value>
</property>
<property>
<name>hbase.rootdir</name>
<value>hdfs://master:8020/hbase</value>
</property>
解决办法过程:
首先我也是像大家一样百度子类的,但是基本上但是让我将hdfs://master:8020/hbase改为active的节点或者是在hbase-site.xml添加以下配置,但是基本上没有效果。
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property>
后来我开始整体反推,首先确定这个问题一定是配置出问题。
我的集群是高可用的,如果现在我的hdfs://master:8020/hbase改成hdfs://slave1:8020/hbase,然后salve1故障,master变成active,那这个问题还是一样会出现。
hadoop作为一个成熟的框架这种问题不可能没有考虑,于是我开始找非高可用的hadoop配置,果然发现了。
- 首先比对hadoop的core-site.xml
非高可用的fs.defaultFS配置项
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:8020</value>
</property>
高可用的fs.defaultFS配置项
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
可以发现,非高可用fs.defaultFS配置项是配置了单个namenode的RPC 通信地址,而高可用的fs.defaultFS配置项是配置了集群名称,其他的RPC 通信地址之类的都在hdfs-site.xml中配置了。
而hbase的hbase.rootdir这个配置项作用:告诉HBase,它的数据存储在何处。这里,它设置为hdfs://master:8020/hbase,意味着HBase将在Hadoop分布式文件系统(HDFS)上存储其数据,/hbase是HBase在HDFS上的根目录。
- 分析和推导可行方法
这就回到了原来的问题,现在master是standby所以不能对他操作。即使改成为active的节点等到遇到故障自动转移了,一样出现这个问题。
我就想着将hdfs://master:8020/hbase改成hdfs://mycluster:8020/hbase这样不就好了,这样直接指定集群名称,hadoop应该会自动选择。说干就干。
修改hbase配置:
<property>
<!--是否开启hbase集群模式 -->
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>master:2181,slave1:2181,slave2:2181,slave3:2181</value>
</property>
<property>
<name>hbase.rootdir</name>
<value>hdfs://mycluster:8020/hbase</value>
</property>
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property>
重新启动habse,nice直接成功,查看日志没有异常,节点稳定运行。
可能理解解释不是很好很正确,还请各位资深牛人多多指教改正。有不同看法的也可以评论我们讨论讨论。