HBase
 sql >> Base de données >  >> NoSQL >> HBase

Mode d'emploi :utiliser l'interface HBase Thrift, partie 1

Il existe différentes manières d'accéder et d'interagir avec Apache HBase. Plus particulièrement, l'API Java fournit le plus de fonctionnalités. Mais certaines personnes veulent utiliser HBase sans Java.

Ces personnes ont deux options principales :l'une est l'interface Thrift (la plus légère et donc la plus rapide des deux options), et l'autre est l'interface REST (alias Stargate). Une interface REST utilise des verbes HTTP pour effectuer une action. En utilisant HTTP, une interface REST offre un éventail beaucoup plus large de langages et de programmes pouvant accéder à l'interface. (Si vous souhaitez plus d'informations sur l'interface REST, vous pouvez consulter ma série de tutoriels à ce sujet.)

Dans cette série de tutoriels, vous découvrirez l'interface Thrift et explorerez des exemples de code Python pour le faire. Ce premier article couvrira HBase Thrift, en collaboration avec Thrift, et un code passe-partout pour se connecter à Thrift. Le deuxième article montrera comment insérer et obtenir plusieurs lignes à la fois. Le troisième article expliquera comment utiliser les analyses et certaines considérations lors du choix entre REST et Thrift.

Les exemples de code complets sont disponibles sur mon compte GitHub.

Épargne HBase

Thrift est un framework logiciel qui vous permet de créer des liaisons inter-langues. Dans le contexte de HBase, Java est le seul citoyen de première classe. Cependant, l'interface HBase Thrift permet à d'autres langages d'accéder à HBase via Thrift en se connectant à un serveur Thrift qui s'interface avec le client Java.

Pour que Thrift et REST fonctionnent, un autre démon HBase doit être en cours d'exécution pour gérer ces demandes. Ces démons peuvent être installés avec les packages hbase-thrift et hbase-rest. Le diagramme ci-dessous montre comment Thrift et REST sont placés dans le cluster.

Notez que les hôtes clients Thrift et REST n'exécutent généralement pas d'autres services (tels que DataNodes ou RegionServers) pour maintenir une surcharge faible et une réactivité élevée pour les interactions REST ou Thrift.

Assurez-vous d'installer et de démarrer ces démons sur les nœuds qui ont accès à la fois au cluster Hadoop et à l'application qui a besoin d'accéder à HBase. L'interface Thrift n'a pas d'équilibrage de charge intégré, donc tout l'équilibrage de charge devra être effectué avec des outils externes tels qu'un round-robin DNS, une adresse IP virtuelle ou en code. Cloudera Manager facilite également l'installation et la gestion des services HBase REST et Thrift. Vous pouvez le télécharger et l'essayer gratuitement dans Cloudera Standard !

L'inconvénient de Thrift est qu'il est plus difficile à configurer que REST. Vous devrez compiler Thrift et générer les liaisons spécifiques au langage. Ces liaisons sont intéressantes car elles vous donnent du code pour le langage dans lequel vous travaillez - il n'est pas nécessaire d'analyser XML ou JSON comme dans REST ; l'interface Thrift vous donne plutôt un accès direct aux données de la ligne. Une autre fonctionnalité intéressante est que le protocole Thrift a un transport binaire natif; vous n'aurez pas besoin d'encoder et de décoder les données en base64.

Pour commencer à utiliser l'interface Thrift, vous devez déterminer sur quel port il s'exécute. Le port par défaut pour CDH est le port 9090.  Pour cet article, vous verrez les variables d'hôte et de port utilisées. Voici les valeurs que nous utiliserons :

hôte ="localhost"port ="9090"

Vous pouvez configurer l'interface Thrift pour utiliser les informations d'identification Kerberos pour une meilleure sécurité.

Pour votre code, vous devrez utiliser l'adresse IP ou le nom de domaine complet du nœud et le port exécutant le démon Thrift. Je recommande fortement de faire de cette URL une variable car elle pourrait changer avec les changements de réseau.

Liaisons de langage

Avant de pouvoir créer des liaisons Thrift, vous devez télécharger et compiler Thrift. Il n'y a pas de packages binaires pour Thrift que j'ai pu trouver, sauf sur Windows. Vous devrez suivre les instructions de Thrift pour l'installation sur la plateforme de votre choix.

Une fois Thrift installé, vous devez trouver le fichier Hbase.thrift. Pour définir les services et les types de données dans Thrift, vous devez créer un fichier IDL. Heureusement, les développeurs HBase en ont déjà créé un pour nous. Malheureusement, le fichier n'est pas distribué dans le cadre des packages binaires CDH. (Nous corrigerons cela dans une future version de CDH.) Vous devrez télécharger le package source de la version HBase que vous utilisez. Assurez-vous d'utiliser la bonne version de HBase car cet IDL peut changer. Dans le fichier compressé, le chemin vers l'IDL est hbase-VERSION/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift.

Thrift prend en charge la génération de liaisons de langage pour plus de 14 langages, dont Java, C++, Python, PHP, Ruby et C#. Pour générer les liaisons pour Python, vous utiliseriez la commande suivante :

thrift -gen py /path/to/hbase/source/hbase-VERSION/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift

Ensuite, vous devrez récupérer le code Thrift de votre langage qui contient toutes les classes de connexion à Thrift et ses protocoles. Ce code peut être trouvé à /path/to/thrift/thrift-0.9.0/lib/py/src/.

Voici les commandes que j'ai exécutées pour créer un projet Python pour utiliser HBase Thrift :

$ mkdir HBaseThrift$ cd HBaseThrift/$ thrift -gen py ~/Downloads/hbase-0.94.2-cdh4.2.0/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift$ mv gen-py/* . $ rm -rf gen-py/$ mkdir thrift$ cp -rp ~/Downloads/thrift-0.9.0/lib/py/src/* ./thrift/

J'aime conserver une copie du fichier Hbase.thrift dans le projet pour me référer. Il contient beaucoup de "Javadoc" sur les différents appels, objets de données et objets de retour.

$ cp ~/Downloads/hbase-0.94.2-cdh4.2.0/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift

Code standard

Vous constaterez que tous vos scripts Python Thrift se ressembleront beaucoup. Passons en revue chaque partie.

from thrift.transport import TSocketfrom thrift.protocol import TBinaryProtocolfrom thrift.transport import TTransportfrom hbase import Hbase

Ceux-ci importeront les modules Thrift et HBase dont vous avez besoin.

# Se connecter à HBase Thrift servertransport =TTransport.TBufferedTransport(TSocket.TSocket(host, port))protocol =TBinaryProtocol.TBinaryProtocolAccelerated(transport)

Cela crée le protocole de transport et de ligne de socket et permet au client Thrift de se connecter et de parler au serveur Thrift.

# Créer et ouvrir le client connectionclient =Hbase.Client(protocol)transport.open()

Ces lignes créent l'objet Client que vous utiliserez pour interagir avec HBase. A partir de cet objet client, vous émettrez tous vos Gets et Puts. Ensuite, ouvrez le socket vers le serveur Thrift.

# Faire quelque chose

Ensuite, vous travaillerez réellement avec le client HBase. Tout est construit, initialisé et connecté. Tout d'abord, commencez à utiliser le client.

transport.close()

Enfin, fermez le transport. Cela ferme le socket et libère les ressources sur le serveur Thrift. Voici le code dans son intégralité pour faciliter le copier-coller :

from thrift.transport import TSocketfrom thrift.protocol import TBinaryProtocolfrom thrift.transport import TTransportfrom hbase import Hbase# Connect to HBase Thrift servertransport =TTransport.TBufferedTransport(TSocket.TSocket(host, port))protocol =TBinaryProtocol.TBinaryProtocolAccelerated(transport) # Créer et ouvrir le client connectionclient =Hbase.Client(protocol)transport.open()# Do Somethingtransport.close()

Dans l'implémentation Python de HBase Thrift, toutes les valeurs sont transmises sous forme de chaînes. Cela inclut les données binaires comme un entier. Toutes les valeurs de colonne sont conservées dans l'objet TCell. Voici la définition dans le fichier Hbase.thrift :

struct TCell{  1 : valeur d'octets,   2:horodatage i64}

Remarquez la modification d'une chaîne lorsque le code Python est généré :

thrift_spec =(    Aucun, # 0    (1, TType.STRING, 'value', Aucun, Aucun, ), # 1    (2, TType.I64, 'timestamp', Aucun, Aucun, ), # 2) 

J'ai écrit une méthode d'assistance pour faciliter le traitement des entiers 32 bits. Pour changer un entier dans les deux sens entre une chaîne, vous utilisez ces deux méthodes.

# Méthode pour encoder les entiers avec la chaîne encodingdef encode(n) de Thrift :     return struct.pack("i", n)# Méthode pour décoder les entiers avec la chaîne encodingdef decode(s) de Thrift :     return struct.unpack('i' , s)[0]

Gardez cette mise en garde à l'esprit lorsque vous travaillez avec des données binaires dans Thrift. Vous devrez convertir les données binaires en chaînes et vice versa.

Erreur sortante

Il n'est pas aussi facile que cela pourrait l'être de comprendre les erreurs dans l'interface Thrift. Par exemple, voici l'erreur qui sort de Python lorsqu'une table est introuvable :

Traceback (dernier appel le plus récent) :  File "./get.py", ligne 17, dans     rows =client.getRow(tablename, "shakespeare-comedies-000001")  File "/mnt/hgfs/ jesse/repos/DevHivePigHBaseVM/training_materials/hbase/exercises/python_bleets_thrift/hbase/Hbase.py", ligne 1038, dans getRow    return self.recv_getRow()  File "/mnt/hgfs/jesse/repos/DevHivePigHBaseVM/training_materials/hbase/exercises /python_bleets_thrift/hbase/Hbase.py", ligne 1062, dans recv_getRow    lève result.iohbase.ttypes.IOError :IOError(_message='doesnotexist')

Tout n'est pas perdu car vous pouvez consulter le fichier journal HBase Thrift. Sur CDH, ce fichier se trouve dans /var/log/hbase/hbase-hbase-thrift-localhost.localdomain.log. Dans l'exemple de table manquante, vous verriez une erreur dans le journal Thrift indiquant que la table n'existe pas. Ce n'est pas pratique, mais vous pouvez déboguer à partir de là.

Dans le prochain épisode, je couvrirai l'insertion et l'obtention de lignes.

Jesse Anderson est instructeur à l'université Cloudera.