简体   繁体   English

连接到Docker中运行的HBase

[英]Connect to HBase running in Docker

I cannot connect to HBase running in Docker on Windows ( banno/hbase-standalone image). 我无法连接到Windows上的Docker中运行的HBase( banno / hbase-standalone映像)。 However, I can connect to locally installed HBase. 但是,我可以连接到本地安装的HBase。

banno/hbase-standalone image is run using: banno / hbase-standalone图像使用以下命令运行:

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

I also set up the port forwarding on the boot2docker-vm (which is required when running on Windows): 我还在boot2docker-vm上设置了端口转发(在Windows上运行时需要): 在此输入图像描述

I can successfully telnet to all those ports on my localhost. 我可以成功telnet到我的localhost上的所有端口。

Next, here is a code sample that we use in our tests: 接下来,这是我们在测试中使用的代码示例:

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);

Which causes the following 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

This is explainable. 这是可以解释的。 We run Windows, which requires boot2docker-vm virtual machine running using NAT. 我们运行Windows,这需要使用NAT运行boot2docker-vm虚拟机。 The Docker container of the image is running inside the boot2docker-vm also using NAT. 图像的Docker容器也在boot2docker-vm内运行,也使用NAT。 However, the ports are "visible" to the host machine running tests, since Docker container exports the ports, and the boot2docker-vm forwards the ports the host machine. 但是,端口对于运行测试的主机是“可见的”,因为Docker容器导出端口,而boot2docker-vm将端口转发给主机。 The name a3e6c240af20 actually comes from the Docker container ID, so probably a3e6c240af20 is a hostname for the Docker container : 名称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

I am not sure how exactly HBase communication works, but apparently it makes RPC calls to the instance. 我不确定HBase通信是如何工作的,但显然它会对实例进行RPC调用。 HBase Docker returns its hostname hoping that the client will call it there. HBase Docker返回其主机名,希望客户端在那里调用它。 But since both boot2docker-vm and Docker container running using NAT, the host machine does not see the Docker container. 但由于boot2docker-vm和Docker容器都使用NAT运行,因此主机无法看到Docker容器。

I tried to add a3e6c240af20 to my hosts file: 我尝试将a3e6c240af20添加到我的hosts文件中:

127.0.0.1 a3e6c240af20

Then I get a different error, also during the RPC call, which actually does not help me much: 然后我在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

Does anyone have a suggestion how this can be solved? 有人建议如何解决这个问题吗?

Try add [boot2docker IP] a3e6c240af20 instead of 127.0.0.1 because HBase Java client needs to reach your docker's host not exactly localhost to reach zookeeper (CMIIW). 尝试添加[boot2docker IP] a3e6c240af20而不是127.0.0.1因为HBase Java客户端需要到达您docker's host docker docker's host而不是到达localhost才能到达zookeeper(CMIIW)。 Not pretty sure if it will works but it works in my Windows. 不确定它是否可行,但它可以在我的Windows中运行。

I used oddpoet/hbase-cdh5 docker image to avoid this issue. 我使用oddpoet / hbase-cdh5 docker镜像来避免这个问题。

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 fig.yml

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

my configuration file 我的配置文件

    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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM