java - 连接到在 Docker 中运行的 HBase

标签 java windows hbase docker nat

我无法连接到在 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 上运行时需要): enter image description here

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

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

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

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

最佳答案

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

关于java - 连接到在 Docker 中运行的 HBase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25564097/

相关文章:

hadoop - HFile 创建 - 添加了一个在词法上不大于先前键的键

java - 流口水正则表达式来匹配非 Alpha

java - 如何让 EclipseLink 创建 MySQL InnoDB 表?

java - 杀死所有线程后退出 Activity android

sql-server - SQL Server Express 2012 错误 : Cannot connect to Local DB

python - pip install -U setuptools 使 windows 10 失败

apache-spark - 在 hadoop 集群中运行 Spark 作业时出现 java.lang.NoClassDefFoundError : org/apache/hadoop/hbase/HBaseConfiguration

c# - 如何将 Hive 连接到 asp.net 项目

java - 为什么 Canvas 作为 contentPane 不绘制添加到 JFrame glasspane 的不透明组件

Windows 蓝牙自动配对或禁用身份验证