0

首先,我还阅读了这个问题(因为它似乎很相似)。

我的问题是我还尝试连接到现在由 Kerberos 保护的 Apache Hadoop 系统。我使用 impyla 模块来实现这一点。在 Hadoop 系统上安装 Kerberos 之前,它运行良好。现在我在互联网上尝试了不同的解决方案,但似乎没有任何效果,但我不得不承认我以前从未使用过 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 的模块”

在该错误消息上使用谷歌并不会让我找到有用的东西,很糟糕。有人说需要安装“pyKerberos”模块,但我不确定这是否能解决问题。

有什么我忘记了吗?我也有 Kerberos 主体和密码,并使用“MIT Kerberos Ticket Manager”管理它但也许我还必须以某种方式在代码中提供信息?

希望有人可以帮助我,因为我很困在这里。:-)

4

3 回答 3

1

我遇到了同样的问题,但我通过安装所需库的正确版本来修复它。

使用 pip 安装以下 python 库:

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.73.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) 
于 2019-08-04T14:39:46.507 回答
0

经过漫长且容易出错的方式,我终于找到了解决方案。我没有使用库“impyla”,而是使用了另一种方法:我安装了 cloudera ODBC 驱动程序并在 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)

这很好用,我可以开始进一步处理它。

于 2019-02-05T10:11:33.273 回答
0

我使用以下设置:

操作系统: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())
于 2021-11-22T11:17:14.940 回答