java 调用 docker 中的 HBase 服务 卡死 不报错 不报异常 卡着不动 但 服务ip是能ping通

时间:2025-03-23 09:43:30

问题现象

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

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

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

static {
        try {
            if (conf == null) {
                conf = ();
                ("", "192.168.137.90"); // hbase 服务地址
                ("", "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

总结

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