我创建了一个在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访问失败。我哪里错了?
答案 0 :(得分:4)
看起来您的Dockerized群集正在通过Docker网络中的主机名跟踪主服务器。
您需要:
或
-h <hostname>
(或等效的撰写标记)启动容器,并确保Play服务器将该主机名映射到正确的ip(通过/etc/hosts
或DNS)。 -h
选项将使您的群集报告主内部(到Docker网络)fqdn,并且Play侧的映射会将您的Play应用程序从内部fqdn指向真实地址。答案 1 :(得分:0)
如果要从容器外部访问容器端口,则需要在运行-p <host port>:<guest port>
时使用docker run ~
发布这些端口