Metastore 3.0 관리
Metastore 3.0 관리 (AdminManual Metastore 3.0 Administration)
버전 참고 (Version Note)
이 문서는 Hive 3.0 이상 릴리스의 Metastore에만 적용돼요. Hive 0, 1, 2 릴리스는 Metastore Administration 문서를 참고하세요.
출처: 문서
본문
소개 (Introduction)
데이터베이스, 테이블, 함수 같은 Hive 객체의 정의는 Metastore에 저장돼요. 시스템 구성에 따라 통계와 권한 부여 기록도 여기에 저장될 수 있습니다. Hive 및 다른 실행 엔진은 런타임에 이 데이터를 사용해 사용자 쿼리를 어떻게 파싱하고 인가하며 효율적으로 실행할지 결정해요.
Metastore는 Java JDO 기반 객체 관계 매핑(ORM) 계층인 DataNucleus를 통해 객체 정의를 관계형 데이터베이스(RDBMS)에 영속화합니다. 사용 가능한 지원 RDBMS 목록은 아래 Supported RDBMSs를 참고하세요.
Metastore는 Apache Derby RDBMS를 임베드하거나 외부 RDBMS에 연결하도록 구성할 수 있어요. Metastore 자체는 사용자 프로세스에 완전히 임베드되거나, 다른 프로세스가 연결할 수 있도록 서비스로 실행될 수 있습니다. 이러한 각 옵션은 아래에서 차례로 다룰게요.
Hive 2에서 Hive 3으로의 변경 (Changes From Hive 2 to Hive 3)
Hive 3.0부터 Metastore는 Hive의 나머지 부분 없이도 실행될 수 있어요. 비-Hive 시스템이 쉽게 통합할 수 있도록 별도의 릴리스로 제공됩니다. (다만 편의를 위해 Hive 릴리스에도 여전히 포함됩니다.) Metastore를 독립형 서비스로 만드는 작업에는 많은 구성 파라미터 이름과 도구 이름의 변경이 포함됐어요. 하위 호환성을 최대화하기 위해 모든 이전 구성 파라미터와 도구는 여전히 동작합니다. 이 문서는 새 이름과 옛 이름을 모두 다룰게요. 새 기능이 추가되면서 옛 Hive 스타일 이름은 추가되지 않을 것입니다.
Hive 없이 Metastore를 사용하는 방법에 대한 자세한 내용은 아래 Running the Metastore Without Hive를 참고하세요.
일반 구성 (General Configuration)
Metastore는 metastore-site.xml 파일에서 구성을 읽어요. 이 파일을 $METASTORE_HOME/conf에서 찾을 것으로 기대하며, 여기서 $METASTORE_HOME은 환경 변수입니다. 하위 호환성을 위해 HIVE_HOME/conf에서 발견되는 hive-site.xml이나 hive-metastoresite.xml 파일도 읽습니다. 구성 옵션은 커맨드 라인에서도 정의할 수 있어요 (아래 Starting and Stopping the Service 참조).
다양한 RDBMS, 임베디드 또는 서비스로, 그리고 Hive 없이 Metastore를 실행하는 것과 관련된 구성 값은 해당 섹션에서 다룹니다. 다음 구성 값은 실행 방식과 무관하게 Metastore에 적용돼요. 이 표는 흔히 사용자 정의되는 구성 값만 다룹니다. 덜 자주 변경되는 구성 값에 대해서는 Less Commonly Changed Configuration Parameters를 참고하세요.
| Parameter | Hive 2 Parameter | Default Value | Description |
|---|---|---|---|
| metastore.warehouse.dir | hive.metastore.warehouse.dir | URI of the default location for tables in the default catalog and database. | |
| datanucleus.schema.autoCreateAll | datanucleus.schema.autoCreateAll | false | Auto creates the necessary schema in the RDBMS at startup if one does not exist. Set this to false after creating it once. To enable auto create also set hive.metastore.schema.verification=false. Auto creation is not recommended in production; run schematool instead. |
| metastore.schema.verification | hive.metastore.schema.verification | true | Enforce metastore schema version consistency. When set to true: verify that version information stored in the RDBMS is compatible with the version of the Metastore jar. Also disable automatic schema migration. Users are required to manually migrate the schema after upgrade, which ensures proper schema migration. This setting is strongly recommended in production. When set to false: warn if the version information stored in RDBMS doesn't match the version of the Metastore jar and allow auto schema migration. |
| metastore.hmshandler.retry.attempts | hive.hmshandler.retry.attempts | 10 | The number of times to retry a call to the metastore when there is a connection error. |
| metastore.hmshandler.retry.interval | hive.hmshandler.retry.interval | 2 sec | Time between retry attempts. |
| metastore.log4j.file | hive.log4j.file | none | Log4j configuration file. If unset will look for metastore-log4j2.properties in $METASTORE_HOME/conf |
| metastore.stats.autogather | hive.stats.autogather | true | Whether to automatically gather basic statistics during insert commands. |
RDBMS
옵션 1: Derby 임베딩 (Embedding Derby)
Metastore는 Apache Derby를 임베디드로 실행할 수 있어요. 이것이 기본 구성입니다. 다만 간단한 테스트를 넘어서는 용도로는 적합하지 않아요. 이 구성에서는 한 클라이언트만 Metastore를 사용할 수 있고, (메모리 내 Derby 버전을 사용하므로) 어떤 변경도 클라이언트의 수명을 넘어 영속되지 않습니다.
옵션 2: 외부 RDBMS (External RDBMS)
내구성 있는 다중 사용자 설치에는 외부 RDBMS를 사용해 Metastore 객체를 저장해야 해요. Metastore는 JDBC를 통해 외부 RDBMS에 연결합니다. RDBMS의 JDBC 드라이버에 필요한 jar는 METASTORE_HOME/lib에 두거나 커맨드 라인에 명시적으로 전달해야 합니다. Metastore를 RDBMS에 연결하려면 다음 값들을 구성해야 해요. (참고: 이 구성 파라미터는 Hive 2와 3 사이에서 변경되지 않았습니다.)
| Configuration Parameter | Comment |
|---|---|
| javax.jdo.option.ConnectionURL | Connection URL for the JDBC driver |
| javax.jdo.option.ConnectionDriverName | JDBC driver class |
| javax.jdo.option.ConnectionUserName | User name to connect to the RDBMS with |
| javax.jdo.option.ConnectionPassword | Password to connect to the RDBMS with. The Metastore uses Hadoop's CredentialProvider API so this does not have to be stored in clear text in your configuration file. |
지원 RDBMS (Supported RDBMSs)
Metastore가 DataNucleus로 RDBMS와 통신하므로, 이론적으로 DataNucleus가 지원하는 어떤 저장 옵션이든 Metastore에서 동작해요. 하지만 우리는 다음만 테스트하고 권장합니다.
| RDBMS | Minimum Version | javax.jdo.option.ConnectionURL | javax.jdo.option.ConnectionDriverName |
|---|---|---|---|
| MS SQL Server | 2008 R2 | jdbc:sqlserver://<HOST>:<PORT>;DatabaseName=<SCHEMA> |
com.microsoft.sqlserver.jdbc.SQLServerDriver |
| MySQL | 5.6.17 | jdbc:mysql://<HOST>:<PORT>/<SCHEMA> |
com.mysql.jdbc.Driver |
| MariaDB | 5.5 | jdbc:mysql://<HOST>:<PORT>/<SCHEMA> |
org.mariadb.jdbc.Driver |
| Oracle* | 11g | jdbc:oracle:thin:@//<HOST>:<PORT>/xe |
oracle.jdbc.OracleDriver |
| Postgres | 9.1.13 | jdbc:postgresql://<HOST>:<PORT>/<SCHEMA> |
org.postgresql.Driver |
<HOST>= RDBMS가 있는 호스트.<PORT>= RDBMS가 JDBC 연결을 수신하는 포트.<SCHEMA>= Metastore가 테이블을 저장하는 스키마(또는 데이터베이스).- *Oracle 값은 Oracle의 thin JDBC 클라이언트용이에요. 다른 클라이언트를 사용하면 ConnectionURL과 ConnectionDriverName 값이 달라집니다.
특별 참고: Postgres를 사용할 때는 특정 작업에서 실패를 피하기 위해 구성 파라미터 metastore.try.direct.sql.ddl(이전 hive.metastore.try.direct.sql.ddl)을 false로 설정해야 해요.
Metastore 스키마 설치와 업그레이드 (Installing and Upgrading the Metastore Schema)
Metastore는 RDBMS의 Metastore 스키마 작업을 위한 schematool 유틸리티를 제공해요. 전체 옵션 목록은 도구의 -help 옵션을 참고하세요. 다음은 도구가 할 수 있는 것을 요약한 것입니다. 대부분의 경우 schematool은 metastore-site.xml 파일에서 구성을 읽을 수 있지만, 구성은 커맨드 라인 옵션으로도 전달할 수 있어요.
-initSchema: 새 스키마를 설치해요. Metastore를 처음 설정할 때 사용해야 합니다.-upgradeSchema: 새로 설치된 버전으로 업그레이드해요. 3.0의 경우 1.2, 2.0, 2.1, 2.2, 2.3에서 3.0으로 업그레이드할 수 있습니다. 1.2 이전 버전에서 업그레이드해야 한다면, 이전 버전의 Hiveschematool로 먼저 스키마를 1.2로 업그레이드한 뒤, 현재 Metastore 버전으로 3.0에 업그레이드하세요.-createUser: Metastore 사용자와 스키마를 만들어요. 테이블을 설치하는 것이 아니라 데이터베이스 사용자와 스키마만 만듭니다. 일반적으로 생산 환경에서는 사용자와 스키마를 만들 권한이 없을 수 있으므로 이 기능은 동작하지 않을 가능성이 커요. DBA가 대신 해줄 필요가 있을 것입니다.-validate: 기록된 버전에 대해 Metastore 스키마가 올바른지 확인해요.
Metastore 실행 (Running the Metastore)
임베디드 모드 (Embedded Mode)
Metastore는 라이브러리로 프로세스에 직접 임베드될 수 있어요. 메타데이터 연산에 추가 네트워크 홉을 피하기 위해 HiveServer2에서 흔히 이렇게 합니다. Hive CLI나 다른 프로세스에서도 사용할 수 있어요. 이 모드는 기본이며, 구성 파라미터 metastore.uris가 설정되지 않으면 언제나 사용됩니다.
HiveServer2를 제외하고, 이 모드를 사용하면 몇 가지 우려가 있어요. 첫째, 각 클라이언트가 자신의 연결 집합을 가지므로 클라이언트가 많으면 백킹 RDBMS에 부담이 됩니다. 둘째, 모든 클라이언트가 RDBMS에 대해 읽기/쓰기 접근을 가져야 해요. 이는 RDBMS를 제대로 보호하기 어렵게 만듭니다. 따라서 HiveServer2를 제외하면 임베디드 모드는 생산 환경에서 권장되지 않아요.
Metastore 서버 (Metastore Server)
Metastore를 서비스로 실행하려면 먼저 URL로 구성해야 해요.
| Configured On | Parameter | Hive 2 Parameter | Format | Default Value | Comment |
|---|---|---|---|---|---|
| Client | metastore.thrift.uris | hive.metastore.uris | thrift://<HOST>:<PORT>[, thrift://<HOST>:<PORT>...] |
none | HOST = hostname, PORT = should be set to match metastore.thrift.port on the server (which defaults to 9083. You can provide multiple servers in a comma separate list. |
| Server | metastore.thrift.port | hive.metastore.port | integer | 9083 | Port Thrift will listen on. |
클라이언트를 구성한 뒤에는 start-metastore 유틸리티를 사용해 서버에서 Metastore를 시작할 수 있어요. 그 유틸리티의 -help 옵션에서 사용 가능한 옵션을 확인하세요. stop-metastore 스크립트는 없어요. metastore의 프로세스 id를 찾아서 그 프로세스를 종료해야 합니다.
고가용성 (High Availability)
Metastore 서비스는 상태 없는(stateless) 방식이에요. 이는 고가용성을 위해 서비스의 여러 인스턴스를 시작할 수 있게 해 줍니다. 또한 일부 클라이언트(예: HiveServer2)가 metastore를 임베드하도록 구성하면서, 다른 클라이언트를 위해 Metastore 서비스를 계속 실행할 수도 있어요. 여러 Metastore 서비스를 실행한다면 모든 URI를 클라이언트의 metastore.thrift.uris 값에 넣고 metastore.thrift.uri.selection(Hive 2에서는 hive.metastore.uri.selection)을 RANDOM이나 SEQUENTIAL로 설정할 수 있어요. RANDOM은 클라이언트가 목록의 서버 중 하나를 무작위로 선택하게 하고, SEQUENTIAL은 목록 시작부터 시작해 각 서버에 순서대로 연결을 시도하게 합니다.
서비스 보안 (Securing the Service)
TODO: Kerberos, SSL 등으로 설정하는 세부 사항을 채워야 합니다.
CLIENT_KERBEROS_PRINCIPAL, KERBEROS_, SSL, USE_SSL, USE_THRIFT_SASL
Hive 없이 Metastore 실행 (Running the Metastore Without Hive)
Hive 3.0부터 Metastore는 별도의 패키지로 릴리스되며 Hive의 나머지 부분 없이 실행될 수 있어요. 이를 독립형(standalone) 모드라고 합니다.
기본적으로 Metastore는 Hive와 함께 사용하도록 구성되어 있으므로, 이 구성에서는 몇 가지 구성 파라미터를 바꿔야 해요.
| Configuration Parameter | Set to for Standalone Mode |
|---|---|
| metastore.task.threads.always | org.apache.hadoop.hive.metastore.events.EventCleanerTask,org.apache.hadoop.hive.metastore.MaterializationsCacheCleanerTask |
| metastore.expression.proxy | org.apache.hadoop.hive.metastore.DefaultPartitionExpressionProxy |
현재 다음 기능들은 독립형 모드의 Metastore에서 테스트되지 않았거나 동작하지 않는 것으로 알려져 있어요.
- 컴팩터(ACID 테이블용)는 Hive 없이는 실행할 수 없어요. ACID 테이블은 읽고 쓸 수 있지만 컴팩션할 수는 없습니다.
- 복제(replication)는 Hive 밖에서 테스트되지 않았어요.
성능 최적화 (Performance Optimizations)
CachedStore
Hive 3.0 이전에는 MetaStore API 구현이 단 하나(ObjectStore)만 있었어요. HIVE-16520은 데이터베이스의 객체를 메모리에 캐시할 수 있는 두 번째 구현을 도입했어요. 이는 데이터베이스 왕복 시간을 크게 절약할 수 있습니다. 파라미터 metastore.rawstore.impl를 org.apache.hadoop.hive.metastore.cache.CachedStore로 변경해 사용할 수 있어요.
이 MetaStore를 통해 변경이 이루어질 때 캐시는 새 데이터로 자동 업데이트됩니다. 여러 MetaStore 서버가 있는 시나리오에서는 일부 서버에서 캐시가 오래될 수 있어요. 이를 방지하기 위해 CachedStore는 구성 가능한 주기(기본값: 1분)로 캐시를 자동으로 새로고침합니다.
CachedStore의 모든 속성에 대한 자세한 내용은 Configuration Properties(접두어: metastore.cached)에서 확인할 수 있어요.
덜 자주 변경되는 구성 파라미터 (Less Commonly Changed Configuration Parameters)
- BATCHED_RETRIEVE_, CLIENT_CONNECT_RETRY_DELAY, FILTER_HOOK, SERDES_USING_METASTORE_FOR_SCHEMA, SERVER__THREADS
THREAD_POOL_SIZE- 보안: EXECUTE_SET_UGI, metastore.authorization.storage.checks
- 캐싱 설정: CACHED*, CATALOGS_TO_CACHE & AGGREGATE_STATS_CACHE*
- 트랜잭션: MAX_OPEN_TXNS, TXNS_*
더 알아보기 (Learn more)
Metastore는 Hive 객체 정의를 영속화하는 핵심 계층이며, Hive 3.0부터는 Hive 없이도 독립 실행할 수 있어요. 운영 시 외부 RDBMS(MySQL, Postgres 등)를 JDBC로 연결하고, 스키마는 schematool로 설치·업그레이드하며, metastore.schema.verification=true로 스키마 버전 일관성을 강제하는 것이 권장 구성입니다.