从没有 kerberos 的服务器连接到 MIT kerberos 认证的 cloudera hadoop 服务器中的配置单元

问题描述 投票:0回答:1

我想连接到 MIT kerberos 认证的 cloudera hadoop 服务器中的配置单元服务。我正在使用托管在未安装 kerberos 的 Windows 服务器上的 Python 脚本。我正在使用带有 Python 3.9.7 和 Pyhive 0.6.5 的 conda 环境。由于windows服务器没有kerberos客户端,我从cloudera服务器复制了krb5.conf和keytab文件到我的windows服务器,将krb5.conf重命名为krb5.ini,并将它们的路径添加到环境变量

from pyhive import hive
import os
os.environ['KRB5_CONFIG'] = 'PATH\TO\krb5.ini'
os.environ['KRB5_CLIENT_KTNAME'] = 'PATH\TO\hive.service.keytab'

conn = hive.Connection(host="some-ip-address", port=4202, auth='KERBEROS', kerberos_service_name='hive')

连接失败。下面是错误信息

(myenv) C:\Users\myname\Desktop>python hivetest.py
Traceback (most recent call last):
  File "C:\Users\myname\Desktop\hivetest.py", line 34, in <module>
    hiveconn=hive.Connection(host="some-ip-address",port=4202, auth='KERBEROS', kerberos_service_name='hive')
  File "C:\Users\myname\AppData\Local\conda\conda\envs\myenv\lib\site-packages\pyhive\hive.py", line 243, in __init__
    self._transport.open()
  File "C:\Users\myname\AppData\Local\conda\conda\envs\myenv\lib\site-packages\thrift_sasl\__init__.py", line 84, in open
    raise TTransportException(type=TTransportException.NOT_OPEN,
thrift.transport.TTransport.TTransportException: Could not start SASL: b'Error in sasl_client_start (-4) SASL(-4): no mechanism available: Unable to find a callback: 2'

当hadoop服务器没有经过kerberos认证时,我可以用这条线连接到hive服务

conn = hive.Connection(host="ip-address", port=4202, username="some-user", auth="NONE")

我删除了将路径添加到环境变量的行,只是为了检查它是否会导致新的错误消息,但错误与上面共享的相同。

Pyhive的连接类使用了很多参数进行初始化,其中之一就是配置参数。我尝试了这样的配置,但它们都没有工作并且失败并显示相同的错误消息。

config1={
    'hive.metastore.client.principal':'[email protected]',
    'hive.metastore.sasl.enabled': 'true',
    'hive.metastore.client.keytab': 'PATH\\TO\\keytab',
}
hiveconn=hive.Connection(host="some-ip",port=4202, auth='KERBEROS', kerberos_service_name='hive', configuration=config1)

config2={
    'hive.server2.authentication.kerberos.principal':'[email protected]',
    'hive.server2.authentication.kerberos.keytab': 'PATH\\TO\\keytab',
}
hiveconn=hive.Connection(host="some-ip",port=4202, auth='KERBEROS', kerberos_service_name='hive', configuration=config2)

无论 Python 库如何,我是否在建立此连接的先决条件方面做错了什么?在连接到另一个经过 kerberos 身份验证的 hadoop 服务器之前,是否必须在服务器上安装 kerberos 客户端?

python hadoop hive pyhive
1个回答
1
投票

我没有用过pyhive库。但是有一些Kerberos的经验。您提到托管 python 脚本的 Windows 机器没有 Kerberos 客户端。根据我的理解,你需要有一个。一般来说,大多数使用 Kerberos 的库都没有从 KDC 获取 Kerberos 票证的能力。它只能使用获取的会话票证。如果这个库也获得,他们将使用 Kerberos 客户端 API 来使用 Kerberos 客户端平台来获取票证。

在这种情况下,您必须在 Windows 机器上安装 Kerberos 客户端。修改您的 krb.ini 文件以联系远程 KDC。确保您可以使用 Kerberos 客户端而不是 python 脚本获取 Kerberos 票证。一旦您能够使用 Kerberos 客户端获取票证,您就可以使用 python 脚本。它应该工作。

© www.soinside.com 2019 - 2024. All rights reserved.