Docker 中的 HBase 1.2.1 独立版无法连接
HBase 1.2.1 standalone in Docker unable to connect
我想在 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 中的 /etc/hosts 文件(名为 hbase-srv)
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等)。
我还想补充一点,当我在本地主机上使用此配置时一切正常。
如果你不能给我一个问题的答案,你能至少给我一个在 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 打开端口,但仍然是同样的问题
您的 Dockerfile 有两个问题:
- 使用
hbase master start
代替start-hbase.sh
- regionserver 实际上不是 运行ning on 60020
第二个问题不太好解决。如果 运行 hbase 独立版本 >= 1.2.0(不确定,我是 运行ning 1.2.0),hbase 将使用临时端口而不是默认端口或您在 hbase-site.xml
这使得在 docker 中使用原始版本很难提供 hbase 服务。
我添加了一个名为 hbase.localcluster.port.ephemeral
的 属性 并设法在 docker 中构建了一个独立的 hbase,您可以参考 here。
我想在 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 中的 /etc/hosts 文件(名为 hbase-srv)
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等)。
我还想补充一点,当我在本地主机上使用此配置时一切正常。
如果你不能给我一个问题的答案,你能至少给我一个在 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 打开端口,但仍然是同样的问题
您的 Dockerfile 有两个问题:
- 使用
hbase master start
代替start-hbase.sh
- regionserver 实际上不是 运行ning on 60020
第二个问题不太好解决。如果 运行 hbase 独立版本 >= 1.2.0(不确定,我是 运行ning 1.2.0),hbase 将使用临时端口而不是默认端口或您在 hbase-site.xml
这使得在 docker 中使用原始版本很难提供 hbase 服务。
我添加了一个名为 hbase.localcluster.port.ephemeral
的 属性 并设法在 docker 中构建了一个独立的 hbase,您可以参考 here。