Docker中的HBase 1.2.1独立无法连接

我想连接到Docker中独立运行的HBase,使用Java和HBase API

我使用这个代码来连接:

Configuration config = HBaseConfiguration.create(); config.set("hbase.zookeeper.quorum", "163.172.142.199"); config.set("hbase.zookeeper.property.clientPort","2181"); HBaseAdmin.checkHBaseAvailable(config); 

这是我的/ etc / hosts文件

 127.0.0.1 localhost XXX.XXX.XXX.XXX hbase-srv 

这里是我的docker(名为hbase-srv)的/ etc / hosts文件,

 XXX.XXX.XXX.XXX hbase-srv 

有了这个configuration,我得到一个连接拒绝错误:

  INFO | Initiating client connection, connectString=163.172.142.199:2181 sessionTimeout=90000 watcher=hconnection-0x6aba2b860x0, quorum=163.172.142.199:2181, baseZNode=/hbase INFO | Opening socket connection to server 163.172.142.199/163.172.142.199:2181. Will not attempt to authenticate using SASL (unknown error) INFO | Socket connection established to 163.172.142.199/163.172.142.199:2181, initiating session INFO | Session establishment complete on server 163.172.142.199/163.172.142.199:2181, sessionid = 0x15602f8d8dc0002, negotiated timeout = 40000 INFO | Closing zookeeper sessionid=0x15602f8d8dc0002 INFO | Session: 0x15602f8d8dc0002 closed INFO | EventThread shut down org.apache.hadoop.hbase.MasterNotRunningException: com.google.protobuf.ServiceException: java.net.ConnectException: Connection refused at org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation$StubMaker.makeStub(ConnectionManager.java:1560) at org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation$MasterServiceStubMaker.makeStub(ConnectionManager.java:1580) at org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation.getKeepAliveMasterService(ConnectionManager.java:1737) at org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation.isMasterRunning(ConnectionManager.java:948) at org.apache.hadoop.hbase.client.HBaseAdmin.checkHBaseAvailable(HBaseAdmin.java:3159) at hbase.Benchmark.main(Benchmark.java:26) 

但是,如果我从两个/etc/hosts文件中删除行XXX.XXX.XXX.XXX hbase-srv我得到错误unknown host : hbase-srv

我也检查过,我可以成功地telnet到我的客户端端口上的hbase docker。

在docker上,HBase使用的所有端口都打开并绑定到相同的号码(60000上的60000,2181上的2181等)。

我也想补充一点,当我在localhost上使用这个configuration的时候一切正常。

如果你不能给我一个问题的答案,你能不能给我一个程序来部署docker上的独立hbase。

更新:这是我的Docker文件

 FROM java:openjdk-8 ADD hbase-1.2.1 /hbase-1.2.1 WORKDIR /hbase-1.2.1 # ZooKeeper EXPOSE 2181 # HMaster EXPOSE 60000 # HMaster Web EXPOSE 60010 # RegionServer EXPOSE 60020 # RegionServer Web EXPOSE 60030 EXPOSE 16010 RUN chmod 755 /hbase-1.2.1/bin/start-hbase.sh CMD ["/hbase-1.2.1/bin/start-hbase.sh"] 

我的HBaseshell正在工作,我也尝试打开端口使用iptables的tcp和udp但仍然是同样的问题

Dockerfile有两个问题:

  1. 使用hbase master start而不是start-hbase.sh
  2. regionserver实际上不在60020上运行

第二个问题不容易解决。 如果运行hbase独立版本> = 1.2.0(不知道,我正在运行1.2.0),hbase将使用临时端口,而不是默认的端口或您在hbase-site.xml提供的端口,这使得它很难在Docker中使用原始版本提供hbase服务。

我添加一个名为hbase.localcluster.port.ephemeral的属性,并设法在docker中构build一个独立的hbase,您可以在这里参考。