hdfs://nameservice1/... 처럼 nameservice 이름으로 된 경로를 Trino 가 풀지 못하면 UnknownHostException: nameservice1 이 난다. Trino 는 nameservice 이름을 스스로 알지 못하고 Hadoop 설정 파일에서 읽으므로, 카탈로그에 core-site.xml 과 hdfs-site.xml 을 명시해야 한다.
connector.name=hive
hive.metastore.uri=thrift://metastore.example.net:9083
fs.hadoop.enabled=true
hive.config.resources=/etc/hadoop/conf/core-site.xml,/etc/hadoop/conf/hdfs-site.xml
지정한 파일은 코디네이터와 모든 워커에 같은 경로로 있어야 한다. hdfs-site.xml 안에는 nameservice 관련 항목이 온전히 들어 있어야 한다.
<property><name>dfs.nameservices</name><value>nameservice1</value></property>
<property><name>dfs.ha.namenodes.nameservice1</name><value>nn1,nn2</value></property>
<property><name>dfs.namenode.rpc-address.nameservice1.nn1</name><value>nn01.example.net:8020</value></property>
<property><name>dfs.namenode.rpc-address.nameservice1.nn2</name><value>nn02.example.net:8020</value></property>
<property><name>dfs.client.failover.proxy.provider.nameservice1</name><value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value></property>
NameNode 호스트 이름이 Trino 노드에서 실제로 풀리는지도 확인한다. Trino 는 DataNode 에도 직접 붙으므로 DataNode 호스트 이름까지 풀려야 한다. 한쪽 NameNode 주소를 직접 박아 넣어 회피하면 장애 조치가 동작하지 않으므로 운영에서는 쓰지 않는다.
No factory for location: hdfs://... 는 다른 오류다. 파일 시스템 지원이 켜져 있지 않은 경우이며 Trino 가 HDFS 경로를 열지 못할 때 를 본다.
메타스토어와 HDFS 는 인증 설정이 따로다. 둘 다 Kerberos 라면 둘 다 적는다.
connector.name=hive
hive.metastore.uri=thrift://metastore.example.net:9083
fs.hadoop.enabled=true
hive.config.resources=/etc/hadoop/conf/core-site.xml,/etc/hadoop/conf/hdfs-site.xml
# 메타스토어 인증
hive.metastore.authentication.type=KERBEROS
hive.metastore.service.principal=hive/_HOST@EXAMPLE.NET
hive.metastore.client.principal=trino@EXAMPLE.NET
hive.metastore.client.keytab=/etc/trino/trino.keytab
# HDFS 인증
hive.hdfs.authentication.type=KERBEROS
hive.hdfs.trino.principal=trino@EXAMPLE.NET
hive.hdfs.trino.keytab=/etc/trino/trino.keytab
_HOST 는 실제 호스트 이름으로 치환된다. keytab 은 모든 노드에 같은 경로로 두고 Trino 실행 계정만 읽을 수 있게 한다. JVM 에도 Kerberos 설정 파일을 알려 준다.
-Djava.security.krb5.conf=/etc/krb5.conf
배포 전에 keytab 자체가 유효한지 먼저 확인한다.
kinit -kt /etc/trino/trino.keytab trino@EXAMPLE.NET
klist
최종 사용자 권한으로 HDFS 에 접근하게 하려면 임퍼소네이션을 켠다. 이때 HDFS 쪽에서 hadoop.proxyuser.trino.* 가 허용돼 있어야 한다.
hive.hdfs.impersonation.enabled=true
org.apache.thrift.transport.TTransportException
Thrift 전송 계층에서 끊어진 것이라 원인이 넓다. 아래 순서로 좁힌다.
첫째, 주소와 도달 가능성이다. hive.metastore.uri 의 호스트·포트로 실제 연결되는지 Trino 노드에서 확인한다. 기본 포트는 9083 이다.
nc -vz metastore.example.net 9083
둘째, 메타스토어 프로세스가 살아 있는지 본다. 붙기는 하는데 응답 중에 끊어진다면 메타스토어 쪽 로그에 원인이 남는다. 메타스토어의 힙 부족이나 백엔드 DB 연결 고갈이 흔하다.
셋째, 인증 불일치다. 메타스토어가 Kerberos 를 요구하는데 Trino 가 NONE 으로 붙으면 핸드셰이크 도중에 끊어져 같은 예외로 보인다. 반대 경우도 마찬가지다. 양쪽 설정을 대조한다.
넷째, 응답이 느린 경우다. 파티션이 매우 많은 테이블에서는 메타스토어 호출이 오래 걸려 타임아웃으로 끊어진다. 이때만 타임아웃을 늘린다.
hive.metastore.thrift.client.read-timeout=60s
hive.metastore.thrift.client.connect-timeout=30s
이 값은 증상을 미루는 것이지 원인을 없애지 않는다. 파티션 수를 줄이거나 메타스토어 자원을 늘리는 쪽이 근본 대책이다.
Trino 커넥터 · Hive 메타스토어 모드와 Standalone