Nous allons voir dans cet article comment lancer des requêtes Hive en python à l'aide de PyHive.
Le langage Hive permet d'effectuer des requêtes sur les données mais n'est pas dynamique. Impossible d'utiliser des variables ou de faire des boucles par exemples. C'est pourquoi, il peut être intéressant d'utiliser un langage dynamique comme Python. La librairie que nous allons utiliser pour effectuer les requêtes est PyHive. Nous allons voir comment l'installer et l'utiliser sur un cluster HdInsight

Qu'est-ce que PyHive?

PyHive est un package Python qui permet de lancer des requêtes Hive ou Presto. Vous pouvez ainsi récupérer le résultat d'une requête et le manipuler.
Ce package est basé sur Thrift qui est lui-même un package maintenu par Apache.

Installation des composants pré-requis

Tout d'abord nous allons nous connecter en SSH sur le cluster. Ainsi nous allons pouvoir installer les composants par scripts.
Nous allons utiliser la version Python3 des packages, pour cela il faut préalablement l'installer : pip3

sudo apt install python3-pip -y

Nous allons ensuite installer les packages python nécessaires au fonctionnement de PyHive : sasl et thrift_sasl

pip3 install sasl
pip3 install thrift_sasl

Enfin nous pouvons installer le package PyHive. Nous installons plus précisément la version Hive de ce package, car il existe une version pour Presto de cette librairie :

pip3 install pyhive[hive]

Afin d'éviter de devoir répéter l'ensemble des manipulations énoncées ci-dessus, il est intéressant de mettre ce script en tant qu'ActionScript à la création du cluster. Ainsi pour tout nouveau cluster, vous pouvez utiliser PyHive.

Création du script Python

Dans un cas classique, voici comment on utiliserait PyHive:

from pyhive import hive

query = "SHOW DATABASES"
cursor = hive.connect(host='localhost').cursor()
cursor.execute(query)

Ceci ne fonctionnera pas sur HdInsight car PyHive utilise une communication en mode binaire alors que HdInisght est paramétré par défaut pour utiliser une communication en mode HTTP. Vous pouvez trouver cette configuration dans le paramètre "hive.server2.transport.mode" de la configuration Hive. Au lieu de modifier ce paramètre, qui pourrait avoir de mauvaises conséquences sur le cluster, nous allons passer un objet THttpClient à la méthode connect, ce qui permettra d'utiliser une communication HTTP. Ce qui donne ceci :

import base64
from pyhive import hive
from thrift.transport.THttpClient import THttpClient

def add_http_mode_support(username, password, port=10001, httpPath="/cliservice", host="localhost"):
     auth_string = "%s:%s" % (username, password)
     _transport = THttpClient(host, port=port, path=httpPath)
     _transport.setCustomHeaders({"Authorization": "Basic "+base64.b64encode(auth_string.encode()).decode()})
     return _transport

query='SHOW DATABASES'
cursor = hive.connect(thrift_transport=add_http_mode_support(username='toto', password='xxx')).cursor()
cursor.execute(query)
print(str(cursor.fetchall()))

La méthode connect a un paramètre optionel "thrift_transport" que nous utilisons ici. Ce paramètre attend un objet de type TTransportBase et il existe différents modes de communication possibles. THttpClient est une classe qui surcharge TTransportBase qui permet justement la communication HTTP.

A partir de là, vous pouvez effectuer vos algorithmes en fonction du résultat de vos requêtes.
Attention, votre requête ne doit contenir qu'une seule instruction : un seul "SELECT" ou un seul "INSERT"... Si vous voulez lancer plusieurs instructions dans la même chaîne de caractères (dans la variable query de l'exemple ci-dessus), vous devez appeler autant de fois la méthode execute qu'il y a d'instructions. Sinon vous devrez utiliser la commande Beeline qui peut prendre en paramètre un script HQL.

Quelques liens :
Projet PyHive : https://pypi.org/project/PyHive/
Code source PyHive : https://github.com/dropbox/PyHive
Code source Thrift : https://github.com/apache/thrift

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.