HMS(Hive Metastore Service)는 Apache Hive의 메타스토어(Metastore) 서비스로, 테이블, 데이터베이스, 파티션, 스키마 등의 메타데이터를 관리하는 역할을 한다.
여러 최신 기술이 생겼음에도 Hive Metastore (HMS)를 활용해야 하는 이유는 기존의 데이터 레이크 아키텍처와의 높은 호환성, 메타데이터 관리 기능, 그리고 여러 데이터 처리 엔진과의 연동성 때문이다.
🏳️🌈 [궁금한점]
HMS는 테이블, 파티션, 스키마, 데이터 위치 등의 메타데이터를 중앙에서 관리하는 역할을 한다.
데이터 저장소가 변경되더라도 테이블 정의를 일관되게 유지할 수 있다.
Presto, Trino, Spark, Flink, Hive 등 여러 분산 처리 엔진과의 연동이 가능하다.
HMS가 있으면 다양한 엔진에서 동일한 메타데이터를 공유할 수 있으므로 데이터 관리가 용이
Hadoop 에코시스템을 포함한 기존 데이터 레이크 환경에서 HMS는 핵심적인 역할을 해왔고, 많은 기업이 이를 기반으로 운영 중이다.
데이터 레이크에서 Hive 테이블을 사용하고 있다면 HMS를 계속 유지하는 것이 운영 비용을 줄이고, 기존 인프라를 그대로 활용할 수 있는 방법이 될수 있다.
Iceberg, Delta Lake 등 새로운 포맷이 등장했지만, 여전히 HMS를 활용하여 메타데이터를 관리하는 경우가 많다.
HMS는 기존 Hive 기반 데이터 레이크와의 호환성을 유지하는 데 필수적
HMS는 Trino, Presto, Spark 등 다양한 엔진에서 사용되는 공통 메타스토어 역할을 한다.
예를 들어, Trino의 Hive 카탈로그는 기본적으로 HMS를 사용하여 테이블과 파티션 정보를 가져온다.
Spark도 기본적으로 HMS와 연동되어 있으며, 이를 통해 데이터를 효율적으로 조회할 수 있다.
HMS는 여러 데이터 엔진과 쉽게 연결될 수 있도록 하는 "표준" 역할
Apache Iceberg는 새로운 데이터 레이크 테이블 포맷이지만, 기존의 HMS를 활용할 수도 있다.
Iceberg의 Hive 카탈로그 모드를 사용하면 HMS를 통해 메타데이터를 저장하고 관리할 수 있다.
완전히 새로운 메타스토어 시스템을 구축할 필요 없이, 기존 HMS를 그대로 활용 가능하다.
HMS는 Iceberg 같은 최신 기술과도 함께 사용할 수 있어 높은 유연성
HMS는 오랜 기간 동안 검증된 솔루션이며, 대규모 데이터 레이크 환경에서도 안정적으로 운영할 수 있다.
많은 기업들이 이미 HMS를 기반으로 수십~수백 PB(페타바이트)급 데이터 레이크를 운영하고 있다.
새로운 카탈로그 솔루션(예: Iceberg REST, Glue 등)이 있지만, 여전히 HMS가 성능과 안정성 면에서 유리한 경우가 많다.
HMS는 안정성과 운영 경험이 충분히 쌓인 검증된 솔루션이기 때문에, 많은 기업들이 계속 사용
HMS 서버
HMS의 주요 기능
- 메타데이터 저장: 테이블의 구조 및 위치, 파티션 정보 등을 저장
- 다양한 컴퓨팅 엔진과 연동: Hive뿐만 아니라 Trino, Spark, Presto 등과 함께 사용 가능
- ACID 트랜잭션 지원: 최신 버전에서는 ACID 트랜잭션을 활용할 수 있음
- RDBMS 기반 저장: PostgreSQL, MySQL, MariaDB 등의 RDBMS에 데이터를 저장
HiveServer2(HS2)는 Apache Hive의 SQL 인터페이스를 제공하는 서버로, 클라이언트가 Hive와 상호작용할 수 있도록 해준다.
테스트 및 개발 환경에서만 유용하고, 확장성이 부족하여 운영 환경에는 적절하지 않다.
+--------------------+
| Beeline / JDBC / ODBC |
+----------+---------+
|
v
+---------------------------+
| HiveServer2 + Metastore |
| (하나의 컨테이너) |
+---------------------------+
|
v
+-------------------------+
| Metastore DB (PostgreSQL) |
+-------------------------+
HMS는 메타데이터를 DB(PostgreSQL, MySQL 등)에 저장한다. 유지보수와 확장성이 좋아지고, 다른 엔진(Trino, Spark 등)에서도 동일한 HMS를 사용할 수 있습니다.
+--------------------+
| Beeline / JDBC / ODBC |
+----------+---------+
|
v
+--------------------+
| HiveServer2 (HS2) |
+----------+---------+
|
v
+--------------------+
| Hive Metastore (HMS) |
+----------+---------+
|
v
+-------------------------+
| Metastore DB (PostgreSQL) |
+-------------------------+
Trino + Iceberg + MinIO 조합에서는 HMS가 필수는 아니다. Iceberg 자체가 HMS 없이 메타데이터를 S3(MinIO) 등의 오브젝트 스토리지에 저장할 수 있기 때문이다.
하지만, 기존 Hive 기반의 데이터도 함께 활용해야 한다면 HMS가 필요할 수 있다.
catalog.s3-catalog.type=hive
catalog.s3-catalog.uri=thrift://hive-metastore:9083
Iceberg가 HMS를 통해 메타데이터 관리
Hive 테이블과 Iceberg 테이블을 함께 운영 가능
catalog.s3-catalog.type=jdbc
catalog.s3-catalog.connection-url=jdbc:postgresql://metastore-db:5432/iceberg
Iceberg가 직접 PostgreSQL을 사용하여 메타데이터 관리
| 개념 | 설명 | 예시 |
|---|---|---|
| 카탈로그 (Catalog) | 데이터베이스 객체(테이블, 뷰 등)를 관리하는 논리적 컨테이너 | Iceberg Catalog, Hive Metastore(HMS), Glue Catalog |
| 메타데이터 (Metadata) | 데이터를 설명하는 정보로, 구조, 위치, 스키마 등을 포함 | 테이블 스키마, 파일 위치, 파티션 정보 |
SHOW CATALOGS;
데이터 자체가 아닌, 데이터에 대한 설명
예제 (Trino에서 Iceberg 테이블 메타데이터 조회)
SELECT * FROM iceberg.information_schema.tables WHERE table_name = 'my_table';
특정 테이블의 위치, 포맷, 생성 시간, 파티션 정보 등을 조회 가능
메타데이터의 종류
HMS(Hive Metastore Service)는 메타데이터 관리 시스템이다. 하지만, 일부 맥락에서는 카탈로그 역할도 수행할 수 있다.
테이블, 데이터베이스, 파티션, 스키마 등의 메타데이터를 저장하고 관리한다. 즉, 데이터 자체가 아니라, 데이터에 대한 정보를 관리하는 시스템이다.
Hive, Trino, Spark 같은 엔진이 HMS를 "카탈로그"처럼 사용할 수 있다.
즉, HMS가 메타데이터를 저장하면서, 동시에 이를 조회하고 관리할 수 있도록 API를 제공하며 "Hive 카탈로그" 역할을 수행한다.
SHOW TABLES FROM hive.default;
Hive Metastore는 전통적인 Hive 테이블을 관리하는 용도로 설계되었다. 이로인해 Iceberg, Delta Lake, Hudi 같은 최신 테이블 포맷을 지원하는 데 여러 한계가 있다.
Iceberg 카탈로그로 Hive Metastore(HMS)를 사용하더라도 Iceberg의 ACID 기능은 지원된다. 다만, HMS 기반 Iceberg 카탈로그는 몇 가지 제약이 있을 수 있다.
Iceberg는 ACID 트랜잭션을 지원하는 테이블 포맷이다. 즉, Hive Metastore를 사용하든, Iceberg 전용 카탈로그(REST, JDBC, DynamoDB 등)를 사용하든 ACID 트랜잭션은 항상 지원된다.
Iceberg는 다양한 카탈로그를 지원하는데, Hive Metastore도 그중 하나이다.
| Iceberg 카탈로그 유형 | 설명 | 특징 |
|---|---|---|
| Hive 카탈로그 | HMS를 사용하여 Iceberg 테이블 메타데이터 관리 | Trino, Spark 등에서 쉽게 사용 가능, 기존 HMS 인프라 활용 |
| REST 카탈로그 | Iceberg 전용 REST API 기반 | 확장성이 좋고 클라우드 친화적 |
| JDBC 카탈로그 | PostgreSQL, MySQL 등에서 Iceberg 메타데이터 관리 | 데이터베이스 기반으로 메타데이터 저장 |
| DynamoDB 카탈로그 | AWS DynamoDB 사용 | AWS 환경에서 사용 최적화 |
Hive Metastore를 Iceberg 카탈로그로 사용할 경우, Iceberg의 ACID 기능은 정상적으로 동작하지만 몇 가지 제약이 있다.
Hive 메타스토어를 Iceberg 카탈로그의 메타데이터 저장소로 사용하는 경우, 일부 특성 때문에 성능이나 확장성에 영향을 미칠 수 있다. 이를 잘 이해하면 최적화 방법을 고려할 수 있다.
Hive 메타스토어는 기본적으로 RDBMS(예: MySQL, PostgreSQL, MariaDB 등) 또는 HDFS와 같은 분산 시스템에 테이블 메타데이터를 저장한다. Iceberg가 Hive 메타스토어를 사용할 경우, 메타데이터 관리에서 성능 저하가 발생할 수 있다.
RDBMS 기반의 Hive 메타스토어는 대규모 데이터에 대해 성능 문제가 발생할 수 있다. 특히, 테이블 수가 많거나 복잡한 쿼리가 자주 실행되면 메타스토어 접근이 느려질 수 있다.
Iceberg는 스냅샷 및 버전 관리를 사용하여 테이블의 메타데이터를 관리한다. 이 과정에서 메타데이터가 매우 복잡해지고, 커질 수 있다. Hive 메타스토어는 복잡한 스냅샷과 버전 관리를 처리하는 데 최적화되어 있지 않아서, 메타데이터 쿼리나 스냅샷 조회가 비효율적일 수 있다.
특히 스냅샷 수가 많을수록 메타데이터를 처리하는데 더 많은 시간이 걸릴 수 있으며, 이로 인해 쿼리 성능 저하나 쓰기 지연이 발생할 수 있다.
Iceberg는 ACID 트랜잭션을 완벽하게 지원하는 반면, Hive 메타스토어는 ACID 트랜잭션을 지원하는데 제약이 있을 수 있다. Iceberg는 동시성을 관리하고, 트랜잭션을 스냅샷 단위로 처리하지만, Hive 메타스토어는 이를 위한 추가적인 최적화가 부족하다.
트랜잭션 충돌이나 동시 작업에서 발생하는 비효율성이 Hive 메타스토어에서 발생할 수 있으며, 이는 데이터 일관성이나 성능 저하로 이어질 수 있다.
Hive 메타스토어가 RDBMS를 사용할 경우, 해당 데이터베이스의 성능 최적화가 중요하다. 예를 들어, 인덱싱을 추가하거나, 쿼리 성능을 개선하는 방법을 사용할 수 있다.
쿼리 캐싱을 사용하여 자주 조회되는 메타데이터에 대해 성능을 향상시킬 수 있다.
메타스토어 RDBMS 성능을 튜닝하거나, 복제 및 분산 구성을 통해 확장성을 높일 수 있다.
Hive 메타스토어 대신 Iceberg 카탈로그를 사용하면, 메타데이터 관리 및 ACID 트랜잭션을 보다 효율적으로 처리할 수 있다. Iceberg는 스냅샷 기반의 메타데이터 관리를 제공하며, 대규모 데이터에 대해서도 성능을 최적화할 수 있는 방식이다.
Iceberg 카탈로그를 사용하면 메타데이터를 효율적으로 관리할 수 있고, 복잡한 트랜잭션 처리에서도 성능을 높일 수 있다.
Iceberg에서 관리되는 메타데이터의 크기와 복잡도를 줄이기 위해 스냅샷의 수를 관리하거나, 정기적인 메타데이터 정리(예: 불필요한 스냅샷 제거)를 고려할 수 있다.
메타데이터 저장소에 대한 분산 처리를 통해 성능을 개선할 수 있다.
트랜잭션 관리에서 성능을 개선하려면, Iceberg에서 제공하는 ACID 지원을 효율적으로 사용해야 한다. 예를 들어, 스냅샷 격리 수준을 적절히 조정하거나, 트랜잭션 처리의 최적화 방법을 고려할 수 있다.
RDBMS는 빠른 단일 데이터 조회와 트랜잭션에 강점이 있지만, 대규모 데이터 처리와 분산 시스템에서는 객체 스토리지(S3)가 효과적일 수 있다. Iceberg는 병렬 처리와 효율적인 메타데이터 관리를 통해 S3와 같은 객체 스토리지의 느린 성능을 어느 정도 극복할 수 있으며, 대규모 데이터 처리에서는 병렬 처리와 파일 최적화를 통해 성능 향상을 이끌어낼 수 있다.
RDBMS는 데이터를 테이블 형식으로 관리하며, 인덱싱, 캐싱, 트랜잭션 관리 등 여러 최적화 기술을 활용하여 빠른 쿼리 성능을 제공한다. 특히 저지연 데이터 액세스가 가능하고, 인메모리 기반의 최적화 기법을 사용할 수 있다.
S3와 같은 객체 스토리지는 데이터를 파일 단위로 저장한다. 이 방식은 저지연 액세스와 인덱스 관리가 부족해 단일 파일 조회 시 상대적으로 느릴 수 있다. 또한 객체 스토리지는 파일 시스템이 아니기 때문에, RDBMS처럼 상세한 쿼리 최적화나 인덱스가 지원되지 않는다.
Iceberg는 객체 스토리지에 저장된 데이터를 다룰 때, 병렬 처리와 효율적인 파일 관리 기법을 통해 성능을 최적화한다. 즉, 객체 스토리지가 느릴 수 있지만, 분산 처리 시스템(예: Trino, Spark 등)을 사용하여 병렬로 데이터를 처리하면 전체 성능을 효과적으로 향상시킬 수 있다.
Iceberg는 분산 처리를 통해 데이터를 병렬로 읽고 쓰는 방식을 사용한다. 데이터를 여러 파트로 분할하고, 각 파트에 대해 독립적으로 병렬 처리를 수행함으로써 S3와 같은 객체 스토리지의 속도 제한을 상쇄할 수 있다.
트리거된 쿼리에 대해 여러 워커가 동시에 데이터를 읽고 쓰기 때문에 I/O 병목 현상을 최소화할 수 있다.
Iceberg는 데이터를 파일 단위로 관리하는 대신, 테이블 단위로 데이터를 효율적으로 관리한다. 이를 통해 불필요한 데이터 읽기를 줄이고, 스냅샷 관리를 통해 특정 버전의 데이터만 효율적으로 읽을 수 있다.
파일 포맷(예: Parquet)을 사용해 데이터를 저장하면, 객체 스토리지에서 쿼리 성능을 최적화할 수 있다. Parquet는 컬럼형 저장 방식을 사용하여 데이터를 필요한 열만 읽기 때문에 불필요한 데이터 액세스를 줄일 수 있다.
Iceberg는 파일 시스템을 관리하는 방식에서 분산 파일 시스템의 이점을 활용한다. 예를 들어, 파일을 작은 조각으로 나누어 여러 서버에서 병렬로 읽고 쓰는 방식으로 속도를 개선할 수 있다.
객체 스토리지는 비록 RDBMS보다는 느리지만, 대규모 데이터 처리에서는 분산 처리와 효율적인 데이터 분할로 이러한 성능 차이를 어느 정도 극복할 수 있다.
Iceberg는 스냅샷과 버전 관리를 통해 변경된 데이터만 조회하거나, 과거의 데이터를 효율적으로 검색할 수 있다. 이를 통해 객체 스토리지의 I/O를 절약하고, 성능을 개선할 수 있다.
Iceberg는 파일 단위로 데이터를 효율적으로 분할하고, 각 파일을 최적화된 크기로 유지한다. 이를 통해, 데이터를 병렬로 읽고 쓰는 과정에서 속도 차이를 줄일 수 있다.
RDBMS의 고속 액세스가 필요한 경우에는 온디맨드 처리나 인메모리 데이터베이스가 적합하지만, 대규모 데이터를 분산 처리해야 할 경우에는 객체 스토리지(S3)와 Iceberg와 같은 시스템이 적합할 수 있다. 특히, 병렬 처리와 효율적인 파일 관리로 I/O 병목을 최소화할 수 있기 때문이다.
S3에서의 데이터 처리 성능은 분명히 단일 파일 처리에 있어 RDBMS보다 느릴 수 있지만, Iceberg의 스냅샷 관리, 파일 단위 관리, 병렬 처리로 성능 저하를 상쇄하고 대규모 데이터를 효율적으로 관리할 수 있다.