使用Kerberos auth thrift.transport.TTransport.TTransportException连接到Impala:

时间:2018-05-12 19:02:46

标签: python-2.7 kerberos impala thrift-protocol

我花了很多时间尝试通过python与kereberized impala服务器建立连接。有可能使用java jdbc。我不认为这是一个kereberos票的问题。如果我运行klist,我可以毫无问题地看到我的机票。

Ticket cache: FILE:/tmp/krb5cc_4356
Default principal: xx@xx.xx.xx
Valid starting     Expires            Service principal
05/12/18 20:17:22  05/13/18 06:17:22  krbtgt/xx.xx.xx@xx.xx.xx
        renew until 05/19/18 20:17:22

我使用自己的krb5.config文件,就像我之前说的那样,我可以将它与java一起使用,所以我不知道这里的问题在哪里。 我的字符串连接:

conn = connect(host='impala/_HOST@xx.xx.xx, port=21050, auth_mechanism='GSSAPI', user='xx', password='xx', database = 'xx', kerberos_service_name='impala')

我总是遇到同样的问题:

File conexionsimple.py", line 18, in <module>     protocol=None)
  File dbapi.py", line 147, in connect  auth_mechanism=auth_mechanism)
  File hiveserver2.py", line 758, in connect  transport.open()
  File python2.7/site-packages/thrift_sasl/__init__.py", line 68, in open    self._trans.open()
  File /thrift/transport/TSocket.py", line 101, in open     message=message)
thrift.transport.TTransport.TTransportException: Could not connect to impala/_HOST@xx.xx.xx:21050

版本:

python 2.7.14
thrift 0.9.3
thrift-sasl 0.3
sasl 0.2
impyla 0.14

我试过其他节俭版本(0.2.1),但我有同样的错误。 有什么建议吗?

2 个答案:

答案 0 :(得分:0)

主机应该只是主机名。在示例中删除部分到@。

同时删除用户名和密码。 Kerberos使用kerberos票证进行身份验证

答案 1 :(得分:0)

要更全面地回答此问题,与使用impala-shell相比,kerberos使impyla更具挑剔性,因此hostname参数必须是运行kerberos的运行impala的节点的完全限定域名。

例如,我的impala服务名称是impala.somevalue.somedomain,这在impala shell和纯文本Impyla连接中可以正常使用。仅当您使用auth = GSSAPI时,它才会中断。要对其进行修复,请确保主机为FQDN。

例如我在云提供商上的fqdn是ip-xxx-xxx-xxx-xxx.somevalue.somedomain,其中xxx是IP地址八位字节。