hadoop HA 下 Hbase无法连接外部zookeeper问题
1.搭建好hadoop集群并启动后,安装Hbase,配置好文件,启动HBase,进入hbase shell 后,
输入list 提示如下信息:
hbase(main):001:0> list
TABLE
ERROR: Can't get master address from ZooKeeper; znode data == null
Here is some help for this command:be used to filter the output. Examples:
hbase> listhbase> list 'ns:.*'
错误提示,HMaster 无法从zookeeper集群中获取znode信息,找不到master地址
网上百度一番:说修改配置文件
打开配置文件,发现配置没有问题:
1. hbase-env.sh :
配置pid文件的目录在有访问权限的home 目录下:
export HBASE_PID_DIR=/home/zookeeper-hbase/pids
启用外部zookeeper:
export HBASE_MANAGES_ZK=false
2. hbase-site.xml:
查看zookeeper 节点
1.进入zookeeper shell : bin/zkCli.sh
输入 ls / 查看zookeeper根目录下的所有znode节点:
发现有 hbase-unsecure 这个在配置文件中配置的节点:
获取节点信息: get /hbase-unsecure:
发现该节点下是空的:
网上百度的方法没有解决问题,于是开始分析报错信息:Can't get master address from ZooKeeper ;znode data == null
hbase自身的zookeeper服务被关闭,使用外部的zookeeper服务时,需要在hdfs上存储自己的数据库信息等,也就是要获得hadoop集群的namenode的地址,即集群的id,通过集群向datanode上存储数据,于是找到hadoop集群的名称,由于之前配置的hadoop HA集群,打开hadoop配置文件hdfs-site.xml文件:
发现配置了两个namenode分别为namenode1,namenode2,在zookeeper中可以看到namenode1为active状态,试试将hbase-site.xml文件中数据集群群节点,所有分布式和集群统一修改。
先关闭hbase:bin/stop-hbase.sh
修改成如下:
发现执行出错:
查看jps,发现HMaster已经关闭,但其他节点的HRegionServer依然存活,
说明habse无法通过zookeeper集群去关闭其他节点的HRegionServer,只能手动杀死HRegionServer进程。。。
修改后重启hbase:
还是报错,打开日志文件,logs下的启动日志可以看到。总是提示ClustId read in Zookeeper in null. hbase无法读取zookeeper中的clustid节点,也就是datanode节点,于是查看datanode节点是否正常,发现,hadoop集群中有两个namenode节点的datanode节点没有启动,分析可能是由于之前按网上教程提示格式化过namenode,导致版本不匹配,于是停掉所有服务,删除所有节点hadoopHA/tmp/dfs 内容,重新格式化namenode
注意在HA模式下格式化namenode有所不同,
格式化步骤:
1.各节点分别启动Journalnode
sbin/hadoop-daemon.sh start journalnode
2.启动zookeeper
bin/zkServer.sh start
3.格式化namenode
第一台:bin/hdfs namenode -format
启动namenode, sbin/hadoop-daemon.sh start namenode
第二台:bin/hdfs namenode -bootstrapStandby
4.启动namenode
sbin/hadoop-daemon.sh start namenode
5.查看HDFS页面 两个namenode都是standby状态
http://192.168.0.128:50070/
切换第一台为active状态:bin/hdfs haadmin -transitionToActive namenode1
可添加强制转换:bin/hdfs haadmin -transitionToActive -forcemanual namenode1
至此,格式化完毕,namenode也已启动成功,于是停掉服务:sbin/stop-all.sh
重新启动hadoop:
启动顺序:
1.启动zookeeper: bin/zkServer.sh start
2.启动zkfc: sbin/hadoop-daemon.sh start zkfc
3.启动hdfs: sbin/start-dfs.sh
4.启动yarn: sbin/start-yarn.sh
5.切换namenode 为active: bin/hdfs haadmin -transitionToActive -forcemanual namenode1
1.在namenode状态为active的节点上启动hbase:
bin/start-hbase.sh
2.启用备用HMaster节点:
bin/hbase-daemon.sh start master
3.进入hbase shell:
bin/hbase shell
打开启动日志提示报错:
java.net.UnknownHostException: unknown host: HAcluster
at org.apache.hadoop.hbase.ipc.HBaseClient$Connection.
at org.apache.hadoop.hbase.ipc.HBaseClient.createConnection(HBaseClient.java:281)
at org.apache.hadoop.hbase.ipc.HBaseClient.getConnection(HBaseClient.java:1137)
at org.apache.hadoop.hbase.ipc.HBaseClient.call(HBaseClient.java:1000)
这个错应该是hbase的hadoop版本与hadoop集群的hadoop版本不匹配造成的,于是,替换hbase的hadoop版本为hadoop 集群版本:
1)、cp /opt/hadoopHA/share/hadoop/common/hadoop-common-2.7.4.jar /opt/hbase-1.3.1/lib/
2)、scp /opt/hadoopHA/share/hadoop/common/hadoop-common-2.7.4.jar slave1:/opt/hbase-1.3.1/lib/
3)、scp /opt/hadoopHA/share/hadoop/common/hadoop-common-2.7.4.jar slave1:/opt/hbase-1.3.1/lib/
同时还要将hdfs-site.xml和core-site.xml文件拷贝到/opt/hbase-1.3.1/conf/下,或者建立一个到这个文件的软连接。
重启hbase、进入hbase shell,输入list:没有报错,问题解决。结果如下:
总结:
1、HA 模式下,hbase 的配置文件hbase-site.xml 中的 hbase.rootdir 值要与hadoop 配置文件core-site.xml 的dfs.Deafult 配置一样,我的配置是:
故hbase-site.xml应配置为:
2.由于HA模式下 namenode节点状态由zookeeper指定,故hbase应给出个端口6000即可
3.hbase.zookeeper.quorum 访问端口默认为locallhost,在分布式环境下需要设成统一的端口:
4.hbase 自带的hadoop版本需要与集群的hadoop版本一致,将hadoop的版本替换掉hbase的版本:
5、尽量多从日志以及zookeeper及hbase还有Hadoop的关系,架构上去分析问题。