Как подключиться к Apache Hadoop с помощью Impyla и Kerberos - PullRequest
0 голосов
/ 24 января 2019

Прежде всего, я также прочитал этот вопрос (так как он кажется похожим).

Моя проблема в том, что я также пытаюсь подключиться к нашей системе Apache Hadoop, которая теперь защищена Kerberos. Я использую модуль Impyla для достижения этой цели. До установки Kerberos в системе Hadoop это работало хорошо. Сейчас я пробовал разные решения в интернете, и, похоже, ничего не работает, но я должен признать, что никогда раньше не работал с Kerberos.

Это код, который я использую:

    conn = connect (host = host, 
                    port = port, 
                    auth_mechanism='GSSAPI', 
                    kerberos_service_name='impala')
    db_cursor = conn.cursor()
    db_cursor.execute ('SHOW DATABASES')
    results = db_cursor.fetchall()
    db_names = [print(x[0]) for x in results]

(хост и порт передаются как переменные)

Ошибка на данный момент: "нет модуля с именем thrift_sasl"

Использование Google в этом сообщении об ошибке не приводит меня к чему-то полезному, плохо. Некоторые говорят, что модуль "pyKerberos" должен быть установлен, но я не уверен, что это решит проблему.

Я что-то забыл? У меня также есть принципал и пароль Kerberos, и я управляю им с помощью «MIT Kerberos Ticket Manager». Но, может быть, мне также необходимо каким-то образом предоставить информацию в коде?

Надеюсь, кто-нибудь сможет мне помочь, потому что я застрял здесь. :-)

Ответы [ 2 ]

0 голосов
/ 04 августа 2019

Я столкнулся с той же проблемой, но исправил ее, установив нужную версию необходимых библиотек.

Установите ниже библиотеки python, используя pip:

six==1.12.0
bit_array==0.1.0
thrift==0.9.3
thrift_sasl==0.2.1
sasl==0.2.1
impyla==0.13.8

Ниже код работает нормально с python версиями 2.7 и 3.4.

import ssl
from impala.dbapi import connect
import os
os.system("kinit")
conn = connect(host='hostname.io', port=21050, use_ssl=True, database='default', user='urusername', kerberos_service_name='impala', auth_mechanism = 'GSSAPI')
cur = conn.cursor()
cur.execute('SHOW DATABASES;')
result=cur.fetchall()
for data in result:
    print (data) 
0 голосов
/ 05 февраля 2019

После долгого и подверженного ошибкам пути я наконец нашел решение.Вместо использования библиотеки «impyla» я использовал другой подход: я установил драйвер ODBC cloudera и настроил новое соединение в инструменте администратора источника данных ODBC.Я также предоставил файл .keytab для аутентификации (а также имя пользователя и пароль и т. Д.).Затем я просто использовал библиотеку Python "pyodbc" следующим образом:

import pyodbc
import pandas


pyodbc.autocommit=True
conn = pyodbc.connect("DSN=NAMEOFYOURDSN", autocommit=True)
cursor = conn.cursor()
cursor.execute('SHOW DATABASES')
with pandas.option_context('display.max_rows', None, 'display.max_columns', None):    
     print(df)

Это хорошо работает, и я могу начать обрабатывать его дальше.

...