【问题标题】:HBase 1.2.1 standalone in Docker unable to connectDocker 中的 HBase 1.2.1 独立无法连接
【发布时间】:2016-07-21 15:32:25
【问题描述】:

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

我使用此代码连接:

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

使用此配置,我收到连接被拒绝错误:

 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 上使用此配置时一切都很好。

如果你不能回答我的问题,你能不能至少给我一个在 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"]

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

【问题讨论】:

  • 你暴露了所有必要的端口吗?也许github.com/dajobe/hbase-docker/blob/master/Dockerfile这个帖子可以给你一些提示。
  • 我用了docker -p 60000:60000等命令,不知道是不是和EXPOSE一样的,明天上班试试,给你结果,谢谢!跨度>
  • 我已经尝试过暴露,但它不起作用,如果你能在其中看到任何有价值的信息,我将我的 dockerfile 放在问题中

标签: java docker connection hbase


【解决方案1】:

你的 Dockerfile 有两个问题:

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

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

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

【讨论】:

  • 它有效!太感谢了 !谢谢你的时间。现在我的 hbase 部署在我的 docker 上,我可以请求它了
  • @sel-fish 你刚刚救了我的命。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-31
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
相关资源
最近更新 更多