SAS/ACCESS Interface to Hadoop 으로 Hive 테이블을 만드는 데까지는 성공하는데, 데이터를 밀어 넣는 단계에서 실패한다.
HADOOP: building staging file: /SAS_WORK/blhdp-494d43e1-....dlv
ERROR: java.net.UnknownHostException: Invalid host name: local host is: (unknown);
destination host is: "nn1.example.com":8020;
SAS 트레이스는 길지만 실패 지점은 분명하다.
HADOOP: Successful connection made, connection id 0 이 찍혔다면 HiveServer2 접속(10000 포트)과 Kerberos 인증은 성공한 것이다. 여기서 네트워크·hosts·hive-site.xml 문제는 일단 배제된다.
Exit yoeopen with FAILURE 앞의 DESCRIBE FORMATTED ... 실패는 테이블 존재 여부를 확인하는 탐색 호출이다. 아직 만들지 않은 테이블에 대해서는 정상적으로 실패하므로 원인이 아니다.
실제 실패는 그 뒤 building staging file 다음이다. SAS 는 대량 적재 시 HDFS_TEMPDIR 경로에 스테이징 파일을 만들고 HiveServer2 가 아니라 NameNode(8020)에 직접 연결한다. 즉 이 단계에서만 HDFS 클라이언트가 동작한다.
local host is: (unknown) 이 핵심이다. 목적지가 아니라 SAS 서버 자신의 호스트명을 해석하지 못했다는 뜻이다. 클러스터 노드들을 /etc/hosts 에 잘 넣어 두었어도, SAS 서버 자신의 FQDN 이 빠져 있으면 이 오류가 난다. Kerberos 가 걸린 HDFS 클라이언트는 자기 호스트명을 얻어야 하므로 여기서 멈춘다.
확인은 간단하다.
hostname -f
getent hosts $(hostname)
getent hosts $(hostname -f)
hostname -f 가 오류를 내거나 getent 가 아무것도 돌려주지 않으면 그것이 원인이다. /etc/hosts 에 자기 자신의 IP 와 FQDN · 짧은 이름을 넣는다.
10.20.30.40 sasvp01l.example.com sasvp01l
NameNode 두 대의 주소가 번갈아 나온다면 HA 네임서비스를 쓰고 있다는 뜻이다. SAS_HADOOP_CONFIG_PATH 에 둔 hdfs-site.xml 이 클러스터의 현행 설정과 같은지 확인한다. 설정 파일을 복사한 뒤 클러스터에서 HA 를 바꿨다면 옛 정보를 보고 있는 것이다.
HDFS_TEMPDIR 로 지정한 경로(/SAS_WORK)가 HDFS 에 존재하고 접속 계정이 쓸 수 있어야 한다.
hdfs dfs -ls -d /SAS_WORK
Kerberos 환경이면 SAS 프로세스에 유효한 티켓이 있어야 한다. 접속은 principal=hive/_HOST@REALM 으로 되지만, HDFS 직접 접근은 실행 계정의 티켓을 쓴다.