Hive Metastore 가 쓰는 DB 접속 정보(사용자 · 비밀번호) 가 어디에 저장되는지, 그리고 MariaDB 10.6 을 백엔드로 쓸 때 스키마 초기화용 관리 계정과 서비스 런타임 계정을 분리해 만드는 방법을 정리한다.
접속 정보는 hive-site.xml 에 있다. Cloudera 계열은 /etc/hive/conf/hive-site.xml, 수동 설치는 $HIVE_HOME/conf/hive-site.xml 이다.
| 항목 | 설명 |
|---|---|
javax.jdo.option.ConnectionURL |
Metastore DB JDBC URL |
javax.jdo.option.ConnectionDriverName |
JDBC 드라이버 클래스 |
javax.jdo.option.ConnectionUserName |
DB 사용자명 |
javax.jdo.option.ConnectionPassword |
DB 비밀번호 |
grep -A1 "ConnectionPassword\|ConnectionUserName\|ConnectionURL" /etc/hive/conf/hive-site.xml
Credential Provider(JCEKS) 로 암호화 저장된 환경은 password 항목이 비어 있고 hadoop.security.credential.provider.path 가 jceks://file/... 를 가리킨다.
hadoop credential list -provider jceks://file/etc/hive/conf/hive.jceks
hadoop credential check javax.jdo.option.ConnectionPassword \
-provider jceks://file/etc/hive/conf/hive.jceks
Cloudera Manager 에서는 Hive 서비스 → Configuration 에서 "Hive Metastore Database Password" 를 검색한다.
Cloudera 권장 구성(transaction-isolation = READ-COMMITTED, utf8mb4, log_bin_trust_function_creators = 1, innodb_file_per_table = 1, max_allowed_packet = 32M) 은 그대로 두고 다음을 보완한다.
[server]
bind-address = <MARIADB_BIND_IP> # 기본은 전체 인터페이스. 운영망 IP 로 제한
lower_case_table_names = 0 # Linux 기본값. 바꾸지 않는다
# MariaDB 10.6 에서 query cache 는 deprecated. 쓰기가 잦은 Metastore 는 비활성
query_cache_type = 0
query_cache_size = 0
query_cache_limit = 0
# 긴 메타데이터 작업 대응
wait_timeout = 28800
interactive_timeout = 28800
net_read_timeout = 600
net_write_timeout = 600
hive_admin 은 schematool 초기화 · 업그레이드 · 백업용, hive 는 서비스가 일상적으로 쓰는 최소 권한 계정이다. 호스트 패턴은 '%' 대신 Metastore 호스트나 서브넷으로 제한한다.
-- Hive 3.x + MariaDB 10.6 조합은 latin1 이 호환성이 가장 좋다
CREATE DATABASE IF NOT EXISTS metastore DEFAULT CHARACTER SET latin1;
CREATE USER 'hive_admin'@'localhost' IDENTIFIED BY '${ADMIN_PASSWORD}';
CREATE USER 'hive_admin'@'<METASTORE_HOST>' IDENTIFIED BY '${ADMIN_PASSWORD}';
GRANT ALL PRIVILEGES ON metastore.* TO 'hive_admin'@'localhost';
GRANT ALL PRIVILEGES ON metastore.* TO 'hive_admin'@'<METASTORE_HOST>';
CREATE USER 'hive'@'<METASTORE_HOST>' IDENTIFIED BY '${RUNTIME_PASSWORD}';
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON metastore.* TO 'hive'@'<METASTORE_HOST>';
FLUSH PRIVILEGES;
SELECT User, Host, plugin FROM mysql.user WHERE User IN ('hive', 'hive_admin');
SHOW GRANTS FOR 'hive_admin'@'<METASTORE_HOST>';
SHOW GRANTS FOR 'hive'@'<METASTORE_HOST>';
방화벽은 Metastore 호스트만 3306 을 허용한다.
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="<METASTORE_HOST_IP>/32" port port="3306" protocol="tcp" accept'
firewall-cmd --reload
schematool -dbType mysql -initSchema \
-userName hive_admin \
-url "jdbc:mysql://<MARIADB_HOST>:3306/metastore?useSSL=false&useUnicode=true&characterEncoding=UTF-8"
-dbType mysql 은 MariaDB 에도 그대로 쓴다. 비밀번호는 명령행에 노출하지 말고 프롬프트나 ~/.mylogin.cnf(mysql_config_editor) 로 넣는다. hive-site.xml 에는 런타임 계정 hive 를 적고 파일 권한은 chmod 640, 소유자 hive:hive 로 둔다.