Мой клиент использует org.apache.hbase:hbase-client:2.1.0"
, а сервер работает 1.2.0-cdh5.11.1
(1.2.0-cdh5.11.0
в альтернативном тестовом кластере).
Мой клиент очень прост, он запускает класс Connection
при запуске(этот класс - в соответствии с рекомендациями Apache - является общим для потоков, поскольку он тяжелый и потокобезопасный).Затем для каждого запроса он создает класс Table
и выполняет операцию .exists(new Get(rowKey))
.
Вот так:
Connection conn = ConnectionFactory.createConnection(hbaseConfig);
и
final Table table = conn.getTable(tableName);
return table.exists(new Get(context.getKey()));
Большинствовремя задержки запроса к HBase и обратно составляет в худшем случае 40 мс.Обычно оно завершается примерно за 10 мс.
Тем не менее, мы замечаем, что случайные запросы занимают около 5000 мс (5 с) - но все же успешно завершаются!
И иногда я имею в видуоколо 1 запроса в минуту (из 600 за минуту всего, так что небольшой тариф).Но это устойчиво.
Это почти точно около 5 с (+/- 100-200 мс).Это странная часть.Это не всплеск.
Сначала я подозревал, что это неверная конфигурация клиента, и мне нужно было установить более строгие таймауты, поэтому я установил следующее:
hbaseConfig.set(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 1);
hbaseConfig.set(HConstants.HBASE_CLIENT_PAUSE, "50");
hbaseConfig.set(HConstants.HBASE_CLIENT_OPERATION_TIMEOUT, "2000");
hbaseConfig.set(HConstants.HBASE_RPC_TIMEOUT_KEY, "1500");
hbaseConfig.set(HConstants.HBASE_RPC_SHORTOPERATION_TIMEOUT_KEY, "2000");
hbaseConfig.set(HConstants.HBASE_CLIENT_SCANNER_TIMEOUT_PERIOD, "1500");
hbaseConfig.set(HConstants.ZOOKEEPER_RECOVERABLE_WAITTIME, "2000");
hbaseConfig.set(HConstants.ZK_SESSION_TIMEOUT, "2000");
hbaseConfig.set("zookeeper.recovery.retry", "1");
hbaseConfig.set("zookeeper.recovery.retry.intervalmill","200");
hbaseConfig.set("hbase.ipc.client.socket.timeout.connect", "2000");
hbaseConfig.set("hbase.ipc.client.socket.timeout.read", "2000");
hbaseConfig.set("hbase.ipc.client.socket.timeout.write", "2000");
Другими словами, 5000 мсчерез глобальный тайм-аут (как установлено в HConstants.HBASE_CLIENT_OPERATION_TIMEOUT
).
Тем не менее у меня есть запросы, для выполнения которых требуется ~ 5 с - и это происходит успешно.
В дополнение к этим тайм-аутам я изменил сиспользуя AsyncConnection
до Connection
(в любом случае он не должен был быть асинхронным), и я думаю о том, чтобы просто делать GET
вызовы вместо exists
.
Но на данный момент я в тупике.Я не вижу никакой собственности, и откуда 5-е место.Это даже не тайм-аут, это действительно успешно!
Кто-нибудь сталкивался с этим раньше?Есть ли способ заставить hbase-клиента генерировать метрики?Метрики на стороне сервера не показывают увеличения задержки (метрики сканирования).