인증 방식에 따라 필요한 패키지가 다르다.
pip install "pyhive[hive]" thrift
pip install thrift_sasl pure-sasl
SASL 계열 인증(LDAP · Kerberos · CUSTOM)을 쓰려면 thrift_sasl 이 필요하다. Kerberos 까지 쓰면 시스템에 libsasl2 와 GSSAPI 플러그인이 있어야 한다.
dnf install -y cyrus-sasl-devel cyrus-sasl-gssapi
HiveServer2 의 기본 Thrift 포트는 10000 이다. HTTP 전송 모드를 쓰면 10001 을 쓴다.
from pyhive import hive
# 인증 없음 (hive.server2.authentication=NOSASL)
conn = hive.Connection(host="hs2-host", port=10000, username="analyst",
database="default", auth="NOSASL")
# LDAP
conn = hive.Connection(host="hs2-host", port=10000, username="analyst",
password="...", database="default", auth="LDAP")
# Kerberos (kinit 을 먼저 수행)
conn = hive.Connection(host="hs2-host", port=10000, database="default",
auth="KERBEROS", kerberos_service_name="hive")
auth 값은 서버 설정과 정확히 맞아야 한다. 서버가 hive.server2.authentication=NONE 이면 클라이언트는 auth="NONE" 을 쓰고 SASL PLAIN 으로 협상한다. NOSASL 은 SASL 자체를 쓰지 않는 별개 설정이며, 서버가 NOSASL 이 아닌데 클라이언트가 NOSASL 로 붙으면 협상 단계에서 끊긴다. 흔한 실패 원인이다.
cur = conn.cursor()
cur.execute("SHOW TABLES")
for row in cur.fetchall():
print(row)
cur.execute("SELECT id, name FROM db.tbl WHERE part_dt = %(dt)s LIMIT 10",
{"dt": "2026-09-20"})
rows = cur.fetchall()
cur.close()
conn.close()
파라미터는 문자열을 직접 이어 붙이지 말고 바인딩으로 넘긴다.
세션 설정이 필요하면 조회 전에 실행한다.
cur.execute("SET hive.execution.engine=tez")
cur.execute("SET tez.queue.name=analytics")
import pandas as pd
df = pd.read_sql("SELECT * FROM db.tbl LIMIT 1000", conn)
큰 결과를 한 번에 받으면 클라이언트 메모리가 터진다. fetchmany 로 나눠 받거나 쿼리에서 먼저 줄인다.
| 증상 | 확인할 것 |
|---|---|
Could not start SASL |
서버의 hive.server2.authentication 값과 클라이언트 auth 불일치 |
TTransportException 후 즉시 종료 |
전송 모드 불일치(binary vs http), 포트 오지정 |
GSSAPI ... No Kerberos credentials |
kinit 미수행 또는 티켓 만료 |
| 한글이 깨짐 | 클라이언트 로케일과 결과 디코딩. 파이썬 3 에서는 대부분 서버 쪽 데이터 인코딩 문제 |
HTTP 전송 모드로 붙을 때는 경로도 맞춰야 한다.
conn = hive.Connection(host="hs2-host", port=10001, username="analyst",
password="...", auth="LDAP",
thrift_transport=None)
(확인 필요 — PyHive 의 HTTP 전송 지원은 버전에 따라 제한이 있으므로, HTTP 모드가 필요하면 impyla 나 JDBC 계열 클라이언트를 검토한다.)
impyla 나 SQLAlchemy 방언을 함께 검토한다.with 문이나 try/finally 로 정리한다.