背景:
我在使用 scala 编写一个单元测试,要求自动化的完成写入和读取 Docker 环境下的 Hbase 。
这个是我自己编译的 https://hub.docker.com/r/geekyouth/hbase
启动参数:
docker run -d --name hbase --hostname hbase -p 2181:2181 -p 16000:16000 -p 16010:16010 -p 16020:16020 geekyouth/hbase:2.3.3
其中,连接 Hbase 的参数包含如下:
hbase.master: 127.0.0.1:16010
hbase.zookeeper.quorum: 127.0.0.1
hbase.zookeeper.property.clientPort: 2181
zookeeper.znode.parent: /hbase
必须在 hosts 文件配置如下,才能正常连接 hbase 读写:
127.0.0.1 hbase
现在的需求是,不允许修改 hosts 文件,如何实现本地开发机器上运行单元测试来读写 docker 容器中的 hbase ?
Hbase 的通信机制,其连接 Regionserver 是通过 Hostname:Port 的形式来连接的,zookeeper 返回的地址就是( Hostname:Port:startID )的格式,可以在 zk 上面找到( list /hbase/rs )。因此如果我们使用的是 Docker 容器本身 hostname,显然是无法通过客户端连接到 Hbase 的。
1
429463267 OP 求助
|
2
InDom 2021-07-07 14:10:53 +08:00
使用自己注册的域名,然后解析道对应的 IP 。
很多人以为 公共 DNS 只能解析到公网,其实解析到 127.0.0.1 之类的内网是可以的。 但是 这个 host 域得能自定义。 如果连域也不能改,那就考虑下自建 DNS ? |
3
429463267 OP javahost(JVM 虚拟 DNS)解决 hosts 程序中 hosts 配置问题_eff666 的博客-CSDN 博客_javahost
https://blog.csdn.net/eff666/article/details/52061223 刚才无意间看到这篇文章,正在尝试使用 虚拟 DNS |
4
429463267 OP @InDom 公司之所以需要使用 docker hbase,目的就是省钱,所以不可能在开发环境去注册一个域名来完成单元测试的。
|
5
429463267 OP ```scala
private[this] def updateVDNS() = { val props = new Properties props.put("hbase", "127.0.0.1") JavaHost.updateVirtualDns(props) } } ``` 实测可行 |