【问题标题】:Connect to HBase running in Docker连接到在 Docker 中运行的 HBase
【发布时间】:2014-10-23 05:15:03
【问题描述】:

我无法连接到在 Windows 上运行在 Docker 中的 HBase(banno/hbase-standalone 图像)。但是,我可以连接到本地安装的 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 上运行时需要):

我可以成功地远程登录到我本地主机上的所有这些端口。

接下来,这是我们在测试中使用的代码示例:

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 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 容器在 boot2docker-vm 内运行,也使用 NAT。但是,这些端口对运行测试的主机是“可见的”,因为 Docker 容器会导出这些端口,而 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

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

【问题讨论】:

  • 也许 HBase 会为 RPC 请求打开随机端口,但 docker 容器不会公开它们。我现在也遇到了同样的问题。

标签: java windows hbase docker nat


【解决方案1】:

尝试添加[boot2docker IP] a3e6c240af20 而不是127.0.0.1,因为HBase Java 客户端需要访问您的docker's host 而不是localhost 才能访问zookeeper (CMIIW)。不太确定它是否可以工作,但它可以在我的 Windows 中工作。

【讨论】:

    【解决方案2】:

    我使用了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

    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
    

    【讨论】:

    • zkPath 变量的值是多少?
    • @Jorge Zookeeper 服务器 URI
    猜你喜欢
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 2017-08-21
    • 2021-02-15
    • 2017-03-16
    • 2020-07-31
    相关资源
    最近更新 更多