ImpalaRuntimeException: Error making 'createTable' RPC to Hive Metastore:
CAUSED BY: MetaException: Got exception: org.apache.hadoop.security.AccessControlException
Permission denied: user=impala, access=WRITE, inode="/warehouse/tablespace/managed/hive/db.db"
Impala 는 테이블 생성 요청을 Hive Metastore 로 보내고, 디렉터리를 실제로 만드는 주체는 HMS 다. 오류의 user= 가 접속 사용자가 아니라 impala 나 hive 로 나오는 이유가 그것이다. 즉 Ranger 의 Impala 권한이 아니라 HDFS 쓰기 권한 문제다.
어느 경로인지는 inode= 가 알려 준다. 관리 테이블이면 managed 경로, 외부 테이블이면 LOCATION 으로 준 경로다.
hdfs dfs -ls -d /warehouse/tablespace/managed/hive/db.db
hdfs dfs -getfacl /warehouse/tablespace/managed/hive/db.db
데이터베이스가 어느 경로를 쓰는지는 Impala 에서 확인한다.
DESCRIBE DATABASE EXTENDED db;
warehouse 경로 — 소유자와 그룹을 서비스 계정으로 맞춘다.
sudo -u hdfs hdfs dfs -chown -R hive:hive /warehouse/tablespace/managed/hive/db.db
Ranger HDFS 정책 — Ranger 를 쓰면 POSIX 권한보다 정책이 우선한다. 해당 경로에 대해 hive · impala 에게 recursive 로 read/write/execute 를 주는 정책이 있는지 확인한다.
warehouse 밖 경로 — 외부 테이블을 /data/... 같은 곳에 만들 때 특히 잦다. 그 경로에 대한 HDFS 권한과 Ranger 정책을 따로 만들어야 한다.
오브젝트 스토리지 — LOCATION 이 s3a:// 라면 권한이 아니라 S3A 설정이 HMS 에 없는 경우가 많다. Impala 오브젝트 스토리지 연동 을 본다.
조치 후에는 캐시를 갱신한다.
INVALIDATE METADATA db.tbl;