HBase Thrift: как подключиться к удаленному мастеру/кластеру HBase?

Благодаря дистрибутиву Cloudera у меня есть мастер-узел HBase + сервер Thrift, работающий на локальном компьютере, и я могу кодировать и тестировать клиентские программы HBase и использовать их без проблем.

Однако теперь мне нужно использовать Thrift в производственной среде, и я не могу найти документацию о том, как запустить Thrift с производственным кластером HBase.

Насколько я понимаю, мне нужно будет запустить программу hbase-thrift на клиентском узле, поскольку программа Thrift является просто еще одним промежуточным клиентом для HBase.

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

Кроме того, какие-либо предложения о том, как масштабировать это в производстве? Мне нужна только такая установка:

Client <-> Thrift client <-> HBase Master <-> Multiple HBase workers

person Suman    schedule 06.06.2012    source источник


Ответы (1)


Запустите его

Вам не нужно запускать Thrift-сервер на своем локальном компьютере, он может работать где угодно, но обычно лучше использовать RegionServers*. Затем в коде вы подключаетесь к этому серверу.

Пример Python:

transport = TSocket.TSocket("random-regionserver", 9090)

Где вы, очевидно, замените random-regionserver одним из серверов, на которых вы используете сервер Thrift.

Этот сервер получает свою конфигурацию из обычных мест. Если вы используете CDH, вы найдете конфигурацию в /etc/hbase/conf/hbase-site.xml, и вам нужно будет добавить свойство hbase.zookeeper.quorum:

<property>
  <name>hbase.zookeeper.quorum</name>
  <value>list of your zookeeper servers</value>
</property>

Когда вы запускаете Thrift-сервер из загруженного дистрибутива Apache, все происходит аналогично, за исключением того, что hbase-site.xml, вероятно, будет находиться в другом каталоге.

Масштабирование

Один из простых способов масштабирования прямо сейчас — сохранить список всех региональных серверов в вашем клиенте Thrift и выбрать один из них случайным образом при подключении. Или вы создаете несколько подключений и каждый раз используете случайное. Некоторые языковые привязки (например, PHP) имеют TSocketPool, где вы можете передать все свои серверы. В противном случае вам придется выполнить некоторую ручную работу.

При использовании этого метода все операции чтения и записи должны быть более или менее распределены между серверами Thrift в вашем кластере. Каждая операция чтения или записи, поступающая на сервер Thrift, будет по-прежнему преобразовываться в вызов API на основе Java с сервера Thrift, который затем открывает сетевое соединение с соответствующими серверами регионов для выполнения запрошенного действия.

Это означает, что вы не получите такой же высокой производительности, как при использовании Java API. Может помочь, если вы сами кешируете местоположения регионов и обращаетесь к соответствующему серверу Thrift, но даже в этом случае будет сделан дополнительный вызов Java API, даже если он окажется на локальном сервере. HBASE-4460 поможет в этом сценарии, но нет включены в CDH3u4 или CDH4.

* Существует проблема HBASE-4460, в которую фактически встроен сервер Thrift. на региональном сервере.

person Lars Francke    schedule 06.06.2012
comment
Спасибо! Я попробую это. Что касается части масштабирования: то есть, если я случайным образом подключаюсь к серверам разных регионов напрямую и распространяю свои записи на серверы разных регионов, гарантированно ли я получу согласованные результаты при чтении с них? (Мое приложение HBase требует интенсивной записи, хотя мне также часто приходится выполнять операции чтения.) - person Suman; 07.06.2012
comment
Это очень хороший вопрос. И нет, вы не получите наилучшую производительность, используя случайное назначение. Я призываю вас прочитать HBASE-4460 о некоторых проблемах. Для чтения (и записи) может помочь кэширование местоположений регионов и подключение напрямую к серверу этого региона. Тем не менее: в настоящее время, даже если вы пишете на сервер Thrift на сервере Regionserver, где в конечном итоге окажутся ваши данные, этот сервер Thrift все равно будет выполнять сетевой запрос, даже если он окажется на localhost. Боюсь, таково текущее положение дел (опять же см. HBASE-4460). - person Lars Francke; 07.06.2012
comment
Я отредактировал ответ, чтобы включить мой предыдущий комментарий. Я надеюсь, что это делает его более понятным и помогает. - person Lars Francke; 07.06.2012
comment
Просто чтобы продолжить: у меня это работает! И я могу масштабировать записи в HBase. :) Было непросто запустить кластер, экономию на региональных серверах, правила безопасности и т. д., но работа таким образом сделала свое дело! :) Спасибо! - person Suman; 08.06.2012
comment
И извините, один небольшой дополнительный вопрос: если я случайным образом распределяю записи по региональным серверам, как региональные серверы синхронизируются друг с другом — и нужно ли это вообще? Как мне делать запросы после того, как я закончу со своим случайным письмом? - person Suman; 08.06.2012
comment
@Suman, когда вы таким образом распределяете звонки по бережливости, данные всегда записываются в правильный регион, даже если они принадлежат к другому региону, чем тот, с которым общается ваш клиент по бережливости. - person Dave; 03.05.2013
comment
У нас та же проблема (много записей в HBase с использованием python и thrift2), но даже после подключения к нескольким региональным серверам непосредственно перед размещением записи занимают столько же времени, сколько и при подключении только к главному серверу. Я знаю, что это было давно, но я что-то упускаю? - person tangfucius; 14.12.2016