Использование Python для подключения к базе данных Impala (ошибка thriftpy)
То, что я пытаюсь сделать, очень просто: подключиться к базе данных Impala с помощью Python:
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, но потерпел неудачу с той же ошибкой, связанной с экономией.
В Windows, используя Dbeaver, я мог подключиться к базе данных, используя официальный JDBC-коннектор Cloudera. Мои вопросы:
- Должен ли мой 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)
Ваше доменное имя impala не должно разрешаться. Вы в состоянии сделать nslookup impala
в командной строке? Если вы используете Docker, вам нужно указать имя службы docker в docker-compose как "impala" или иметь опцию "extra_hosts". Или вы всегда можете добавить его в /etc/hosts (Windows/Drivers/etc/hosts) как impala 127.0.0.1
Также попробуйте "NOSASL" вместо "PLAIN", что иногда работает лучше при отключенной защите.
Это простой метод подключения импалы через оболочку импала с использованием Python.
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."