无法在Docker实例中连接到HBase

时间:2016-06-06 13:55:25

标签: scala docker hbase playframework-2.2

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

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

MasterNotRunningException |com.google.protobuf.ServiceException: java.net.UnknownHostException: unknown host: 238b057263fb

这是抛出异常的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")

这是Hbase-Site.xml

<configuration>
<property>
    <name>hbase.tmp.dir</name>
    <value>file:///opt/hbasedata</value>
</property>

编辑:我的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

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

2 个答案:

答案 0 :(得分:4)

看起来您的Dockerized群集正在通过Docker网络中的主机名跟踪主服务器。

您需要:

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

答案 1 :(得分:0)

如果要从容器外部访问容器端口,则需要在运行-p <host port>:<guest port>时使用docker run ~发布这些端口