之前已在虚拟机安装好了zookeeper和hdfs2.3.6,并确认这两个东西能正常使用。安装好hbase1.4.1后启动找不到hmaster进程,已确认没有版本冲突。但能启动HRegionServer进程。然后ip:16010/master-status访问根本拒绝访问。
启动报错(警告)
OpenJDK 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0
OpenJDK 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0
这个warning其实不用管,如果你想也可以直接注释掉↓
我的JDK使用的是jdk1.8.0_291,我们只需要把hbase-env.sh里面的
# Configure PermSize. Only needed in JDK7. You can safely remove it for JDK8+
#export HBASE_MASTER_OPTS=“KaTeX parse error: Expected 'EOF', got '#' at position 90: …acheSize=256m" #̲export HBASE_RE…HBASE_REGIONSERVER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m -XX:ReservedCodeCacheSize=256m”
解决2.1的报错后,启动就不会报错了。但是还是起不来,查看hbase的日志
(hbase的日志在hbase根目录下的logs文件夹),发现报错。
2021-08-09 11:19:42,786 INFO [master/node2/192.168.76.201:16000] client.ZooKeeperRegistry: ClusterId read in ZooKeeper is null
2021-08-09 11:19:42,950 FATAL [node2: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
org.apache.hadoop.hdfs.server.namenode.ha.StandbyState.checkOperation(StandbyState.java:87)
at org.apache.hadoop.hdfs.server.namenode.NameNode$NameNodeHAContext.checkOperation(NameNode.java:1774)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkOperation(FSNamesystem.java:1313)
大意是失败了因为待机状态不支持READ操作类别,下面是一串hdfs的namnode的错误堆栈。我想起来了我的hdfs是分布式高可用的,NameNode部署在node1和node2两个节点,平时都是node1是active,node2是standby。
而hbase我安装在node2,hbase-site.xml配置hbase.rootdir也配的node2。你配的是node2,结果node2的hdfs根本是待机状况操作不了hdfs,这不为难hbase吗?所以思路也来了,就是在hbase.rootdir填写的是active的节点就好了,这在hdfs是单机安装是没问题的。但是由于我hdfs做了高可用这里填写node1 or node2 都不太好因为active节点可以切换。
这里应该填写你hdfs-site.xml中dfs.nameservices的value值,
比如hdfs-site.xml你是这样配的
……
<property>
<name>dfs.nameservices</name>
<value>mizuho</value>
</property>
……
那你的hbase-site.xml 应该这样写
……
<property>
<name>hbase.rootdir</name>
<value>hdfs://mizuho/hbase</value>
</property>
……
因为是调错我偷懒直接停掉node1的namenode用命令让node2 状态active
hadoop-daemon.sh stop namenode
当然也可以偷懒改配置,vi hbase-site.xml,node1换成自己hdfs 平时的活跃的active就好了。具体是写命名空间还是节点名看自己的hdfs配的是单机版还是分布式
……
<property>
<name>hbase.rootdir</name>
<value>hdfs://node1:8020/hbase</value>
</property>
……
再次启动,结果还是找不到hmaster,再次查看日志。发现报错
java.io.IOException: Cannot run program “/usr/local/hadoop271/etc/hadoop/rackaware/rackaware.sh” (in directory “/usr/local/hbase141”): error=2, No such file or directory
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
at org.apache.hadoop.util.Shell.runCommand(Shell.java:526)
at org.apache.hadoop.util.Shell.run(Shell.java:482)
at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:776)
at org.apache.hadoop.net.ScriptBasedMapping$RawScriptBasedMapping.runResolveCommand(ScriptBasedMapping.java:251)
at org.apache.hadoop.net.ScriptBasedMapping$RawScriptBasedMapping.resolve(ScriptBasedMapping.java:188)
Cannot run program "/usr/local/hadoop271/etc/hadoop/rackaware/rackaware.sh 就是找不到机架感知的这个脚本。看到报错我想起来了,之前学习hdfs的时候在node1节点配置了机架感知,然后配置文件同步到node2。但我只在node1练习了机架感知操作,即node2虽然配置开启了机架感知但node2我没有写相应的脚本。
这是上一步我直接切node2偷懒的锅,如果上一步直接改好了配置就没这个问题了
。我选择scp命令 把node1的rackaware这个文件夹传到node2
改完后 访问 http://node2:16010/master-status,成功!
总结一下,代码不会骗我,日志更不会骗我。多看日志多查资料!