Kudu 커넥터는 Trino 473(2025-03-19 릴리스)에서 삭제됐다. 현행 Trino 문서의 Kudu 커넥터 페이지는 "Connector removed" 로 넘어간다. 따라서 Trino 473 이상으로 올린 클러스터에서는 connector.name=kudu 카탈로그가 로드되지 않고, 기존 kudu 카탈로그를 쓰던 쿼리가 모두 깨진다.
배경은 Java 버전이다. Trino 가 Java 24 를 요구하게 되면서 Kudu 클라이언트가 그 위에서 동작하지 못했고, 커넥터 사용 사례가 많지 않아 유지하는 대신 제거하는 쪽으로 정리됐다. Kudu 쪽이 최신 Java 를 지원하고 기여가 이뤄지면 다시 들어올 여지는 있지만, 현재는 없다.
| Trino 버전 | Kudu 커넥터 |
|---|---|
| 472 이하 | 있음 |
| 473 이상 | 없음 |
업그레이드 계획이 있다면 Kudu 카탈로그를 쓰는 쿼리·배치를 먼저 조사한다. 반대로 Kudu 를 계속 Trino 로 조회해야 한다면 Trino 를 472 에 묶어 두어야 하고, 그만큼 보안 수정과 새 기능을 포기하게 된다.
# etc/catalog/kudu.properties
connector.name=kudu
kudu.client.master-addresses=kudu-master-01:7051,kudu-master-02:7051,kudu-master-03:7051
# 스키마를 Kudu 테이블 이름의 접두사로 흉내낼지. false 면 default 스키마 하나로 보인다
kudu.schema-emulation.enabled=false
Kudu 는 Impala 를 통해 만들어진 테이블을 Hive 메타스토어에도 등록하는 경우가 있지만, Trino 의 Kudu 커넥터는 메타스토어가 아니라 Kudu 마스터에서 직접 테이블 목록을 읽는다. 따라서 Trino 에 보이지 않으면 Kudu 자체에 테이블이 있는지부터 본다.
kudu table list kudu-master-01:7051
java.lang.UnsupportedOperationException:
getSubject is supported only if a security manager is allowed
Kudu 커넥터를 로드할 때 나는 대표적인 오류다. 원인은 Kerberos 설정이 아니라 JDK 의 Security Manager 폐기다. Kudu 클라이언트가 Subject.getSubject(AccessControlContext) 를 호출하는데, JDK 18 이후로 이 API 는 Security Manager 가 허용된 상태에서만 동작한다. Trino 가 도는 JDK 가 그 기준을 넘어서면서 호출이 거부되는 것이다.
jvm.config 에 다음 한 줄을 넣으면 그 호출이 다시 허용된다.
-Djava.security.manager=allow
javax.security.auth.useSubjectCredsOnly=false 나 jaas.conf 를 지정하는 것은 이 오류와 무관하다. 그쪽은 Kerberos 자격 증명을 찾는 경로에 대한 설정이고, 위 오류는 API 호출 자체가 막힌 것이다. 다만 이 옵션은 JDK 가 Security Manager 를 완전히 제거하면 더는 통하지 않는다. Kudu 커넥터가 473 에서 삭제된 것도 같은 흐름이다.
Kudu 커넥터가 있던 시절에도 Trino 에서 Kudu 테이블에 UPDATE 나 MERGE 를 거는 것은 제약이 많았다. Impala 커넥터에는 애초에 쓰기가 없다. 상태를 갱신해야 하는 테이블이라면 방법은 다음과 같다.
Impala 로 직접 처리한다. Kudu 테이블은 Impala 에서 UPSERT 가 된다. Trino 를 경유할 이유가 없는 작업이면 이쪽이 가장 단순하다.
-- Impala 에서
UPSERT INTO db2.tbl1
SELECT * FROM db1.tbl1 WHERE updttm >= now() - INTERVAL 1 DAYS;
Iceberg 로 옮긴다. Trino 에서 MERGE · UPDATE · DELETE 를 모두 쓸 수 있고, 커넥터 제거 같은 위험도 없다. Kudu 를 쓰던 이유가 "행 단위 갱신" 이었다면 Iceberg 가 그 자리를 대신한다.
MERGE INTO iceberg.sales.tbl1 t
USING iceberg.staging.tbl1 s
ON t.pk = s.pk
WHEN MATCHED THEN UPDATE SET initdttm = s.initdttm, enddttm = s.enddttm
WHEN NOT MATCHED THEN INSERT (pk, initdttm, enddttm) VALUES (s.pk, s.initdttm, s.enddttm);
전체를 다시 만든다. 갱신 대상이 테이블 대부분이라면 새로 만들고 바꿔 끼우는 편이 오히려 안전하고 빠르다. 절차는 Trino 에서 Hive 테이블을 덮어쓰기 와 같다.
Trino 커넥터 · Impala 의 UPDATE · UPSERT · MERGE · Kudu