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?.
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 :)
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 :-)
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.
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"))
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