Как подключиться к Apache Hadoop с помощью Impyla и Kerberos
Прежде всего, я также прочитал этот вопрос (так как он кажется похожим).
Моя проблема в том, что я также пытаюсь подключиться к нашей системе 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". Но, может быть, мне также нужно каким-то образом предоставить информацию в коде?
Надеюсь, кто-нибудь может мне помочь, потому что я застрял здесь.:-)
3 ответа
После долгого и склонного к ошибкам пути я наконец нашел решение. Вместо использования библиотеки "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)
Это хорошо работает, и я могу начать обрабатывать его дальше.
Я столкнулся с той же проблемой, но я исправил ее, установив правильную версию необходимых библиотек.
Установите ниже библиотеки 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)
Я использую следующую настройку:
ОПЕРАЦИОННЫЕ СИСТЕМЫ:
Ubuntu focal 20.04
$ python -V
Python 3.8.10
apt-get install libkrb5-dev krb5-user
impyla 0.17.0
thrift 0.11.0
thrift-sasl 0.4.3
pure-sasl 0.6.2
sasl 0.3.1
kerberos 1.3.1
Мой (рабочий) код:
- Kerberos (вам нужен действующий билет)
conn = connect(host='myhost', port=21050, timeout=timeout, auth_mechanism="GSSAPI", use_ssl=True, kerberos_service_name='impala')
- LDAP
conn = connect(host='myhost', port=21050, auth_mechanism='LDAP', password='ldap_pass', user='user', use_ssl=True)
или же
conn = connect(host='myhost', port=21050, auth_mechanism='LDAP', password=ldap_pass, user='user', use_ssl=True, ca_cert="my/cert")
После подключения (любым способом) запустите следующий пример:
cursor = conn.cursor()
cursor.execute('show databases')
print(cursor.fetchall())