在全分布式模式下, 集群包含多个节点, 每个节点运行一个或多个HBase守护进程。 包括主 和 备用Master 实例,多ZK节点 和 多RegionServer 节点。
下图展示了一个三节点集群:
首先保证各个节点通讯畅通。
配置ssh 的无密码访问。
配置node-a
- 由于node-a 不允许RegionServer , 所以配置其不运行。 在conf/regionservers配置文件中, 删除localhost 这一行, 并添加node-b node-c的主机名或ip地址。
如果想同时在node-a运行RegionServer ,也应该在配置host-a的主机名,不建议使用localhost 。
配置node-b 为备用hmaster
创建conf/backup-masters , 将node-b的主机名写入配置文件。配置zk
在conf/hbase-site.xml中配置zk属性:
<property>
<name>hbase.zookeeper.quorum</name>
<value>node-a.example.com,node-b.example.com,node-c.example.com</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/usr/local/zookeeper</value>
</property>
- 配置文件中的任何地方,涉及到localhost的都要要改成相应的主机名。
配置node-b 和 node-c
- 下载和解压 Hbase .
- 拷贝配置文件, 从node-a 到 node-b 和 node-c
启动 和测试集群
- 确定hbase没有在任何节点运行。
- 启动集群
在node-a上 , 执行start-hbase.sh 命令 。
$ bin/start-hbase.sh
node-c.example.com: starting zookeeper, logging to /home/hbuser/hbase-0.98.3-hadoop2/bin/../logs/hbase-hbuser-zookeeper-node-c.example.com.out
node-a.example.com: starting zookeeper, logging to /home/hbuser/hbase-0.98.3-hadoop2/bin/../logs/hbase-hbuser-zookeeper-node-a.example.com.out
node-b.example.com: starting zookeeper, logging to /home/hbuser/hbase-0.98.3-hadoop2/bin/../logs/hbase-hbuser-zookeeper-node-b.example.com.out
starting master, logging to /home/hbuser/hbase-0.98.3-hadoop2/bin/../logs/hbase-hbuser-master-node-a.example.com.out
node-c.example.com: starting regionserver, logging to /home/hbuser/hbase-0.98.3-hadoop2/bin/../logs/hbase-hbuser-regionserver-node-c.example.com.out
node-b.example.com: starting regionserver, logging to /home/hbuser/hbase-0.98.3-hadoop2/bin/../logs/hbase-hbuser-regionserver-node-b.example.com.out
node-b.example.com: starting master, logging to /home/hbuser/hbase-0.98.3-hadoop2/bin/../logs/hbase-hbuser-master-nodeb.example.com.out
在各个节点上使用jps , 查看启动的守护进程。
(在master上启动后, 其他节点会自动启动 ?)
浏览web ui
对于hbase版本高于0.98.x的, Http 端口由原来的60010 、60030 更改为16010 和16030 。 (Master 使用16010; RegionServer使用16030 )
若所有的配置都正确, 则可以通过http://node-a.example.com:16010/
连接master的web , 或者通过http://node-b.example.com:16010/连接备用master 。
对于每一个RegionServer 通过16030端口访问web。
遇到的异常:
- hbase.procedure.store.wal.use.hsync 报错:
2018-05-23 21:29:41,388 ERROR [master/node202:16000] 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:1043)
at org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.recoverLease(WALProcedureStore.java:382)
at org.apache.hadoop.hbase.procedure2.ProcedureExecutor.start(ProcedureExecutor.java:530)
at org.apache.hadoop.hbase.master.HMaster.startProcedureExecutor(HMaster.java:1222)
at org.apache.hadoop.hbase.master.HMaster.startServiceThreads(HMaster.java:1141)
at org.apache.hadoop.hbase.master.HMaster.finishActiveMasterInitialization(HMaster.java:849)
at org.apache.hadoop.hbase.master.HMaster.startActiveMasterManager(HMaster.java:2019)
at org.apache.hadoop.hbase.master.HMaster.run(HMaster.java:553)
at java.lang.Thread.run(Thread.java:748)
解决: 发现hbase的lib包下的hadoop版本是2.7.4 版本, 而当前的hadoop集群使用的是cdh 5.14.2 , 随使用hadoop集群中的jar替换之。 运行成功启动。
然后在日志中发现这个问题:
2018-05-23 21:52:52,179 INFO [qtp541248718-81] util.Threads: Can not find hadoop 2.7+ printThreadInfo method, try hadoop hadoop 2.6 and earlier
java.lang.NoSuchMethodException: org.apache.hadoop.util.ReflectionUtils.printThreadInfo(java.io.PrintStream, java.lang.String)
at java.lang.Class.getMethod(Class.java:1786)
at org.apache.hadoop.hbase.util.Threads$PrintThreadInfoLazyHolder.initHelper(Threads.java:285)
at org.apache.hadoop.hbase.util.Threads$PrintThreadInfoLazyHolder.<clinit>(Threads.java:279)
at org.apache.hadoop.hbase.util.Threads.printThreadInfo(Threads.java:340)
at org.apache.hadoop.hbase.master.MasterDumpServlet.doGet(MasterDumpServlet.java:84)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:848)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1772)
这不是个致命问题, 是由于替换hadoop 版本导致的。
(但是会不会有其他问题,暂时未发现。 后续考虑使用hbase源码编译一个版本出来。)
- 已有zookeeper 与自带的冲突:
- 修改hbase-env.sh , 设置 export HBASE_MANAGES_ZK=false