hadoop HA 下 Hbase无法连接外部zookeeper问题

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:
List all tables in hbase. Optional regular expression parameter could

be used to filter the output. Examples:

  hbase> list
  hbase> list 'abc.*'
  hbase> list 'ns:abc.*'

  hbase> 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:

<name>hbase.zookeeper.quorum</name>
<value>master,slave1,slave2</value> #指定zookeeper集群节点名,因为是由zookeeper表决算法决定的
</property>
<property>
<name>zookeeper.znode.parent</name>
<value>/hbase-unsecure</value> #配置zookeeper集群数据节点
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name> #指zookeeper集群data目录
<value>/home/zookeeper-hbase</value>

</property>

查看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文件:

<property>
    <!-- 为namenode集群定义一个services name -->
    <name>dfs.nameservices</name>
    <value>HAcluster</value>
  </property>
  <property>
    <!-- nameservice 包含哪些namenode,为各个namenode起名 -->
    <name>dfs.ha.namenodes.HAcluster</name>
    <value>namenode1,namenode2</value>
  </property>

发现配置了两个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.<init>(HBaseClient.java:302)
        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的关系,架构上去分析问题。





展开阅读全文

没有更多推荐了,返回首页