Как подключиться к 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())
Другие вопросы по тегам