융무의 기술블로그
article thumbnail

Hive 메타스토어 데이터베이스 초기화 중에 발생한 'Table 'CTLGS' already exists' 오류는, Hive 메타스토어 스키마 초기화 과정 중 이미 존재하는 테이블에 대한 처리를 시도할 때 발생할 수 있습니다.

Error: Table 'CTLGS' already exists (state=42S01,code=1050)
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'CTLGS' already exists

에러를 확인해 보니 메타스토어 데이터베이스가 이미 일부 스키마 구조를 가지고 있었습니다.

mysql> select * from CTLGS;
+---------+------+--------------------------+--------------+
| CTLG_ID | NAME | DESC                     | LOCATION_URI |
+---------+------+--------------------------+--------------+
|       1 | hive | Default catalog for Hive | TBD          |
+---------+------+--------------------------+--------------+
1 row in set (0.00 sec)

데이터베이스를 삭제하고 다시 생성함으로써 이전 스키마와 관련된 모든 문제를 제거하고 새로운 스키마를 생성합니다.

mysql> DROP DATABASE test;
Query OK, 38 rows affected (0.64 sec)

mysql> CREATE DATABASE test;
Query OK, 1 row affected (0.01 sec)

hive metastore를 사용하기 위해 만든 CTLGS를 지우고 그다음에 metastore.xml 파일을 수정해 줍니다.

<property>
  <name>javax.jdo.option.ConnectionURL</name>
  <value>jdbc:mysql://mysql.mysql.svc.cluster.local:3306/test?createdatabaseifnotexist=true&useSSL=false</value>
</property>
  • javax.jdo.option.ConnectionURL 속성의 변경은 MySQL JDBC 연결 URL을 지정합니다. 여기서 createdatabaseifnotexist=true 옵션은 지정된 데이터베이스가 존재하지 않을 경우 자동으로 생성하도록 합니다. 이 옵션은 데이터베이스 초기화 과정에서 유용할 수 있습니다.

그다음 metastore.xml 파일에서 설정을 불러와 ConfigMap을 만들어줍니다.

kubectl create configmap metastore-cfg --from-file=metastore.xml -n hive

마지막으로 Hive 메타스토어의 스키마를 MySQL 데이터베이스에 초기화하기 위해 schematool -initSchema -dbType mysql 명령실행하면 됩니다.

kubectl get pods -n hive
NAME                    READY   STATUS      RESTARTS   AGE
hive-initschema-c2wtg   0/1     Completed   0          3h43m
profile

융무의 기술블로그

@융무

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!