Клиент Hbase не может подключиться к удаленному серверу Hbase - PullRequest
14 голосов
/ 17 октября 2011

я написал следующий класс клиента 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!

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

Ответы [ 5 ]

22 голосов
/ 19 мая 2012

Эта проблема возникает из-за файла 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

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

2 голосов
/ 17 июля 2012

Я согласен .. 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] в «Веб-консоли GUI»должно быть примерно так: www.remoterg12.net:60010 (НЕ должно быть localhost: 60010) ... И ДА !! Мне пришлось поиграться с / etc / hosts просто так, как я не хотелиспортить существующие конфиги Apache: -)

0 голосов
/ 29 декабря 2017

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

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

Я использую CDH 5.7.7 с версией HBase 1.1.0 Наконец, мне пришлось экспортировать несколько конфигов в classpath 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

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

0 голосов
/ 20 февраля 2016

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

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

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 года (опять же, добро пожаловать «Готовый бизнес» мир 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"))
0 голосов
/ 30 октября 2012

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

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

localhost  
ip address of the remote hbase server

например

localhost              
10.132.258.366
...