티나 개발 노트
소개 · 비교 Trino.Ado Hive ODBC

Trino.Ado 소개와 ODBC 연결과의 차이

C#에서 Hive 테이블을 읽는 방법은 크게 둘입니다. ODBC 드라이버로 HiveServer2에 붙거나, Trino.Ado로 Trino에 붙거나. 둘 다 결국 같은 Hive 테이블을 읽지만, 거쳐 가는 길과 준비할 것, 코드에서 신경 쓸 점이 꽤 다릅니다.

1Trino와 Trino.Ado

Trino는

Trino는 여러 데이터 저장소를 SQL 하나로 조회하는 분산 SQL 엔진입니다(예전 이름 PrestoSQL). Hive 테이블은 Hive 커넥터(카탈로그)를 통해 읽습니다. Hive 메타스토어에서 테이블 정보를 받고, HDFS·S3의 파일을 Trino가 직접 읽기 때문에 HiveServer2를 거치지 않습니다. 그래서 쿼리에서 hive.default.sample_table처럼 카탈로그.스키마.테이블로 부르고, 연결할 때 기본 카탈로그를 hive로 지정합니다.

Trino.Ado는

Trino.Ado는 C#에서 Trino에 붙는 ADO.NET 클라이언트입니다. SqlConnection, OdbcConnection을 쓰던 방식 그대로 TrinoConnection → TrinoCommand → IDataReader로 씁니다.

정체
Trino 공식 C# 클라이언트(trino-csharp-client)를 포크해 NuGet에 배포한 패키지. 공식 Trino.Data.ADO는 nuget.org에 없습니다.
구성
Trino.Core(Trino REST API 통신) + Trino.Ado(ADO.NET 래퍼). Trino.Ado를 설치하면 Trino.Core가 같이 들어옵니다.
대상
.NET Standard 2.0 · .NET 8. .NET Framework는 4.7.2 이상(4.8 권장).
통신
Trino 코디네이터에 HTTP(S)로 쿼리를 보내고 결과를 페이지 단위로 받아 옵니다.
버전
1.1.0 (2026-07-30 공개). 라이선스 Apache-2.0.
가장 짧은 사용 예
var props = new TrinoConnectionProperties
{
    Server = new Uri("http://trino-server01:8080"),
    Catalog = "hive",
    Schema = "default",
    User = "etl_user"
};
using (var conn = new TrinoConnection(props))
using (var cmd = new TrinoCommand(conn, "SELECT * FROM sample_table LIMIT 10"))
{
    conn.Open();
    using (IDataReader reader = cmd.ExecuteReader())
        while (reader.Read()) Console.WriteLine(reader.GetValue(0));
}

실무용 전체 코드(App.config, 타입 변환, DataTable 채우기, 적재)는 C#에서 Trino(Hive 카탈로그) 조회하기에 있습니다.

2연결 경로가 다릅니다

가장 큰 차이는 누가 쿼리를 실행하느냐입니다. ODBC는 HiveServer2가 Hive 엔진(Tez·MapReduce 등)으로 실행하고, Trino.Ado는 Trino가 직접 파일을 읽어 실행합니다.

Trino.AdoNuGet 패키지만으로 연결

C# 프로그램Trino.Ado (프로그램과 함께 배포)
Trino 코디네이터 → 워커Trino SQL로 실행
Hive 메타스토어테이블 정보만 조회
HDFS · S3 (ORC·Parquet 파일)

Hive ODBCPC마다 드라이버 설치

C# 프로그램System.Data.Odbc
HiveServer2Thrift · 보통 10000
Hive 엔진 (Tez·MapReduce 등)메타스토어로 테이블 확인
HDFS · S3 (같은 파일)

두 길 모두 마지막에는 같은 HDFS·S3의 같은 테이블 파일을 읽습니다. 그래서 같은 테이블이라면 결과 데이터도 같습니다.

3한눈에 비교

항목Trino.AdoHive ODBC
붙는 곳Trino 코디네이터HiveServer2
통신HTTP(S) RESTThrift (binary·http)
설치NuGet 패키지 — 프로그램 폴더에 같이 배포드라이버 MSI를 실행할 PC·서버마다 설치
32/64비트신경 쓸 필요 없음 (관리 코드)프로그램·드라이버·DSN 비트 수가 같아야 함 (IM002 오류)
.NET Framework4.7.2 이상 (4.8 권장)오래된 버전도 가능 (예제는 4.5)
SQL 문법Trino SQL (ANSI에 가까움)HiveQL
파티션 덮어쓰기INSERT OVERWRITE 없음 → 세션 속성 hive.insert_existing_partitions_behaviorINSERT OVERWRITE ... PARTITION 그대로
인증사용자 이름, 비밀번호(BasicAuth, https만), JWT·OAuth 등없음·사용자 이름·LDAP·Kerberos·SAML (AuthMech)
프록시HTTP라서 Windows 프록시 영향을 받음 → 401이면 bypasslistThrift binary는 HTTP 프록시와 무관
DataTable 채우기DataTable.Load 오류 → 직접 채움, DataAdapter 없음OdbcDataAdapter.Fill로 바로
값 타입decimal·array·map 등이 Trino 전용 타입 → 변환 필요드라이버가 일반 .NET 타입으로 변환
영향받은 행 수처리한 행 수(ProcessedRows) — 실제와 다를 수 있음대부분 -1 — 따로 COUNT로 확인
타임아웃TrinoConnectionProperties.TimeoutCommandTimeout (기본 30초)
설정 위치코드·App.config (연결 속성)DSN(ODBC 관리자) 또는 연결 문자열
만든 곳오픈소스 커뮤니티 포크 (Apache-2.0)Cloudera 등 배포판 업체 드라이버

4코드는 얼마나 다를까

ADO.NET 모양은 같아서 흐름은 거의 그대로입니다. 바뀌는 건 연결 객체와 SQL 문법, 그리고 결과를 받는 부분입니다.

전일 파티션 다시 적재 — Trino
// 덮어쓰기는 문법이 아니라 세션 속성으로
props.SessionProperties = new Dictionary<string, string>
    { { "hive.insert_existing_partitions_behavior", "OVERWRITE" } };

using (var conn = new TrinoConnection(props))
using (var cmd = new TrinoCommand(conn,
    "INSERT INTO mart.daily_sales " +
    "SELECT store_id, SUM(amount), COUNT(*), dt FROM raw.orders " +
    "WHERE dt = '20261027' GROUP BY store_id, dt"))
{
    conn.Open();
    cmd.ExecuteNonQuery();
}

Trino의 Hive 테이블 INSERT는 파티션 컬럼(dt)을 SELECT 맨 뒤에 둡니다.

5무엇을 고를까

회사 클러스터에 무엇이 떠 있는지가 먼저입니다. Trino가 없으면 Trino.Ado는 쓸 수 없고, HiveServer2를 닫아 둔 곳이면 ODBC를 쓸 수 없습니다. 둘 다 있다면 아래 기준으로 고르세요.

Trino.Ado가 맞는 경우

  • 배포 서버마다 드라이버를 설치하기 어렵다 (권한·보안 심사)
  • 32/64비트 문제를 겪고 싶지 않다
  • 조회·집계를 빠르게 돌리는 일이 많다
  • 여러 카탈로그(Hive 외 다른 DB)를 한 SQL로 묶어야 한다
  • .NET Framework 4.7.2 이상이다

Hive ODBC가 맞는 경우

  • 회사에 Trino가 없고 HiveServer2만 있다
  • 기존 HiveQL 배치(INSERT OVERWRITE 등)를 그대로 옮긴다
  • .NET Framework 4.5처럼 오래된 프로그램이다
  • OdbcDataAdapter로 DataTable을 바로 채우는 코드가 많다
  • Kerberos 인증을 Windows 드라이버 설정으로 처리하고 싶다
💡

같은 테이블을 두 방식으로 모두 읽을 수 있다면, 조회·리포트는 Trino.Ado, HiveQL 그대로 돌려야 하는 기존 적재 배치는 ODBC처럼 나눠 쓰는 것도 방법입니다. 어느 쪽이 빠른지는 클러스터 구성과 쿼리에 따라 다르니, 실제 쿼리로 한 번 재 보고 정하세요.

다음에 읽을 글