连接到在Docker中运行的HBase

我无法连接到在Windows上运行Docker的HBase( banno / hbase-standalone image)。 不过,我可以连接到本地安装的HBase。

banno / hbase-standalone映像运行使用:

docker run -d -p 2181:2181 -p 60000:60000 -p 60010:60010 -p 60020:60020 -p 60030:60030 banno/hbase-standalone 

我还在boot2docker-vm上设置了端口转发(在Windows上运行时需要): 在这里输入图像说明

我可以成功地telnet到我的本地主机上的所有端口。

接下来,这里是我们在testing中使用的一个代码示例:

 Configuration config = HBaseConfiguration.create(); config.clear(); config.setInt("timeout", 12000); config.set("zookeeper.znode.parent", "/hbase"); config.set("hbase.zookeeper.quorum", "127.0.0.1"); config.set("hbase.zookeeper.property.clientPort", "2181"); config.set("hbase.master", "127.0.0.1:60000"); final Configuration configuration = HBaseConfiguration.create(config); JobDefinition.Buildable.dumpProperties(configuration, newArrayList("hbase.*")); HBaseAdmin.checkHBaseAvailable(config); 

这导致以下exception

 Exception in thread "main" org.apache.hadoop.hbase.MasterNotRunningException: com.google.protobuf.ServiceException: java.net.UnknownHostException: unknown host: a3e6c240af20 at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation$StubMaker.makeStub(HConnectionManager.java:1651) at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation$MasterServiceStubMaker.makeStub(HConnectionManager.java:1677) at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getKeepAliveMasterService(HConnectionManager.java:1885) at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.isMasterRunning(HConnectionManager.java:900) at org.apache.hadoop.hbase.client.HBaseAdmin.checkHBaseAvailable(HBaseAdmin.java:2366) at com.xxx.compute.hadoop.jobs.transaction.OurTest.main(OurTest.java:24) Caused by: com.google.protobuf.ServiceException: java.net.UnknownHostException: unknown host: a3e6c240af20 at org.apache.hadoop.hbase.ipc.RpcClient.callBlockingMethod(RpcClient.java:1674) at org.apache.hadoop.hbase.ipc.RpcClient$BlockingRpcChannelImplementation.callBlockingMethod(RpcClient.java:1715) at org.apache.hadoop.hbase.protobuf.generated.MasterProtos$MasterService$BlockingStub.isMasterRunning(MasterProtos.java:42561) at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation$MasterServiceStubMaker.isMasterRunning(HConnectionManager.java:1688) at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation$StubMaker.makeStubNoRetries(HConnectionManager.java:1597) at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation$StubMaker.makeStub(HConnectionManager.java:1623) ... 5 more Caused by: java.net.UnknownHostException: unknown host: a3e6c240af20 at org.apache.hadoop.hbase.ipc.RpcClient$Connection.<init>(RpcClient.java:386) at org.apache.hadoop.hbase.ipc.RpcClient.createConnection(RpcClient.java:352) at org.apache.hadoop.hbase.ipc.RpcClient.getConnection(RpcClient.java:1526) at org.apache.hadoop.hbase.ipc.RpcClient.call(RpcClient.java:1438) at org.apache.hadoop.hbase.ipc.RpcClient.callBlockingMethod(RpcClient.java:1657) ... 10 more 

这是可以解释的。 我们运行Windows,这需要使用NAT运行的boot2docker-vm虚拟机。 图像的Docker容器也在使用NAT的boot2docker-vm运行。 但是,由于Docker容器导出端口,所以端口对主机运行testing是“可见的”,而boot2docker-vm转发主机端口。 名称a3e6c240af20实际上来自Docker容器ID,因此a3e6c240af20可能是Docker容器的主机名:

 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a3e6c240af20 banno/hbase-standalone:latest "/bin/sh -c '/opt/hb 24 minutes ago Up 24 minutes 0.0.0.0:2181->2181/tcp, 0.0.0.0:60000->60000/tcp, 0.0.0.0:60010->60010/tcp, 0.0.0.0:60020->60020/tcp, 0.0.0.0:60030->60030/tcp agitated_wozniak 

我不确定HBase通信是如何工作的,但显然它会对实例进行RPC调用。 HBase Docker返回它的主机名,希望客户端在那里调用它。 但是,既然boot2docker-vm和Docker容器都使用NAT运行,主机不会看到Docker容器。

我试图添加a3e6c240af20到我的主机文件:

 127.0.0.1 a3e6c240af20 

然后在RPC调用期间,我得到了一个不同的错误,这实际上对我没有多大的帮助:

 Exception in thread "main" org.apache.hadoop.hbase.MasterNotRunningException: com.google.protobuf.ServiceException: java.lang.NullPointerException at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation$StubMaker.makeStub(HConnectionManager.java:1651) at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation$MasterServiceStubMaker.makeStub(HConnectionManager.java:1677) at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getKeepAliveMasterService(HConnectionManager.java:1885) at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.isMasterRunning(HConnectionManager.java:900) at org.apache.hadoop.hbase.client.HBaseAdmin.checkHBaseAvailable(HBaseAdmin.java:2366) at com.xxx.compute.hadoop.jobs.transaction.OurTest.main(OurTest.java:24) Caused by: com.google.protobuf.ServiceException: java.lang.NullPointerException at org.apache.hadoop.hbase.ipc.RpcClient.callBlockingMethod(RpcClient.java:1674) at org.apache.hadoop.hbase.ipc.RpcClient$BlockingRpcChannelImplementation.callBlockingMethod(RpcClient.java:1715) at org.apache.hadoop.hbase.protobuf.generated.MasterProtos$MasterService$BlockingStub.isMasterRunning(MasterProtos.java:42561) at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation$MasterServiceStubMaker.isMasterRunning(HConnectionManager.java:1688) at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation$StubMaker.makeStubNoRetries(HConnectionManager.java:1597) at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation$StubMaker.makeStub(HConnectionManager.java:1623) ... 5 more Caused by: java.lang.NullPointerException at org.apache.hadoop.hbase.ipc.RpcClient$Connection.writeRequest(RpcClient.java:1051) at org.apache.hadoop.hbase.ipc.RpcClient.call(RpcClient.java:1440) at org.apache.hadoop.hbase.ipc.RpcClient.callBlockingMethod(RpcClient.java:1657) ... 10 more 

有没有人有一个build议如何解决这个问题?

尝试添加[boot2docker IP] a3e6c240af20而不是127.0.0.1因为HBase Java客户端需要到达您docker's host docker docker's host而不是完全localhost才能到达zookeeper(CMIIW)。 不是很确定,如果它能工作,但它在我的Windows中工作。

我使用oddpoet / hbase-cdh5泊坞窗图像来避免这个问题。

 docker run -d -p 2181:2181 -p 60000:60000 -p 60010:60010 -p 60020:60020 -p 60030:60030 -h hbase oddpoet/hbase-cdh5 

fig.yml

 hbase: image: oddpoet/hbase-cdh5 hostname: hbase ports: - "3181:2181" - "60000:60000" - "60010:60010" - "60020:60020" - "60030:60030" 

我的配置文件

  conf.set("hbase.zookeeper.quorum", zkPath); conf.set("hbase.zookeeper.property.clientPort","2181"); conf.set("zookeeper.znode.parent", "/hbase"); conf.set("hbase.client.retries.number", "3"); // default 35 conf.set("hbase.rpc.timeout", "10000"); // default 60 secs conf.set("hbase.rpc.shortoperation.timeout", "5000"); // default 10 secs