web-dev-qa-db-fra.com

Comment se connecter à HBase à distance en Java?

J'ai un serveur HBase autonome. Voici mon hbase-site.xml: 

<configuration>
 <property>
    <name>hbase.rootdir</name>
    <value>file:///hbase_data</value>
  </property>
</configuration>

J'essaie d'écrire un programme Java pour manipuler les données dans HBase. 

Si je lance le programme sur le serveur HBase, cela fonctionne bien. Mais je ne sais pas comment le configurer pour un accès à distance. 

  Configuration config = HBaseConfiguration.create();
   HTable table = new HTable(config, "test");
   Scan s = new Scan();

J'ai essayé d'ajouter IP et Port, cela ne fonctionne pas: 

config.set("hbase.master", "146.169.35.28:60000")

Quelqu'un peut-il me dire comment le faire? 

Merci!

38
leon

Voici un extrait d’un système que nous utilisons pour créer un HTable que nous utilisons pour nous connecter à HBase

Configuration hConf = HBaseConfiguration.create(conf);
hConf.set(Constants.HBASE_CONFIGURATION_ZOOKEEPER_QUORUM, hbaseZookeeperQuorum);
hConf.setInt(Constants.HBASE_CONFIGURATION_ZOOKEEPER_CLIENTPORT, hbaseZookeeperClientPort);

HTable hTable = new HTable(hConf, tableName);

HTH

EDIT: Exemple de valeurs:

public static final String HBASE_CONFIGURATION_ZOOKEEPER_QUORUM                     = "hbase.zookeeper.quorum";
public static final String HBASE_CONFIGURATION_ZOOKEEPER_CLIENTPORT                 = "hbase.zookeeper.property.clientPort";
...
hbaseZookeeperQuorum="PDHadoop1.corp.CompanyName.com,PDHadoop2.corp.CompanyName.com";
hbaseZookeeperClientPort=10000;
tableName="HBaseTableName";
27
QuinnG

hbase.master est @Deprecated. Les clients utilisent Zookeeper pour obtenir le nom d’hôte/port actuel de leurs serveurs HBase.

@Deprecated
config.set("hbase.master", "146.169.35.28:60000")

Hadoop et HBase sont très sensibles aux configurations DNS et /etc/hosts. Assurez-vous que votre nom d’hôte ne pointe pas sur 127.0.0.1 sinon il démarrera de nombreux services en écoute sur localhost uniquement. Essayez de ne pas utiliser les adresses IP où que vous soyez dans les paramètres.

Mon /etc/hosts:

192.168.2.3     cloudera-vm     # Added by NetworkManager
127.0.0.1       localhost.localdomain   localhost
127.0.1.1       cloudera-vm-local localhost

/etc/hbase/hbase-site.xml devrait avoir les paramètres set distributed=false (puisque vous ne l'utilisez que pour les tests):

<property>
  <name>hbase.cluster.distributed</name>
  <value>false</value>
</property>

/etc/zookeeper/Zoo.cfg

# the port at which the clients will connect
clientPort=2181
server.0=cloudera-vm:2888:3888

Liste de mes processus Java:

root@cloudera-vm:~# jps
1643 TaskTracker
1305 JobTracker
1544 SecondaryNameNode
2037 Bootstrap
9622 DataNode
10144 Jps
9468 NameNode
1948 RunJar
9746 HMaster
11
vladaman

En un mot c'est ce que j'utilise:

    Configuration hBaseConfig =  HBaseConfiguration.create();
    hBaseConfig.setInt("timeout", 120000);
    hBaseConfig.set("hbase.master", "*" + hbaseHost + ":9000*");
    hBaseConfig.set("hbase.zookeeper.quorum",zookeeperHost);
    hBaseConfig.set("hbase.zookeeper.property.clientPort", "2181");

Pour hBaseHost et zookeeperHost, je passe simplement l'adresse IP d'un ordinateur en cluster sur lequel zookeeper est installé. Bien sûr, vous pouvez également paramétrer les numéros de port. Je ne suis pas sûr à 100% que ce soit le meilleur moyen de garantir une connexion réussie, mais jusqu'à présent, cela fonctionne sans aucun problème.

7
Marquez

Pour autant que je sache, si vous souhaitez vous connecter à un serveur hbase distant, le client Java normal ne fonctionne pas, dans lequel nous déclarons simplement la configuration et essayons de vous connecter à la base distante, comme indiqué dans les réponses précieuses.

J'ai essayé ce genre de choses ci-dessus mais je n'y suis jamais parvenu ..__ Au lieu de cela, j'ai utilisé l'API Thrift pour se connecter à un serveur distant,

This link est le meilleur exemple d'utilisation du client Java Thrift API.Il fonctionne sûrement.J'utilise le même . Mais avant de l'utiliser, lisez attentivement le code et émettez les éléments dont vous n'avez pas besoin. Je donne également l'exemple de code pour le même qui fonctionne avec succès.

public class ThriftClient 
{

    port = 9090;
    //Connection to hbase
    TTransport transport = new TSocket(hostname, port);
    TProtocol protocol = new TBinaryProtocol(transport, true, true);
    Hbase.Client client = new Hbase.Client(protocol);

    transport.open();

    int z=Link.length();
    byte[] tablename = bytes("YOUR TABLE NAME");

    // Create the demo table with two column families, entry: and unused:
    ArrayList<ColumnDescriptor> columns = new ArrayList<ColumnDescriptor>();
    ColumnDescriptor col = null;
    col = new ColumnDescriptor();
    col.name = ByteBuffer.wrap(bytes("YOUR_COLUMN_FAMILY_NAME"));
    col.maxVersions = 10;
    columns.add(col);

    System.out.println("creating table: " + utf8(tablename));
    try 
    {
        client.createTable(ByteBuffer.wrap(tablename), columns);
    } 
    catch (AlreadyExists ae) 
    {
        System.out.println("WARN: " + ae.message);
    }

    Map<ByteBuffer, ByteBuffer> dummyAttributes = null;
    boolean writeToWal = false;
    // Test UTF-8 handling
    byte[] invalid = {(byte) 'f', (byte) 'o', (byte) 'o', (byte) '-',
        (byte) 0xfc, (byte) 0xa1, (byte) 0xa1, (byte) 0xa1, (byte) 0xa1};
    byte[] valid = {(byte) 'f', (byte) 'o', (byte) 'o', (byte) '-',
        (byte) 0xE7, (byte) 0x94, (byte) 0x9F, (byte) 0xE3, (byte) 0x83,
        (byte) 0x93, (byte) 0xE3, (byte) 0x83, (byte) 0xBC, (byte) 0xE3,
        (byte) 0x83, (byte) 0xAB};


    ArrayList<Mutation> mutations;

    // Run some operations on a bunch of rows

    NumberFormat nf = NumberFormat.getInstance();
    nf.setMinimumIntegerDigits(10);
    nf.setGroupingUsed(false);
    byte[] row=bytes("YOUR ROW NAME");

    mutations = new ArrayList<Mutation>();
    mutations.add(new Mutation(false, ByteBuffer.wrap(bytes("YOUR_COLUMN_FAMILY_NAME:YOUR_COLUMN_NAME")), ByteBuffer.wrap(bytes("YOUR_ROW_VALUE")), writeToWal));
    client.mutateRow(ByteBuffer.wrap(tablename), ByteBuffer.wrap(row), mutations, dummyAttributes);

    transport.close();

    // Helper to translate byte[]'s to UTF8 strings
private static String utf8(byte[] buf) {
    try {
        return decoder.decode(ByteBuffer.wrap(buf)).toString();
    } catch (CharacterCodingException e) {
        return "[INVALID UTF-8]";
    }
}

// Helper to translate strings to UTF8 bytes
private static byte[] bytes(String s) {
    try {
        return s.getBytes("UTF-8");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
        return null;
    }
}
}
1
ashubhargave

Dans mon cas, après avoir beaucoup joué avec/etc/hosts, j'ai fini par trouver dans le fichier journal "hbase-bgi-master-servername.log" la ligne suivante:

"2017-11-21 19: 56: 32,999 INFO [RS: 0; nom du serveur: 45553] régionserver.HRegionServer: servant comme nom du serveur.local.lan, 45553,1511290584538, serveur Rpc sur le nom du serveur.local.lan/172.0.1.2: 45553 , sessionid = 0x15fdff039790002 "

Assurez-vous toujours que le nom d'hôte complet ("nomserveur.local.lan" dans mon cas) pointe réellement sur l'adresse IP du serveur, côté client et côté serveur.

0
user3484366