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
4
Alex Woolford 8 mars 2016 à 00:13

3 réponses

Meilleure réponse

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.

0
Alex Woolford 8 mars 2016 à 15:31

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!

0
FoxMulder900 19 oct. 2018 à 15:09
/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
1
戚锦秀 26 sept. 2016 à 12:28