📗HMS 프로비저닝 - 도커 환경 - STANDALONE
HiveServer2(HS2)는 기본적으로 Apache Derby를 Metastore DB로 사용한다.
하지만 Derby는 기본적으로 싱글 유저 모드(single-user mode) 로 동작하기 때문에 HiveServer2가 실행 중이면 직접 접근이 제한될 수 있다. lock 파일을 해결하여 이 문제를 해결할 수 있다.
🏳️🌈 [궁금한점]
🔗[목차]
데이터베이스 라이브러리를 저장할 위치를 ~/hive/db-derby-10.14.2.0-bin/lib 로 잡고, 라이브러리를 다운받아 위치시킨다.
apt update && apt install -y wget
apt update && apt install -y tar
mkdir hive
cd hive
sudo wget https://downloads.apache.org/db/derby/db-derby-10.14.2.0/db-derby-10.14.2.0-bin.tar.gz
sudo tar -xvzf db-derby-10.14.2.0-bin.tar.gz
메타 저장소로 사용할 derby 라이브러리 위치를 확인한다.
cd db-derby-10.14.2.0-bin
cd lib
ubuntu@DESKTOP-SCOK45O:~/hive/db-derby-10.14.2.0-bin/lib$ pwd
/home/ubuntu/hive/db-derby-10.14.2.0-bin/lib
ubuntu@DESKTOP-SCOK45O:~/hive/db-derby-10.14.2.0-bin/lib$ ls
derby.jar derbyLocale_cs.jar derbyLocale_fr.jar derbyLocale_ja_JP.jar derbyLocale_pt_BR.jar derbyLocale_zh_TW.jar derbyoptionaltools.jar
derby.log derbyLocale_de_DE.jar derbyLocale_hu.jar derbyLocale_ko_KR.jar derbyLocale_ru.jar derbyclient.jar derbyrun.jar
derby.war derbyLocale_es.jar derbyLocale_it.jar derbyLocale_pl.jar derbyLocale_zh_CN.jar derbynet.jar derbytools.jar
~/hive/hs2/hive-site.xml에 아래 속성을 추가한다. 로컬 위의 컨테이너 명이 hms 임에 유의한다.
``` xml
<property>
<name>hive.metastore.uris</name>
<value>thrift://hms:9083</value>
</property>
단일 도커 이미지에 hiver server 와 hms, 저장소인 derby가 포함되어 설치된다.
docker network create mynetwork
d run -d -p 10000:10000 -p 10002:10002 --env SERVICE_NAME=hiveserver2 \
--env SERVICE_OPTS="-Dhive.metastore.uris=thrift://hms:9083" \
--env IS_RESUME="true" \
-v ~/hive/hs2/hive-site.xml:/opt/hive/conf/hive-site.xml \
--network mynetwork \
--name hs2 apache/hive:4.0.1
docker run -d -p 9083:9083 --env SERVICE_NAME=metastore \
-v ~/hive/db-derby-10.14.2.0-bin/lib:/opt/hive/derby/lib/ \
--network mynetwork \
--name hms apache/hive:4.0.1
d exec -it hms bash
hive@b29bce10867a:/opt/hive$ ls derby/lib/
derby.jar derbyLocale_de_DE.jar derbyLocale_hu.jar derbyLocale_ko_KR.jar derbyLocale_ru.jar derbyclient.jar derbyrun.jar
derby.war derbyLocale_es.jar derbyLocale_it.jar derbyLocale_pl.jar derbyLocale_zh_CN.jar derbynet.jar derbytools.jar
derbyLocale_cs.jar derbyLocale_fr.jar derbyLocale_ja_JP.jar derbyLocale_pt_BR.jar derbyLocale_zh_TW.jar derbyoptionaltools.jar
hive@b29bce10867a:/opt/hive$ ls -l /opt/hive/metastore_db
total 36
-rw-r--r-- 1 hive hive 608 Jun 1 08:58 README_DO_NOT_TOUCH_FILES.txt
-rw-r--r-- 1 hive hive 38 Jun 1 09:03 db.lck
-rw-r--r-- 1 hive hive 4 Jun 1 09:03 dbex.lck
drwxr-xr-x 2 hive hive 4096 Jun 1 09:03 log
drwxr-xr-x 2 hive hive 12288 Jun 1 08:58 seg0
-rw-r--r-- 1 hive hive 898 Jun 1 08:58 service.properties
drwxr-xr-x 2 hive hive 4096 Jun 1 09:03 tmp
hive@b29bce10867a:/opt/hive$ rm -f /opt/hive/metastore_db/db.lck
hive@b29bce10867a:/opt/hive$ rm -f /opt/hive/metastore_db/dbex.lck
hive@b29bce10867a:/opt/hive$ java -jar /opt/hive/derby/lib/derbyrun.jar ij
ij version 10.14
ij> CONNECT 'jdbc:derby:/opt/hive/metastore_db';
SELECT * FROM TBLS;
SELECT * FROM DBS;
ij> select name, db_location_uri from dbs;
NAME |DB_LOCATION_URI
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
default |file:/opt/hive/data/warehouse
1 row selected
SELECT * FROM COLUMNS_V2;
새로운 데이터베이스
mydb를 HiveQL로 생성
- 신규창에서 hs2 beeline 실행
docker exec -it hs2 beeline -u jdbc:hive2://localhost:100000: jdbc:hive2://localhost:10000> create database mydb; INFO : Compiling command(queryId=hive_20250601081454_35b59e66-95de-49a4-a8c7-f21cf402791d): create database mydb INFO : Semantic Analysis Completed (retrial = false) INFO : Created Hive schema: Schema(fieldSchemas:null, properties:null) INFO : Completed compiling command(queryId=hive_20250601081454_35b59e66-95de-49a4-a8c7-f21cf402791d); Time taken: 0.952 seconds INFO : Concurrency mode is disabled, not creating a lock manager INFO : Executing command(queryId=hive_20250601081454_35b59e66-95de-49a4-a8c7-f21cf402791d): create database mydb INFO : Starting task [Stage-0:DDL] in serial mode INFO : Completed executing command(queryId=hive_20250601081454_35b59e66-95de-49a4-a8c7-f21cf402791d); Time taken: 0.067 seconds No rows affected (1.306 seconds)
0: jdbc:hive2://localhost:10000> show databases;
+----------------+
| database_name |
+----------------+
| default |
| mydb |
+----------------+
2 rows selected (0.028 seconds)
### 메타 데이터 확인
> ### 메타저장소 데이터에서 신규 데이터베이스 `mydb` 레코드 확인
derby에서 beeline 으로 만든 새로운 데이터베이스 mydb가 테이블에 삽입되었음을 확인한다. 데이터는 바로 확인이 안된다. 콘솔에 다시 접속해서 확인한다. 기본 데이터베이스인 default외 mydb가 생성되어 있음을 확인한다.
``` bash
hive@a1acad370e0b:/opt/hive$ java -jar /opt/hive/derby/lib/derbyrun.jar ij
ij version 10.14
ij> SELECT * FROM DBS;
IJ ERROR: Unable to establish connection
ij> CONNECT 'jdbc:derby:/opt/hive/metastore_db';
ij> SELECT * FROM DBS;
DB_ID |DESC |DB_LOCATION_URI |NAME |OWNER_NAME |OWNER_TYPE|CTLG_NAME |CREATE_TIME|DB_MANAGED_LOCATION_URI |TYPE |DATACONNECTOR_NAME |REMOTE_DBNAME
---------------------------------------------------------------------------------------------
1 |Default Hive database |file:/opt/hive/data/warehouse |default |public |ROLE |hive |1743397677 |NULL |NATIVE |NULL |NULL
2 |NULL |file:/opt/hive/data/warehouse/mydb.db |mydb |hive |USER |hive |1743398117 |NULL |NATIVE |NULL |NULL
2 rows selected
ubuntu@DESKTOP-SCOK45O:~$ docker exec -it hms bash
hive@5ce2a3f8c1c4:/opt/hive$ rm -f /opt/hive/metastore_db/db.lck
hive@5ce2a3f8c1c4:/opt/hive$ rm -f /opt/hive/metastore_db/dbex.lck
java -jar /opt/hive/derby/lib/derbyrun.jar ij
ij version 10.14
ij> CONNECT 'jdbc:derby:/opt/hive/metastore_db';
ij> select tbl_name from tbls;
TBL_NAME
--------------------------------------------------------------------------------------------------------------------------------
employees
1 row selected
/opt/hive/conf/hive-site.xml 파일에 데이터가 저장되는 위치가 명기되어 있다. 해당 위치에 가면 생성한 mydb 에 관한 데이터를 볼 수 있다. <property>
<name>hive.metastore.warehouse.dir</name>
<value>/opt/hive/data/warehouse</value>
</property>
hive@b29bce10867a:/opt/hive$ ls /opt/hive/data/warehouse
employees