web-dev-qa-db-fra.com

Le client Hbase ne parvient pas à se connecter au serveur Hbase distant

j'ai écrit une classe de client hbase suivante pour le serveur distant:

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();

il lance une exception:

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!

pouvez-vous me dire pourquoi jette-t-il une exception, qu'est-ce qui ne va pas avec le code et comment le résoudre?.

14
Ali Raza

Ce problème est dû au fichier hôtes de votre serveur Hbase. Il vous suffit de modifier le fichier/etc/hosts du serveur hbase. Supprimez l'entrée localhost de ce fichier et placez l'entrée localhost devant l'adresse IP du serveur hbase. 

Par exemple, les fichiers /etc/hosts de votre serveur hbase ressemblent à ceci:

127.0.0.1 localhost
192.166.66.66 xyz.hbase.com hbase

Vous devez le changer comme ceci en supprimant localhost:

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

En effet, lorsque la machine distante demande à la machine du serveur hbase où HMaster est en cours d'exécution, elle indique qu'elle s'exécute sur l'hôte localhost sur cette machine. Donc, si nous continuons à placer l'entrée de 127.0.01, le serveur hbase renvoie cette adresse et la machine distante démarre pour trouver HMaster sur sa propre machine. et quand nous changeons et le plaçons en face de hbase ip alors tout serait parfait :)

21
khan

Je suis d’accord. HBase est très sensible aux configurations/etc/hosts. Je devais définir correctement la propriété des liaisons zeekeeper dans le fichier hbase-site.xml pour que le code Java mentionné ci-dessus fonctionne ... devait le définir comme suit:

{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}

L’interface graphique distante vous donnera une image claire des domaines de liaison. Par exemple, la propriété [HBase Master] de la "console Web de l’interface graphique" devrait ressembler à ceci: www.remoterg12.net:60010 : 60010) ... ET OUI !!, je devais jouer avec le fichier/etc/hosts juste comme je ne voulais pas gâcher les configurations Apache existantes :-)

2
Shawn Brito

Je sais qu'il est trop tard pour répondre à cette question, mais je veux partager ma façon de résoudre un problème similaire.

J'ai eu le même problème et j'ai essayé de définir le quorum du gardien de zoo à partir du programme Java et j'ai également essayé via la CLI mais aucun d'entre eux n'a fonctionné.

J'utilise CDH 5.7.7 avec HBase version 1.1.0 Enfin, j'ai dû exporter quelques configs dans le classpath Hadoop pour résoudre le problème. Voici la configuration que j'ai exportée.

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

J'espère que cela t'aides.

0

Même problème ici avec HBase 1.1.3. 2 machines virtuelles (Ubuntu) sur le même réseau. Les journaux montrent que le client peut atteindre Zookeeper mais pas le serveur HBase.

TL; DR: supprimez la ligne suivante dans /etc/hosts sur le serveur ( nom_serveur ):

127.0.1.1 server_hostname server_hostname

Et ajoutez celui-ci avec 127.x.y.z l'adresse IP de votre serveur sur le réseau (local):

192.x.y.z server_hostname

J'ai essayé beaucoup de combinaisons côté client et côté serveur. En mode autonome, je ne pense pas qu'il existe une meilleure approche. Pas vraiment fier de cela. C'est dommage de devoir jouer avec la configuration réseau et de ne pas même fournir un client HBase Shell capable de se connecter à distance à un serveur (bienvenue dans le monde des illusions Java ...)

Sur le serveur, laissez les fichiers conf/hbase-site.xml vides. Vous n'avez pas besoin de mettre une configuration Zookeeper ici, les valeurs par défaut conviennent. Même chose pour etc/regionservers. Laissez-le avec l'entrée par défaut ( localhost ) car je ne pense pas qu'en mode autonome, cela est important (et j'ai essayé d'y mettre server_hostname et bien sûr, cela ne fonctionne pas).

Du côté du client, il doit connaître le serveur par nom d’hôte si vous souhaitez résoudre le problème, ajoutez à nouveau une entrée dans votre fichier client /etc/hosts pour le serveur.

En prime, je vous présente ma configuration sbt et un code completfonctionnel pour le client, car l’équipe HBase semble avoir passé le budget de documentation à Vegas au cours des 4 dernières années (encore une fois, bienvenue dans le monde «Business ready» de 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
Stan

Le même problème peut être résolu en modifiant le fichier conf/regionservers dans le répertoire hbase pour y ajouter le serveur Hbase (Remote). Alors pas besoin de changer le fichier etc/hosts

Après l'édition, conf/regionservers ressemblera à ceci:

localhost  
ip address of the remote hbase server

par exemple 

localhost              
10.132.258.366
0
Georgy B Abraham