问题现象

最近接了一个需求,要在本地(win)环境运行位于虚拟机中搭建的伪分布 HBase 服务(linux)

在 win 环境中,浏览器 打开 HBase 的 16010 web页面是没有问题的,这说明网络连通正常

我在本地Java代码中使用了以下方式去连接 HBase 服务,

static {
        try {
            if (conf == null) {
                conf = HBaseConfiguration.create();
                conf.set("hbase.zookeeper.quorum", "192.168.137.90"); // hbase 服务地址
                conf.set("hbase.zookeeper.property.clientPort", "2181"); // 端口号
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
}

问题来了:

程序启动后,卡在HBase这里不动了,不报错,不报异常,没有任何输出,

参考网上的教程,说是要将 linux 的 hostname 配置到本机的 hosts 文件中,我也试过了,并不起作用。

运行环境

在分析这个问题之前,我先简要介绍一下我的运行环境

宿主机:

        系统:windown 10

        IP:192.168.137.80

        用于启动编程环境

HBase 服务端:

        VMware 虚拟机中安装 docker,在docker中启动 HBase 容器 

        虚拟机:

                系统:ubuntu 20.04 LTS

                IP:192.168.137.90

                hostname:ubuntu

        docker 容器;

                HBase镜像:harisekhon/hbase

                容器内 hostname :47werx09g7s

                端口转发:2181,16010,16030

问题分析

HBase 的启动时,

会将其本身所在的环境中的hostname绑定到服务端口上。

例如,

        虚拟机中直接安装,那么服务端口绑定到 ubuntu 上

        使用docker镜像安装,那么服务端口绑定到 47werx09g7s 上

本地程序需要通过正确的 hostname 进行访问

因此 网络通不代表配置通,要配置 hosts 才算完全通

解决办法

一定,一定,一定 确定 HBase 实际运行的linux环境,并且获取该环境的 hostname

将该 hostname 添加到系统 hosts 文件中

尤其是,对于docker中的 HBase 服务,则是容器内的 hostname,而非外层虚拟机系统的。

例如:

        我本机的 hosts 文件配置如下:

        192.168.137.90 47werx09g7s

总结

        自己被这个问题困扰了两天,学艺不精,反受其累,实在不应该啊。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐