Существует кластер HBase, который озадачивает меня очень простым фрагментом java:
Configuration my_conf = HBaseConfiguration.create();
my_conf.set("hbase.zookeeper.quorum", "192.168.0.100,192.168.0.101,192.168.0.102");
my_conf.set("hbase.zookeeper.property.clientPort", 2181);
my_conf.set("zookeeper.znode.parent", "/my-root-node");
try
{
Connection conn = ConnectionFactory.createConnection(my_conf);
Table my_table = conn.getTable(TableName.valueOf("mytable"));
long id = my_table.incrementColumnValue(Bytes.toBytes("my.row"), Bytes.toBytes("key"), Bytes.toBytes("auto"), 1, Durability.SKIP_WAL);
}
catch(IOException ex)
{
System.out.println(ex.toString());
}
Дело в том, что этот код работает нормально, если запущен непосредственно на стороне сервера (любой компьютер в этой подсети).
При запуске с какой-либо внешней машины, например, с моего компьютера или серверов из другой подсети и т. Д., Код зависает при вызове incrementColumnValue()
.
Согласно журналам, я вижу, что HBase входит внутрь incrementColumnValue()
вызов, затем создает и запускает RegionServerCallable
экземпляр, затем ожидает его завершения и зависает до тех пор, пока не обнаружится тайм-аут (независимо от продолжительности тайм-аута, я изменил его на 12 часов с тем же эффектом) .
Исключение тайм-аута содержит следующее сообщение:
callTimeout = 1200000, callDuration = 2214143: строка 'my.row' в таблице 'mytable' со значением NULL
То, что null
в конце сообщения должно быть именем региона, однако кажется, что HBase испытывает проблемы с обнаружением региона.
У меня нет идей, почему вызов RPC может бытьподается хорошо, если инициированоиз внутренней сети и происходит сбой во внутренних суб-вызовах, если инициируется из внешнего помещения.Любая помощь приветствуется.