Клиент Hbase не может подключиться к удаленному серверу Hbase

Я написал следующий клиентский класс hbase для удаленного сервера:

System.out.println("Hbase Demo Application ");

            // CONFIGURATION

                // ENSURE RUNNING
            try {
                HBaseConfiguration config = new HBaseConfiguration();
                config.clear();
                config.set("hbase.zookeeper.quorum", "192.168.15.20");
                config.set("hbase.zookeeper.property.clientPort","2181");
                config.set("hbase.master", "192.168.15.20:60000");
                //HBaseConfiguration config = HBaseConfiguration.create();
    //config.set("hbase.zookeeper.quorum", "localhost");  // Here we are running zookeeper locally
                HBaseAdmin.checkHBaseAvailable(config);


                System.out.println("HBase is running!");
            //  createTable(config);    
                //creating a new table
                HTable table = new HTable(config, "mytable");
                System.out.println("Table mytable obtained ");  
                addData(table);
            } catch (MasterNotRunningException e) {
                System.out.println("HBase is not running!");
                System.exit(1);
            }catch (Exception ce){ ce.printStackTrace();

он выдает какое-то исключение:

Oct 17, 2011 1:43:54 PM org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation getMaster
INFO: getMaster attempt 0 of 1 failed; no more retrying.
java.net.ConnectException: Connection refused
    at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
    at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:567)
    at org.apache.hadoop.net.SocketIOWithTimeout.connect(SocketIOWithTimeout.java:206)
    at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:404)
    at org.apache.hadoop.hbase.ipc.HBaseClient$Connection.setupIOstreams(HBaseClient.java:328)
    at org.apache.hadoop.hbase.ipc.HBaseClient.getConnection(HBaseClient.java:883)
    at org.apache.hadoop.hbase.ipc.HBaseClient.call(HBaseClient.java:750)
    at org.apache.hadoop.hbase.ipc.HBaseRPC$Invoker.invoke(HBaseRPC.java:257)
    at $Proxy4.getProtocolVersion(Unknown Source)
    at org.apache.hadoop.hbase.ipc.HBaseRPC.getProxy(HBaseRPC.java:419)
    at org.apache.hadoop.hbase.ipc.HBaseRPC.getProxy(HBaseRPC.java:393)
    at org.apache.hadoop.hbase.ipc.HBaseRPC.getProxy(HBaseRPC.java:444)
    at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getMaster(HConnectionManager.java:359)
    at org.apache.hadoop.hbase.client.HBaseAdmin.<init>(HBaseAdmin.java:89)
    at org.apache.hadoop.hbase.client.HBaseAdmin.checkHBaseAvailable(HBaseAdmin.java:1215)
    at com.ifkaar.hbase.HBaseDemo.main(HBaseDemo.java:31)
HBase is not running!

можете ли вы сказать мне, почему он выдает исключение, что не так с кодом и как это решить.


person Ali Raza    schedule 17.10.2011    source источник
comment
Пожалуйста, примите ответы на свои старые вопросы, прежде чем задавать новые вопросы. Никто не будет готов ответить на ваши вопросы, так как вы не даете никакой обратной связи.   -  person frail    schedule 17.10.2011
comment
Ok. отныне буду. Я был новым пользователем этого сайта. Обычно я голосую за ответ, который мне помогает. Спасибо.   -  person Ali Raza    schedule 17.10.2011
comment
config.set("hbase.master", "192.168.15.20:60000"); можете ли вы закомментировать эту строку и попробовать еще раз?   -  person frail    schedule 17.10.2011
comment
я попробовал еще раз, но результат тот же.   -  person Ali Raza    schedule 17.10.2011
comment
можете ли вы телнет 192.168.15.20:2181 (проблема с подключением?)   -  person frail    schedule 17.10.2011
comment
он подключается к месту назначения (серверу).   -  person Ali Raza    schedule 17.10.2011
comment
@AliRaza Я думаю, вы должны принять этот ответ, если сочтете его полезным ..   -  person khan    schedule 30.07.2012


Ответы (5)


Эта проблема возникает из-за файла hosts вашего сервера HBase.
Вам просто нужно отредактировать файл /etc/hosts вашего сервера HBase.
Удалите запись localhost из этого файла и поместите запись localhost перед IP-адресом сервера HBase.

Например, файлы /etc/hosts вашего сервера HBase выглядят так:

127.0.0.1 localhost
192.166.66.66 xyz.hbase.com hbase

Вы должны изменить его следующим образом, удалив localhost:

# 127.0.0.1 localhost # line commented out
192.166.66.66 xyz.hbase.com hbase localhost # note: localhost added here

Это связано с тем, что когда удаленная машина запрашивает машину сервера hbase, где работает HMaster, она сообщает, что она работает на локальном хосте.
Итак, если запись 127.0.0.1, то сервер HBase возвращает этот адрес, и удаленная машина начинает находить HMaster на своей машине (локально).
Когда мы изменим это с помощью IP-адреса сервера HBase, все будет работать нормально :)

person khan    schedule 19.05.2012
comment
Hbase необходимо перезапустить после изменения. 'netstat -a | Здесь полезна команда grep 6000, поскольку она показывает, что мастер привязывается к локальному интерфейсу. - person Wacław Borowiec; 28.09.2012
comment
Есть ли какой-нибудь элегантный способ сделать это? Можем ли мы указать xyz.hbase.com в каком-то файле конфигурации вместо изменения файла hosts? Спасибо. Это решение действительно работает для меня, но не так элегантно. - person DB Tsai; 26.02.2013
comment
Кто вообще понимает, что он пытается сказать. Пожалуйста, отредактируйте это сообщение, чтобы сделать его читабельным. - person seb; 18.06.2013
comment
@seb он говорит, удалите строку 127.0.0.1 и добавьте localhost к строке реального IP-адреса - person Eric Hartford; 25.07.2013
comment
Но после удаления 127.0.0.1 и добавления localhost к IP-адресу ssh не устанавливает соединение (ssh username@ip-addr и ssh username@localhost дают «соединение закрыто удаленным хостом») для перезапуска экземпляра hbase. Кто-нибудь знает, в чем может быть проблема? - person vivek_nk; 13.07.2014
comment
разве это не переименовало локальный хост в 192.166.66.66, и теперь любое другое приложение, которое пытается использовать локальный хост с этого компьютера, в конечном итоге выйдет в сеть и обратно? - person c z; 14.11.2018

Я согласен. HBase очень чувствителен к конфигурациям /etc/hosts. Мне пришлось правильно установить свойство привязки zeekeeper в hbase-site.xml, чтобы вышеупомянутый код Java работал... Например: я пришлось поставить так:

{property}
  {name}hbase.zookeeper.quorum{/name}
  {value}www.remoterg12.net{/value}      {!-- this is the externally accessible domain --}
{/property}
{property}
  {name}hbase.zookeeper.property.clientPort{/name}
  {value}2181{/value}              {!-- everything needs to be externally accessible --}
{/property}
{property}
  {name}hbase.master.info.port{/name}    {!--   http://www.remoterg12.net:60010/ --}
  {value}60010{/value}
{/property}
{property}
  {name}hbase.master.info.bindAddress{/name}
  {value}www.remoterg12.net{/value}      {!-- Use this to access the GUI console, --}
{/property}

Удаленный графический интерфейс даст вам четкое представление о доменах привязки. Например, свойство [HBase Master] в «веб-консоли графического интерфейса» должно выглядеть примерно так: www.remoterg12.net:60010 (это НЕ должно быть localhost). :60010 )... И ДА!!, мне действительно пришлось поиграться с /etc/hosts, так как я не хотел портить существующие конфигурации Apache :-)

person Shawn Brito    schedule 17.07.2012

Эту же проблему можно решить, отредактировав файл conf/regionservers в каталоге hbase, чтобы добавить в него сервер Hbase (Remote). Тогда не нужно менять файл etc/hosts

После редактирования conf/regionservers будет выглядеть так:

localhost  
ip address of the remote hbase server

eg

localhost              
10.132.258.366
person Georgy B Abraham    schedule 30.10.2012
comment
Не могли бы вы объяснить этот подход более подробно? Я не могу понять, что вы имеете в виду. - person seb; 18.06.2013
comment
это, кажется, не работает, редактируя файл /etc/host, только заставляет работать удаленных клиентов hbase - person prassee; 14.10.2013

Точно такая же проблема с HBase 1.1.3. 2 виртуальные машины (Ubuntu) в одной сети. Журналы показывают, что клиент может получить доступ к Zookeeper, но не к серверу HBase.

TL;DR: удалите следующую строку в /etc/hosts на сервере (server_hostname):

127.0.1.1 server_hostname server_hostname

И добавьте этот с 127.x.y.z ip вашего сервера в (локальной) сети:

192.x.y.z server_hostname

Я пробовал много комбинаций на стороне клиента и сервера. В автономном режиме я не думаю, что есть лучший подход. Не особо этим гордился. Стыдно возиться с конфигурацией сети и даже не предоставлять клиент оболочки HBase, способный удаленно подключаться к серверу (добро пожаловать в мир иллюзий Java...)

На стороне сервера оставьте файлы conf/hbase-site.xml пустыми. Вам не нужно размещать здесь конфигурацию Zookeeper, по умолчанию все в порядке. То же самое для etc/regionservers. Оставьте его с записью по умолчанию (localhost), потому что я не думаю, что в автономном режиме это действительно важно (и я пытался поместить в него server_hostname, и, конечно, это не работает).

На стороне клиента он должен знать сервер по имени хоста, если вы хотите разрешить с ним, поэтому снова добавьте запись в ваш файл клиента /etc/hosts для сервера.

В качестве бонуса я даю вам свою конфигурацию sbt и некоторый полный рабочий код для клиента, так как команда HBase, похоже, потратила бюджет документации в Вегасе за последние 4 года (опять же, приветствую «Business ready » мир Java/Scala).

build.sbt:

libraryDependencies ++= Seq(
  ...
  "org.apache.hadoop" % "hadoop-core" % "1.2.1",
  "org.apache.hbase" % "hbase" % "1.1.2",
  "org.apache.hbase" % "hbase-client" % "1.1.2",
)

some_client_code.scala:

import org.apache.hadoop.hbase.HBaseConfiguration
import org.apache.hadoop.hbase.client.{HTable, Put, HBaseAdmin}
import org.apache.hadoop.hbase.util.Bytes

val hbaseConf = HBaseConfiguration.create()
hbaseConf.set("hbase.zookeeper.quorum", "server_hostname")
HBaseAdmin.checkHBaseAvailable(hbaseConf)

val table = new HTable(hbaseConf, "my_hbase_table")
val put = new Put(Bytes.toBytes("row_key"))
put.add(Bytes.toBytes("cf"), Bytes.toBytes("colId1"), Bytes.toBytes("foo"))
person Stan    schedule 20.02.2016

Я знаю, что уже слишком поздно отвечать на этот вопрос, но я хочу поделиться своим способом решения подобной проблемы.

У меня была такая же проблема, и я попытался установить кворум zookeeper из java-программы, а также попытался через CLI, но ни один из них не сработал.

Я использую CDH 5.7.7 с HBase версии 1.1.0. Наконец, мне пришлось экспортировать несколько конфигураций в путь к классам Hadoop, чтобы решить проблему. Вот конфиг, который я экспортировал.

export HADOOP_CLASSPATH=/etc/hadoop/conf:/usr/share/cmf/lib/cdh5/hbase-protocol-0.98.1-cdh5.5.0.jar:/etc/hbase/conf:/driven/conf

Надеюсь это поможет.

person Alex Raj Kaliamoorthy    schedule 29.12.2017