JVM 이 필요 없고 설치가 가볍다. 기본 경로다.
pip install impyla thrift-sasl
from impala.dbapi import connect
conn = connect(
host='impala-lb.example.internal',
port=21050,
use_ssl=True,
ca_cert='/etc/pki/tls/certs/ca.pem',
auth_mechanism='LDAP',
user='app_user',
password=${MASKED}'IMPALA_PASSWORD'],
)
cur = conn.cursor()
cur.execute('SELECT * FROM db.tbl LIMIT 10')
rows = cur.fetchall()
cols = [d[0] for d in cur.description]
cur.close()
conn.close()
auth_mechanism 은 NOSASL · PLAIN · LDAP · GSSAPI 를 받는다. Kerberos 면 GSSAPI 이고 유효한 티켓이 있어야 한다. LDAP · PLAIN 인증에는 thrift-sasl 패키지가 필요하다.
HTTP 전송 모드(28000 포트)를 쓰는 클러스터라면 전송 방식을 지정한다.
conn = connect(
host='impala-lb.example.internal',
port=28000,
use_http_transport=True,
http_path='cliservice',
use_ssl=True,
auth_mechanism='LDAP',
user='app_user',
password=${MASKED}'IMPALA_PASSWORD'],
)
pandas 로 바로 받을 수 있다.
import pandas as pd
df = pd.read_sql('SELECT * FROM db.tbl LIMIT 100', conn)
이미 JDBC 드라이버로 운영 중이거나, Cloudera 드라이버의 옵션(인증서 검증 우회 등)이 필요할 때 쓴다. JVM 과 jar 가 필요하다.
import os
import jaydebeapi
jar_dir = '/opt/jdbc/impala/'
jars = [jar_dir + f for f in os.listdir(jar_dir) if f.endswith('.jar')]
url = ('jdbc:impala://impala-lb.example.internal:21050/default'
';AuthMech=3;SSL=1')
conn = jaydebeapi.connect(
'com.cloudera.impala.jdbc.Driver',
url,
['app_user', os.environ['IMPALA_PASSWORD']],
jars,
)
No suitable driver found for jdbc:... 는 드라이버 클래스가 로드되지 않았다는 뜻이다. 클래스 이름 오타, jar 경로 누락, 또는 JVM 이 이미 떠 있는 상태에서 클래스패스를 바꾼 경우다. JPype 는 JVM 을 한 번만 띄우므로 주피터 커널에서 경로를 바꿨다면 커널을 재시작한다.
자격 증명은 코드에 쓰지 않고 환경변수나 비밀 저장소에서 읽는다.
| 상황 | 선택 |
|---|---|
| 컨테이너·경량 환경, JVM 없음 | impyla |
| Kerberos 티켓으로 접속 | impyla (GSSAPI) |
| Cloudera 드라이버 고유 옵션 필요 | jaydebeapi |
| 기존 자바 스택과 접속 문자열 공유 | jaydebeapi |