Trino + BI 도구 연동 — Superset, Tableau, 그리고 JDBC/Python 클라이언트
Trino 를 BI 도구·애플리케이션과 연결하는 실전 가이드. JDBC/ODBC 드라이버와 연결 URL, Superset·Tableau 연동, Python(trino, SQLAlchemy) 클라이언트, 인증(LDAP/OAuth2) 연결, 그리고 대시보드 폭주로부터 클러스터를 보호하는 운영 패턴까지.
Trino 를 아무리 잘 튜닝해도, 사용자는 결국 BI 도구나 애플리케이션을 통해 만납니다. 연결 설정이 어긋나면 "느리다", "끊긴다", "인증이 안 된다"는 민원으로 돌아옵니다. 반대로 연결·인증·운영 패턴만 제대로 잡으면, Trino 는 Superset·Tableau 같은 도구의 강력한 백엔드가 됩니다.
이 글은 Trino 를 BI 도구·클라이언트와 연결하는 실전 방법을 정리합니다 — JDBC/ODBC 드라이버, Superset·Tableau 연동, Python 클라이언트, 인증 연결, 그리고 대시보드 트래픽으로부터 클러스터를 지키는 운영 패턴까지.
1. 연결의 기본 — 드라이버와 URL
Trino 클라이언트는 모두 코디네이터의 HTTP(S) 엔드포인트로 연결합니다.
| 클라이언트 | 연결 방식 |
|---|---|
| BI 도구(Superset, Tableau, DBeaver 등) | JDBC 또는 ODBC 드라이버 |
| 애플리케이션 | Python/Go/Node 클라이언트, JDBC |
| CLI | trino CLI |
JDBC URL 구조
jdbc:trino://<host>:<port>/<catalog>/<schema>?<속성># 평문 (PoC)
jdbc:trino://trino:8080/iceberg/analytics
# TLS + LDAP 인증 (프로덕션)
jdbc:trino://trino:8443/iceberg/analytics?SSL=true&user=alice&password=...| 속성 | 의미 |
|---|---|
SSL=true | HTTPS 연결 |
user / password | LDAP/파일 비밀번호 인증 |
SSLTrustStorePath | 사내 CA 인증서 신뢰 |
source | 클라이언트 식별(중요 — 아래 6장) |
clientTags | Resource Group 셀렉터용 태그 |
핵심 팁:
source와clientTags를 반드시 설정하세요. Resource Group 셀렉터가 이 값으로 쿼리를 분류하므로, "대시보드 트래픽을 dashboard 그룹에 격리"하는 운영이 여기서 시작됩니다. (Resource Group 은 별도 글 "Trino 메모리 관리와 Resource Groups"에서 다뤘습니다.)
2. Apache Superset 연동
Superset 은 SQLAlchemy 기반이라 Trino 방언(sqlalchemy-trino/trino 패키지)으로 연결합니다.
연결 문자열(SQLAlchemy URI)
# 기본
trino://alice@trino:8080/iceberg
# TLS + 비밀번호 인증
trino://alice:password@trino:8443/iceberg?protocol=https설정 흐름:
- Superset 의 Database Connections 에서 위 URI 입력.
iceberg처럼 카탈로그를 기본 DB 로 지정하면, 스키마/테이블이 자동 탐색됩니다.- 여러 카탈로그를 쓰려면 DB 커넥션을 카탈로그별로 추가하거나, 쿼리에서
카탈로그.스키마.테이블로 명시합니다.
Superset 운영 팁
- 결과 캐시: Superset 자체 캐시(Redis 등)를 켜면 동일 차트 재조회 시 Trino 를 안 때립니다. Trino 에 결과 캐시가 없으므로(별도 글 "Trino 캐싱 전략" 참고), BI 도구 캐시가 사실상의 결과 캐시 역할을 합니다.
- Async 쿼리: Celery 워커로 비동기 실행을 구성하면 긴 쿼리가 웹 워커를 묶지 않습니다.
- Row limit: 차트의 기본 행 제한을 합리적으로 둬서 실수성 대용량 fetch 를 막습니다.
3. Tableau 연동
Tableau 는 Starburst/Trino 커넥터 또는 JDBC/ODBC 로 연결합니다.
- Live vs Extract: Live 연결은 매 조작마다 Trino 를 때립니다. 대시보드 사용자가 많으면 부하가 큽니다. Extract(추출) 로 주기적 스냅샷을 Tableau 서버에 두면 Trino 부하가 크게 줄어듭니다.
- 인증: TLS + LDAP/OAuth2 를 드라이버 옵션으로 설정. SSO 환경이면 OAuth2 연결을 구성합니다.
- 사용자 정보 전달: 연결 시
source/clientTags를 지정해 Tableau 트래픽을 식별·격리합니다.
| 모드 | Trino 부하 | 신선도 | 적합 |
|---|---|---|---|
| Live | 높음(매 조작) | 실시간 | 소수 사용자·실시간 필요 |
| Extract | 낮음(주기 추출) | 추출 시점 | 다수 사용자·대시보드 |
일반 원칙: 사용자가 많은 운영 대시보드는 사전 집계 테이블 + Extract 조합이, 소수 분석가의 탐색적 분석은 Live 가 적합합니다.
4. Python 클라이언트
애플리케이션·데이터 파이프라인에서는 공식 trino 파이썬 패키지를 씁니다.
import trino
conn = trino.dbapi.connect(
host="trino",
port=8443,
user="alice",
catalog="iceberg",
schema="analytics",
http_scheme="https",
auth=trino.auth.BasicAuthentication("alice", "password"), # LDAP
source="etl-pipeline", # Resource Group 식별
client_tags=["batch"],
)
cur = conn.cursor()
cur.execute("""
SELECT event_type, count(*) AS cnt
FROM events
WHERE event_time >= TIMESTAMP '2026-06-01 00:00:00 UTC'
GROUP BY event_type
""")
for row in cur.fetchall():
print(row)SQLAlchemy / pandas
from sqlalchemy import create_engine
import pandas as pd
engine = create_engine("trino://alice@trino:8443/iceberg?protocol=https")
df = pd.read_sql("SELECT * FROM analytics.daily_active_users", engine)주의:
pd.read_sql("SELECT * FROM huge_table")처럼 거대 결과를 통째로 메모리에 올리지 마세요. WHERE·LIMIT 으로 줄이거나, 서버사이드 집계 후 작은 결과만 가져오는 것이 원칙입니다.
5. 인증 연결 정리
클러스터에 켜둔 인증 방식(별도 글 "Trino 보안 완전 가이드" 참고)에 맞춰 클라이언트를 설정합니다.
| 클러스터 인증 | JDBC | Python |
|---|---|---|
| LDAP/파일 (PASSWORD) | user+password, SSL=true | BasicAuthentication |
| OAuth2 / OIDC | 브라우저 또는 외부 토큰 | OAuth2Authentication |
| Kerberos | KerberosPrincipal 등 | KerberosAuthentication |
| mTLS(인증서) | 클라이언트 키스토어 | 인증서 옵션 |
거의 모든 인증이 TLS 를 전제로 하므로(평문 비밀번호 금지), 클라이언트에서 SSL=true/http_scheme=https 와 트러스트스토어(사내 CA)를 함께 설정해야 합니다.
6. 대시보드 트래픽으로부터 클러스터 보호하기
BI 연동에서 가장 흔한 사고는 대시보드 자동 새로고침·동시 사용자 폭증이 클러스터를 마비시키는 것입니다. 방어책:
6.1 source/clientTags 로 격리
Superset → source=superset → Resource Group: global.dashboard
Tableau → source=tableau → Resource Group: global.dashboard
ETL → source=etl-pipeline→ Resource Group: global.batch
분석가 CLI→ (기본) → Resource Group: global.adhoc대시보드 그룹에 동시성·메모리·큐 한도를 두면, 대시보드가 아무리 몰려도 배치·임시분석 자원을 침범하지 못합니다.
6.2 BI 도구 캐시 + 사전 집계
- Superset/Tableau 의 캐시를 켜서 동일 조회 반복을 흡수.
- 무거운 집계는 Materialized View 나 일배치 요약 테이블로 미리 계산해, 대시보드는 작은 테이블만 조회. (별도 글 "Trino 캐싱 전략" 참고.)
6.3 가드레일
- 클러스터:
query.max-scan-physical-bytes로 실수성 대용량 스캔 차단. - BI 도구: 차트 row limit, 쿼리 timeout 설정.
7. 연동 체크리스트
- 프로덕션은 TLS(
SSL=true/https) + 사내 CA 트러스트스토어 - 인증 방식에 맞는 클라이언트 설정(LDAP/OAuth2/Kerberos)
- 모든 클라이언트에
source/clientTags지정 - source 기반 Resource Group 셀렉터로 dashboard/batch/adhoc 격리
- BI 도구 결과 캐시 활성화
- 무거운 집계는 사전 집계 테이블/Materialized View
- Tableau 다수 사용자는 Extract 모드 검토
- 차트 row limit·timeout, 클러스터 스캔 가드레일
8. 정리
| 대상 | 연결 | 운영 포인트 |
|---|---|---|
| Superset | SQLAlchemy trino:// | 자체 캐시 + async + source 태그 |
| Tableau | Trino 커넥터/JDBC | Extract vs Live, source 식별 |
| Python 앱 | trino dbapi / SQLAlchemy | 대용량 fetch 금지, source 지정 |
| 모든 클라이언트 | JDBC/ODBC + TLS | 인증·트러스트스토어·clientTags |
Trino 와 BI 도구 연동의 핵심은 두 가지입니다. 첫째, TLS + 인증을 클라이언트까지 일관되게 설정하는 것. 둘째, source/clientTags 로 트래픽을 식별해 Resource Group 으로 격리하고, BI 캐시·사전 집계로 클러스터 부하를 흡수하는 것. 이 운영 패턴이 갖춰지면, 대시보드 사용자가 늘어도 분석·배치 워크로드를 안정적으로 지키면서 Trino 를 전사 BI 백엔드로 확장할 수 있습니다.
이 글은 Trino 440번대 기준으로 작성되었습니다. BI 도구 연동이나 대시보드 백엔드 아키텍처 설계가 필요하시면 언제든 문의해 주세요.
— Data Dynamics 엔지니어링 팀