无法连接到 Docker 实例中的 HBase

One*_*der 3 hbase scala docker playframework-2.2

我创建了一个在 Docker 容器上运行的 HBase 实例。我已经能够使用 docker 容器的 bash shell 从 HBase Shell 创建一个表,并且还能够从 HBase Rest API 访问它。

但是我无法使用 Scala 从 Play 框架访问它,我不断收到以下异常。

MasterNotRunningException |com.google.protobuf.ServiceException: java.net.UnknownHostException: unknown host: 238b057263fb
Run Code Online (Sandbox Code Playgroud)

这是抛出异常的 Scala 代码。

val config = HBaseConfiguration.create()
var hbaseRunning = false;

config.clear
config.set("hbase.zookeeper.quorum", "172.18.0.2");  // This ip Address was retrieved by doing a docker inspect on the docker container
config.set("hbase.zookeeper.property.clientPort","2181")
config.set("hbase.master", "172.18.0.2:60000");
config.setInt("timeout", 25000);

try{
  println(" Check if HBase is Running")
  HBaseAdmin.checkHBaseAvailable(config);   // This line throws the exception
  println(" HBase is Running")              // Because this line doesnt print.
  hbaseRunning = true
}catch{
  case ex: MasterNotRunningException => {
    println(" MasterNotRunningException |" + ex.getMessage)  // This is the exception I get
  }
}
finally println(" HBase is NOT Running")
Run Code Online (Sandbox Code Playgroud)

这是 Hbase-Site.xml

<configuration>
<property>
    <name>hbase.tmp.dir</name>
    <value>file:///opt/hbasedata</value>
</property>
Run Code Online (Sandbox Code Playgroud)

编辑:我的 Docker 文件是更大的 docker compose 的一部分,我正在发布 docker 端口。我在 docker-compose 中的 ports 部分如下

    ports:
  - 2181:12181
  - 60000:60000
  - 60010:60010
  - 60020:60020
  - 60030:60030
  - 2471:2471   // this is for the rest API
Run Code Online (Sandbox Code Playgroud)

我能够访问 HBase 并操作来自 Shell 和 Rest API 的数据,只有使用 Java API 从 Play Framework 进行访问会失败。我哪里出错了?

kli*_*iew 5

看起来您的 Dockerized 集群正在通过 Docker 网络内的主机名来跟踪主节点。

您需要:

  1. 在该网络内的容器中运行您的 Play 应用程序(以便它可以解析主主机名)

或者

  1. 使用(或等效的撰写标记)启动容器-h <hostname>,并确保您的 Play 服务器将该主机名映射到正确的 IP(通过/etc/hosts或 DNS)。该-h选项将使您的集群报告主设备的内部(向 Docker 网络)fqdn,并且 Play 端的映射会将您的 Play 应用程序从内部 fqdn 指向真实地址。