Metastore 관리
Metastore 관리 (AdminManual Metastore Administration)
Hive 테이블과 파티션의 모든 메타데이터는 Hive Metastore를 통해 접근돼요. 메타데이터는 JPOX ORM 솔루션(Data Nucleus)을 사용해 영속화되므로, 그것이 지원하는 어떤 데이터베이스든 Hive에서 사용할 수 있습니다.
출처: 문서
본문
참고: 이 페이지는 Hive 2.x 이하의 MetaStore만 다룹니다. 3.x 이상 릴리스는 AdminManual Metastore 3.0 Administration 문서를 참고하세요.
대부분의 상용 관계형 데이터베이스와 많은 오픈소스 데이터베이스가 지원돼요. 지원되는 데이터베이스 목록은 아래 섹션을 참고하세요. metastore의 E/R 다이어그램은 여기에서 볼 수 있습니다.
서로 다른 Hive 구성을 사용해 metastore 서버와 metastore 데이터베이스를 설정하는 방법은 두 가지가 있습니다.
- 메타데이터가 영속되는 metastore 데이터베이스 구성 옵션:
- Local/Embedded Metastore Database (Derby)
- Remote Metastore Database
- metastore 서버 구성 옵션:
- Local/Embedded Metastore Server
- Remote Metastore Server
기본 구성 파라미터 (Basic Configuration Parameters)
관련 구성 파라미터는 다음과 같습니다.
| Configuration Parameter | Description |
|---|---|
| javax.jdo.option.ConnectionURL | 메타데이터를 담은 데이터 스토어의 JDBC 연결 문자열 |
| javax.jdo.option.ConnectionDriverName | 메타데이터를 담은 데이터 스토어의 JDBC Driver 클래스 이름 |
| hive.metastore.uris | Hive가 원격 Metastore에 메타데이터 요청을 하기 위해 연결하는 URI 중 하나 (쉼표 구분 URI 목록) |
| hive.metastore.local | 로컬 또는 원격 metastore (Hive 0.10부터 제거. hive.metastore.uris가 비어 있으면 로컬 모드로 간주, 아니면 원격) |
| hive.metastore.warehouse.dir | 네이티브 테이블의 기본 위치 URI |
Hive metastore는 무상태(stateless)이므로 고가용성을 위해 여러 인스턴스를 둘 수 있어요. metastore 스키마 자동 생성/검증을 위해서는 다음 속성이 필요합니다.
<property>
<name>datanucleus.autoStartMechanism</name>
<value>SchemaTable</value>
</property>
기본 구성 (Default Configuration)
기본 구성은 유닛 테스트에서 사용하는 임베디드(embedded) metastore를 설정하며, 다음 섹션에서 설명해요. 더 실용적인 옵션은 이후 섹션에서 설명합니다.
Local/Embedded Metastore Database (Derby)
임베디드 metastore 데이터베이스는 주로 유닛 테스트에 사용돼요. 한 번에 하나의 프로세스만 metastore 데이터베이스에 연결할 수 있어서 실용적인 솔루션은 아니지만, 유닛 테스트에는 잘 동작합니다. 유닛 테스트에서는 Local/Embedded Metastore Server 구성이 임베디드 데이터베이스와 함께 사용됩니다. Derby는 임베디드 metastore의 기본 데이터베이스예요.
| Config Param | Config Value | Comment |
|---|---|---|
| javax.jdo.option.ConnectionURL | jdbc:derby:;databaseName=../build/test/junit_metastore_db;create=true |
hive/trunk/build…에 위치한 Derby 데이터베이스 |
| javax.jdo.option.ConnectionDriverName | org.apache.derby.jdbc.EmbeddedDriver |
Derby 임베디드 JDBC 드라이버 클래스 |
| hive.metastore.warehouse.dir | file://${user.dir}/../build/ql/test/data/warehouse |
유닛 테스트 데이터가 로컬 파일시스템에 저장되는 곳 |
metastore를 여러 노드에서 접근할 수 있도록 Derby를 네트워크 서버로 실행하려면 Hive Using Derby in Server Mode를 참고하세요.
Remote Metastore Database
이 구성에서는 전통적인 독립 RDBMS 서버를 사용해요. 다음 예제 구성은 MySQL 서버에 metastore를 설정합니다. 이 metastore 데이터베이스 구성은 실제 사용에 권장됩니다.
| Config Param | Config Value | Comment |
|---|---|---|
| javax.jdo.option.ConnectionURL | jdbc:mysql://<host name>/<database name>?createDatabaseIfNotExist=true |
메타데이터가 MySQL 서버에 저장됨 |
| javax.jdo.option.ConnectionDriverName | com.mysql.jdbc.Driver |
MySQL JDBC 드라이버 클래스 |
| javax.jdo.option.ConnectionUserName | <user name> |
MySQL 서버 연결용 사용자 이름 |
| javax.jdo.option.ConnectionPassword | <password> |
MySQL 서버 연결용 비밀번호 |
Local/Embedded Metastore Server
local/embedded metastore 설정에서 metastore 서버 컴포넌트는 라이브러리처럼 사용됩니다.
hive --service metastore
Hive 0.5.0 이전 버전에서는 Java를 직접 실행해 Thrift 서버를 실행해야 했습니다.
$JAVA_HOME/bin/java -Xmx1024m -Dlog4j.configuration=file://$HIVE_HOME/conf/hms-log4j.properties -Djava.library.path=$HADOOP_HOME/lib/native/Linux-amd64-64/ -cp $CLASSPATH org.apache.hadoop.hive.metastore.HiveMetaStore
Java를 직접 실행한다면 JAVA_HOME, HIVE_HOME, HADOOP_HOME이 올바르게 설정되어야 하고, CLASSPATH는 Hadoop, Hive(lib과 auxlib), Java jar를 포함해야 해요.
서버 구성 파라미터 (Server Configuration Parameters)
다음 예제는 Remote Metastore Database를 사용해요.
| Config Param | Config Value | Comment |
|---|---|---|
| javax.jdo.option.ConnectionURL | jdbc:mysql://<host name>/<database name>?createDatabaseIfNotExist=true |
메타데이터가 MySQL 서버에 저장됨 |
| javax.jdo.option.ConnectionDriverName | com.mysql.jdbc.Driver |
MySQL JDBC 드라이버 클래스 |
| javax.jdo.option.ConnectionUserName | <user name> |
MySQL 서버 연결용 사용자 이름 |
| javax.jdo.option.ConnectionPassword | <password> |
MySQL 서버 연결용 비밀번호 |
| hive.metastore.warehouse.dir | <base hdfs path> |
Hive 테이블의 기본 위치 |
| hive.metastore.thrift.bind.host | <host_name> |
metastore 서비스를 바인딩할 호스트 이름. 비어 있으면 "localhost"가 사용됨. Hive 4.0.0부터 사용 가능 |
Hive 3.0.0(HIVE-16452)부터 metastore 데이터베이스는 GUID를 저장하며, metastore 클라이언트는 Thrift API get_metastore_db_uuid로 백엔드 데이터베이스 인스턴스를 식별하기 위해 이 GUID를 쿼리할 수 있어요. 이 API는 HiveMetaStoreClient의 getMetastoreDbUuid() 메서드로 접근할 수 있습니다.
클라이언트 구성 파라미터 (Client Configuration Parameters)
| Config Param | Config Value | Comment |
|---|---|---|
| hive.metastore.uris | thrift://<host_name>:<port> |
Thrift metastore 서버의 호스트와 포트. hive.metastore.thrift.bind.host가 지정되면 호스트는 그 구성과 같아야 해요. 자세한 내용은 dynamic service discovery 구성 파라미터 참고 |
| hive.metastore.local | false |
Metastore가 원격임. 참고: Hive 0.10부터 더 이상 필요 없음. hive.metastore.uri 설정이면 충분 |
| hive.metastore.warehouse.dir | <base hdfs path> |
HDFS의 비외부 Hive 테이블 기본 위치를 가리킴 |
Dynamic Service Discovery 구성 파라미터
Hive 4.0.0(HIVE-20794)부터 HiveServer2와 유사하게, ZooKeeper 서비스를 metastore의 동적 서비스 발견(dynamic service discovery)에 사용할 수 있어요.
hive --service metastore -p <port_num>
Metastore 데이터베이스의 지원 백엔드 (Supported Backend Databases for Metastore Database)
| Database | Minimum Supported Version | Name for Parameter Values | See Also |
|---|---|---|---|
| MySQL | 5.6.17 | mysql | |
| Postgres | 9.1.13 | postgres | |
| Oracle | 11g | oracle | hive.metastore.orm.retrieveMapNullsAsEmptyStrings |
| MS SQL Server | 2008 R2 | mssql |
Metastore 스키마 정합성과 업그레이드 (Metastore Schema Consistency and Upgrades)
버전: Hive 0.12.0에 도입. HIVE-3764 참고.
Hive는 이제 metastore 데이터베이스에 스키마 버전을 기록하고, metastore에 접근할 Hive 바이너리와 metastore 스키마 버전이 호환되는지 검증해요. 기존 스키마를 암시적으로 생성하거나 변경하는 Hive 속성은 기본적으로 비활성화되어 있습니다. Hive는 metastore 스키마를 암시적으로 변경하려 시도하지 않아요. 이전 스키마에 대해 Hive 쿼리를 실행하면 metastore 접근에 실패합니다.
스키마 검사를 억제하고 metastore가 스키마를 암시적으로 수정하도록 하려면 hive-site.xml에서 구성 속성 hive.metastore.schema.verification을 false로 설정해야 합니다. Hive 0.12부터 Hive는 metastore 스키마를 초기화·업그레이드하는 오프라인 스키마 도구도 포함합니다.
더 알아보기 (Learn more)
metastore 설정의 핵심은 크게 두 가지예요. ① 메타데이터를 어디에 저장할지(임베디드 Derby vs 원격 RDBMS)와 ② 서버를 로컬로 쓸지 원격 Thrift 서버로 쓸지입니다. 실운영에서는 Remote Metastore Database + Remote Metastore Server 조합과 스키마 검증 설정이 권장됩니다.