J'écris des flux ETL en Python qui, pour une partie du processus, utilisent Hive. Le client impyla de Cloudera, selon la documentation, fonctionne avec Impala et Hive.
D'après mon expérience, le client a travaillé pour Impala, mais a bloqué lorsque j'ai essayé de me connecter à Hive:
from impala.dbapi import connect
conn = connect(host='host_running_hs2_service', port=10000, user='awoolford', password='Bzzzzz')
cursor = conn.cursor() <- hangs here
cursor.execute('show tables')
results = cursor.fetchall()
print results
Si j'entre dans le code, il se bloque lorsqu'il essaie d'ouvrir une session (ligne # 873 de hiveserver2.py).
Au début, je soupçonnais qu'un port de pare-feu pouvait bloquer la connexion, et j'ai donc essayé de me connecter en utilisant Java. À ma grande surprise, cela a fonctionné:
public class Main {
private static String driverName = "org.apache.hive.jdbc.HiveDriver";
public static void main(String[] args) throws SQLException {
try {
Class.forName(driverName);
} catch (ClassNotFoundException e) {
e.printStackTrace();
System.exit(1);
}
Connection connection = DriverManager.getConnection("jdbc:hive2://host_running_hs2_service:10000/default", "awoolford", "Bzzzzz");
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("SHOW TABLES");
while (resultSet.next()) {
System.out.println(resultSet.getString(1));
}
}
}
Étant donné que Hive et Python sont des technologies couramment utilisées, je suis curieux de savoir si quelqu'un d'autre a rencontré ce problème et, si oui, qu'avez-vous fait pour le résoudre?
Versions:
- Hive 1.1.0-cdh5.5.1
- Python 2.7.11 | Anaconda 2.3.0
- Redhat 6.7
3 réponses
J'ai essayé le PyHive de Dropbox et cela a parfaitement fonctionné:
from pyhive import hive
conn = hive.Connection(host="host_running_hs2_service", port=10000, username="awoolford")
cursor = conn.cursor()
cursor.execute("SHOW TABLES")
for table in cursor.fetchall():
print table
Je ne sais pas pourquoi le client Impyla n'a pas fonctionné, mais au moins nous pouvons avancer.
L'ajout du bloc suivant à /etc/hive/conf/hive-site.xml
a fait l'affaire pour moi:
<property>
<name>hive.server2.authentication</name>
<value>NOSASL</value>
</property>
Merci au commentaire de @ ozw1z5rd de m'avoir pointé dans la bonne direction!
/path/to/bin/hive --service hiveserver2 --hiveconf hive.server2.authentication=NOSASL
from impala.dbapi import connect
conn = connect(host='host_running_hs2_service', port=10000, user='awoolford', password='Bzzzzz', auth_mechanism='NOSASL')
cursor = conn.cursor()
cursor.execute('show tables')
results = cursor.fetchall()
print results
De nouvelles questions
python
Python est un langage de programmation multi-paradigme, typé dynamiquement et polyvalent. Il est conçu pour être rapide à apprendre, comprendre, utiliser et appliquer une syntaxe propre et uniforme. Veuillez noter que Python 2 est officiellement hors support à partir du 01-01-2020. Néanmoins, pour les questions Python spécifiques à la version, ajoutez la balise [python-2.7] ou [python-3.x]. Lorsque vous utilisez une variante Python (par exemple, Jython, PyPy) ou une bibliothèque (par exemple, Pandas et NumPy), veuillez l'inclure dans les balises.