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
wget https://downloads.apache.org//db/derby/db-derby-10.14.2.0/db-derby-10.14.2.0-bin.tar.gz
tar -xvzf db-derby-10.14.2.0-bin.tar.gz
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
단일 도커 이미지에 hiver server 와 hms, 저장소인 derby가 포함되어 설치된다.
docker run -d -p 10000:10000 -p 10002:10002 --env SERVICE_NAME=hiveserver2 -v ~/hive/db-derby-10.14.2.0-bin/lib:/opt/hive/derby/lib/ --name hs2 apache/hive:4.0.1
ubuntu@DESKTOP-SCOK45O:~/hive/db-derby-10.14.2.0-bin/lib$ d exec -it hs2 bash
hive@a1acad370e0b:/opt/hive$ ls derby/lib/
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@a1acad370e0b:/opt/hive$ ls -l /opt/hive/metastore_db
total 36
-rw-r--r-- 1 hive hive 608 Mar 31 05:07 README_DO_NOT_TOUCH_FILES.txt
-rw-r--r-- 1 hive hive 38 Mar 31 05:07 db.lck
-rw-r--r-- 1 hive hive 4 Mar 31 05:07 dbex.lck
drwxr-xr-x 2 hive hive 4096 Mar 31 05:07 log
drwxr-xr-x 2 hive hive 12288 Mar 31 05:07 seg0
-rw-r--r-- 1 hive hive 898 Mar 31 05:07 service.properties
drwxr-xr-x 2 hive hive 4096 Mar 31 05:07 tmp
hive@a1acad370e0b:/opt/hive$ java -jar /opt/hive/derby/lib/derbyrun.jar ij
ij version 10.14
ij> CONNECT 'jdbc:derby:/opt/hive/metastore_db';
ERROR XJ040: Failed to start database '/opt/hive/metastore_db' with class loader sun.misc.Launcher$AppClassLoader@33909752, see the next exception for details.
ERROR XSDB6: Another instance of Derby may have already booted the database /opt/hive/metastore_db.
hive@a1acad370e0b:/opt/hive$ rm -f /opt/hive/metastore_db/db.lck
hive@a1acad370e0b:/opt/hive$ rm -f /opt/hive/metastore_db/dbex.lck
hive@a1acad370e0b:/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로 생성docker exec -it hs2 beeline -u jdbc:hive2://localhost:10000
0: jdbc:hive2://localhost:10000> create database mydb;
0: jdbc:hive2://localhost:10000> show databases;
+----------------+
| database_name |
+----------------+
| default |
| mydb |
+----------------+
2 rows selected (0.028 seconds)
mydb 레코드 확인derby에서 beeline 으로 만든 새로운 데이터베이스 mydb가 테이블에 삽입되었음을 확인한다. 데이터는 바로 확인이 안된다. 콘솔에 다시 접속해서 확인한다. 기본 데이터베이스인 default외 mydb가 생성되어 있음을 확인한다.
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
/opt/hive/conf/hive-site.xml 파일에 데이터가 저장되는 위치가 명기되어 있다. 해당 위치에 가면 생성한 mydb 에 관한 데이터를 볼 수 있다. <property>
<name>hive.metastore.warehouse.dir</name>
<value>/opt/hive/data/warehouse</value>
</property>
hive@61df7ffea323:/opt/hive$ ls /opt/hive/data/warehouse
mydb.db