CREATE DATABASE sales
COMMENT 'sales mart'
LOCATION '/warehouse/tablespace/external/hive/sales.db';
LOCATION 은 그 데이터베이스에 만들어지는 테이블의 기본 상위 경로가 된다. Hive 3 이상에서는 관리 테이블과 외부 테이블의 경로가 나뉘므로 MANAGEDLOCATION 을 따로 줄 수 있다.
CREATE DATABASE sales
LOCATION '/warehouse/tablespace/external/hive/sales.db'
MANAGEDLOCATION '/warehouse/tablespace/managed/hive/sales.db';
이미 만든 데이터베이스의 경로는 바꿀 수 있지만, 기존 테이블의 데이터는 따라 움직이지 않는다. 이후 새로 만드는 테이블에만 적용된다.
ALTER DATABASE sales SET LOCATION '/data/sales.db';
데이터베이스나 테이블 생성이 권한으로 막힐 때, Hive 정책과 HDFS 정책 중 어느 쪽에 걸렸는지 메시지로 구분한다.
HiveAccessControlException: Permission denied: user [xxx] does not have [CREATE] privilege on [sales] 는 Ranger 의 Hive 정책이다. Ranger UI 의 Hive 서비스 정책에서 해당 사용자·그룹에 create 권한을 준다.
AccessControlException: Permission denied: user=hive, access=WRITE, inode="/warehouse/..." 는 HDFS 쪽이다. 디렉터리를 실제로 만드는 주체는 사용자가 아니라 HiveServer2 · Metastore 가 쓰는 서비스 계정(보통 hive)이므로, 오류 메시지의 user 가 hive 로 나오는 경우가 많다. Ranger HDFS 정책이나 POSIX 권한에서 그 경로의 쓰기 권한을 확인한다.
hdfs dfs -ls -d /warehouse/tablespace/external/hive
sudo -u hdfs hdfs dfs -chown hive:hive /warehouse/tablespace/external/hive/sales.db
warehouse 밖의 경로(/data/...)를 LOCATION 으로 줄 때 이 오류가 특히 잦다. Ranger HDFS 정책은 warehouse 경로에 대해서만 기본 정책이 잡혀 있기 때문이다. 새 경로를 쓰기로 했다면 해당 경로에 대한 정책을 함께 만든다.
DESCRIBE DATABASE EXTENDED sales;
SHOW GRANT USER app_user ON DATABASE sales;