Не могу общаться с HBase из разных пространств имен kubernetes: java.net.UnknownHostException: hregion-0.hregion - PullRequest
0 голосов
/ 18 июня 2019

Я использую kubernetes, где у меня есть кластер Hadoop, работающий в пространстве имен «платформа». У меня есть пример приложения, работающего в пространстве имен «пример» Пример приложения должен общаться с HBase. Когда это происходит, мы видим следующую ошибку:

java.net.UnknownHostException: hregion-0.hregion
at java.net.InetAddress.getAllByName0(InetAddress.java:1280)
at java.net.InetAddress.getAllByName(InetAddress.java:1192)
at java.net.InetAddress.getAllByName(InetAddress.java:1126)
at java.net.InetAddress.getByName(InetAddress.java:1076)
at org.apache.hadoop.hbase.client.ConnectionUtils.getStubKey(ConnectionUtils.java:233)
at org.apache.hadoop.hbase.client.ConnectionImplementation.getClient(ConnectionImplementation.java:1192)
at org.apache.hadoop.hbase.client.ClientServiceCallable.setStubByServiceName(ClientServiceCallable.java:44)
at org.apache.hadoop.hbase.client.RegionServerCallable.prepare(RegionServerCallable.java:229)
at org.apache.hadoop.hbase.client.RpcRetryingCallerImpl.callWithRetries(RpcRetryingCallerImpl.java:105)
at org.apache.hadoop.hbase.client.HTable.get(HTable.java:386)
at org.apache.hadoop.hbase.client.HTable.get(HTable.java:360)
at org.apache.hadoop.hbase.MetaTableAccessor.getTableState(MetaTableAccessor.java:1078)
at org.apache.hadoop.hbase.MetaTableAccessor.tableExists(MetaTableAccessor.java:403)
at org.apache.hadoop.hbase.client.HBaseAdmin$6.rpcCall(HBaseAdmin.java:445)
at org.apache.hadoop.hbase.client.HBaseAdmin$6.rpcCall(HBaseAdmin.java:442)
at org.apache.hadoop.hbase.client.RpcRetryingCallable.call(RpcRetryingCallable.java:58)
at org.apache.hadoop.hbase.client.RpcRetryingCallerImpl.callWithRetries(RpcRetryingCallerImpl.java:107)
at org.apache.hadoop.hbase.client.HBaseAdmin.executeCallable(HBaseAdmin.java:3084)
at org.apache.hadoop.hbase.client.HBaseAdmin.executeCallable(HBaseAdmin.java:3076)
at org.apache.hadoop.hbase.client.HBaseAdmin.tableExists(HBaseAdmin.java:442)

Команда

> nslookup hregion-0.hregion
Сбой

на клиентском компьютере, поскольку служба hregion находится в пространстве имен platform (где эта команда будет выполнена успешно).

Мы подозревали, что сервер региона HBase зарегистрировался в zookeeper, используя неполное имя, и проверил, подключившись к серверу zookeeper:

[zk: localhost:2181(CONNECTED) 8] ls /hbase/rs
[hregion-0.hregion,16020,1560851357442]

В методе ConnectionUtils.getStubKey просто используется java.net.InetAddress.getByName(hostname), и именно этот метод дает сбой.

Вот некоторая информация об отладке zookeeper (это от мастера HBase):

hbase(main):001:0> zk_dump
HBase is rooted at /hbase
Active master address: hmaster-0.hmaster.platform.svc.cluster.local,16000,1560851357485
Backup master addresses:
Region server holding hbase:meta: hregion-0.hregion,16020,1560851357442
Region servers:
 hregion-0.hregion,16020,1560851357442

На сервере hregion-0 в /etc/hosts есть следующие записи:

# Kubernetes-managed hosts file.
127.0.0.1       localhost
10.1.14.53      hregion-0.hregion.platform.svc.cluster.local    hregion-0

И файл /etc/resolv.conf выглядит так:

nameserver 10.96.0.10
search platform.svc.cluster.local svc.cluster.local cluster.local mycompany.com
options ndots:5

Как мне это исправить? Я предполагаю, что мне нужно указать HBase зарегистрировать его узлы в zookeeper, используя их полностью определенное доменное имя - как?

...