如何使用 Impyla 和 Kerberos 连接到 Apache Hadoop

How to connect to Apache Hadoop with Impyla and Kerberos

首先我也看了this question(因为好像差不多)

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

(主机和端口作为变量传递)

目前的错误是: "no module named thrift_sasl"

对该错误消息使用 google 并不能使我找到有用的东西,但效果很差。有人说需要安装 "pyKerberos" 模块,但我不确定是否能解决问题。

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

希望有人能帮助我,因为我被困在这里了。 :-)

经过漫长且容易出错的方法,我终于找到了解决方案。 我没有使用库 "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)

效果很好,我可以开始进一步处理了。

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

使用 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) 

我使用以下设置:

OS: 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())