使用 Python 连接 Impala 数据库(thriftpy 错误)

Posted

技术标签:

【中文标题】使用 Python 连接 Impala 数据库(thriftpy 错误)【英文标题】:Using Python to connect to Impala database (thriftpy error) 【发布时间】:2019-02-01 15:44:47 【问题描述】:

我要做的是非常基本的:使用 Python 连接到 Impala 数据库:

from impala.dbapi import connect

conn = connect(host='impala', port=21050, auth_mechanism='PLAIN')

我正在使用 Impyla 包来执行此操作。我收到了这个错误:

Traceback (most recent call last):
  File "/usr/local/lib/python3.6/dist-packages/thriftpy/transport/socket.py", line 96, in open
    self.sock.connect(addr)
socket.gaierror: [Errno -3] Temporary failure in name resolution

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/alaaeddine/PycharmProjects/test/data_test.py", line 3, in <module>
    conn = connect(host='impala', port=21050, auth_mechanism='PLAIN')
  File "/usr/local/lib/python3.6/dist-packages/impala/dbapi.py", line 147, in connect
    auth_mechanism=auth_mechanism)
  File "/usr/local/lib/python3.6/dist-packages/impala/hiveserver2.py", line 758, in connect
    transport.open()
  File "/usr/local/lib/python3.6/dist-packages/thrift_sasl/__init__.py", line 61, in open
    self._trans.open()
  File "/usr/local/lib/python3.6/dist-packages/thriftpy/transport/socket.py", line 104, in open
    message="Could not connect to %s" % str(addr))
thriftpy.transport.TTransportException: TTransportException(type=1, message="Could not connect to ('impala', 21050)")

也尝试了 Ibis 包,但由于同样的 thriftpy 相关错误而失败。

在使用 Dbeaver 的 Windows 中,我可以使用官方 Cloudera JDBC 连接器连接到数据库。我的问题是:

是否应该在我的连接代码中将我的 JDBC 连接器作为参数传递?我进行了一些搜索,但找不到指向这个方向的东西。 除了 Ibis 和 Impyla 套餐外,我还应该尝试其他方式吗?在使用它们时,我遇到了很多与版本相关的问题和依赖关系。如果是,您会推荐什么替代方案?

谢谢!

【问题讨论】:

【参考方案1】:

已解决: 我使用 pyhive 包而不是 Ibis/Impyla。这是一个例子:

#import hive from pyhive
from pyhive import hive

#establish the connection to the db
conn = hive.Connection(host='host_IP_addr', port='conn_port', auth='auth_type', database='my_db')

#prepare the cursor for the queries
cursor = conn.cursor()

#execute a query
cursor.execute("SHOW TABLES")

#navigate and display the results 
for table in cursor.fetchall():
    print(table)

【讨论】:

【参考方案2】:

您的 impala 域名不得解析。你能在命令提示符下做nslookup impala 吗?如果您使用的是 Docker,则需要在 docker-compose 中将 docker 服务名称设置为“impala”或具有“extra_hosts”选项。或者您可以随时将其添加到 /etc/hosts (Windows/Drivers/etc/hosts) 为 impala 127.0.0.1

还可以尝试使用“NOSASL”而不是 PLAIN,有时在关闭安全性的情况下效果更好。

【讨论】:

【参考方案3】:

这个方法很简单,用python通过impala shell连接impala。

    import commands
    import re
    query1 = "select * from table_name limit 10"
    impalad = str('hostname')
    port = str('21000')
    database = str('database_name')
    result_string = 'impala-shell -i "'+ impalad+':'+port +'" -k -B --delimited -q "'+query1+'"' 
    status, output = commands.getstatusoutput(result_string)
    print output
    if status == 0:
            print output
    else:
            print "Error encountered while executing HiveQL queries."

【讨论】:

以上是关于使用 Python 连接 Impala 数据库(thriftpy 错误)的主要内容,如果未能解决你的问题,请参考以下文章

Python3 impala 连接 hiveserver2

0039-如何使用Python Impyla客户端连接Hive和Impala

Python连接Impala

如何使用Python Impyla客户端连接Hive和Impala

python连接impala(安装impyla)

如何将 Spark 数据帧写入 impala 数据库