Support Questions
Find answers, ask questions, and share your expertise
Announcements
Alert: Welcome to the Unified Cloudera Community. Former HCC members be sure to read and learn how to activate your account here. Want to know more about what has changed? Check out the Community News blog.

HBase : Zookeeper serves Internal IP to Remote client (Java API)

HBase : Zookeeper serves Internal IP to Remote client (Java API)

New Contributor

 

I am running a very basic HBase connection program from a remote server.
Reading the server logs, I see Zookeeper acknowledge the request, but then serves to the Client the internal IP of HBase Master, which is of no use from the outside world.

I know where the master is and what its public IP is but I do not know how to effectively connect to HBase remotely using the Java API. Any Ideas ?

I've seen some people advice to mess up with the /etc/hosts file but that's an ugly and inelegant solution, and it breaks other parts of the ecosystem.

 

    String zookeeperHost = "public.ip.address";
    Configuration hconfig = HBaseConfiguration.create();
    hconfig.set("hbase.zookeeper.quorum",zookeeperHost);
    hconfig.set("hbase.zookeeper.property.clientPort", "2181");
    hconfig.set("zookeeper.znode.parent", "/hbase-unsecure");
    HBaseAdmin.available(hconfig);

org.apache.hadoop.hbase.MasterNotRunningException:
com.google.protobuf.ServiceException:
java.net.UnknownHostException: unknown host: ip-xx-xx-xx-xx.eu-west-1.compute.internal

1 REPLY 1
Highlighted

Re: HBase : Zookeeper serves Internal IP to Remote client (Java API)

Master Guru
Running over a public IP may not be a good idea if it is open to the internet. Consider using a VPC?

That said, you can point HBase Master and RegionServer to use the address from a specific interface name (eth0, eth1, etc.) and/or a specific DNS resolver (IP or name that can answer to a dns:// resolving call) via advanced config properties:

hbase.master.dns.interface
hbase.master.dns.nameserver

hbase.regionserver.dns.interface
hbase.regionserver.dns.nameserver

By default the services will use whatever is the host's default name and resolving address: getent hosts $(hostname -f) and publish this to clients.