Hive Catalog
Doris는 Hive Metastore 또는 Hive Metastore와 호환되는 메타데이터 서비스에 연결하여 Hive 데이터베이스와 테이블 정보를 자동으로 가져와 데이터를 쿼리할 수 있습니다.
Hive 외에도 많은 시스템이 Hive Metastore를 사용하여 메타데이터를 저장합니다. 따라서 Hive Catalog를 통해 Hive 테이블뿐 아니라 Iceberg, Hudi처럼 메타데이터 저장에 Hive Metastore를 사용하는 다른 테이블 형식에도 접근할 수 있습니다.
활용 시나리오
| 시나리오 | 설명 |
|---|---|
| 쿼리 가속 | Doris의 분산 컴퓨팅 엔진으로 Hive 데이터에 직접 접근하여 쿼리를 가속합니다. |
| 데이터 통합 | Hive 데이터를 읽어 Doris 내부 테이블에 쓰거나, Doris 컴퓨팅 엔진을 사용하여 ZeroETL 작업을 수행합니다. |
| 데이터 쓰기 반환 | Doris가 지원하는 모든 소스의 데이터를 처리한 후 Hive 테이블에 다시 씁니다. |
Catalog 설정
구문
CREATE CATALOG [IF NOT EXISTS] catalog_name PROPERTIES (
'type'='hms', -- required
'hive.metastore.type' = '<hive_metastore_type>', -- optional
'hive.version' = '<hive_version>', -- optional
'fs.defaultFS' = '<fs_defaultfs>', -- required for write, optional for read-only
{MetaStoreProperties},
{StorageProperties},
{HiveProperties},
{CommonProperties}
);
-
<hive_metastore_type>Hive Metastore의 유형을 지정합니다.
hms: 표준 Hive Metastore 서비스입니다.glue: Hive Metastore 호환 인터페이스를 사용하여 AWS Glue 메타데이터 서비스에 접근합니다.dlf: Hive Metastore 호환 인터페이스를 사용하여 Alibaba Cloud DLF 메타데이터 서비스에 접근합니다.
-
<fs_defaultfs>Doris에서 이 Hive Catalog의 테이블에 데이터를 쓸 때 필수인 매개변수입니다. 예:
'fs.defaultFS' = 'hdfs://namenode:port' -
{MetaStoreProperties}MetaStoreProperties 부분에는 Metastore 메타데이터 서비스의 연결 및 인증 정보를 입력합니다. 자세한 내용은 "지원하는 메타데이터 서비스" 절을 참고하세요.
-
{StorageProperties}StorageProperties 부분에는 스토리지 시스템과 관련된 연결 및 인증 정보를 입력합니다. 자세한 내용은 "지원하는 스토리지 시스템" 절을 참고하세요.
-
{HiveProperties}HiveProperties 부분에는 Hive Catalog와 관련된 속성을 입력합니다.
-
get_schema_from_table: 기본값은 false입니다. 기본적으로 Doris는 Hive Metastore에서 테이블 스키마 정보를 가져옵니다. 그러나 경우에 따라Storage schema reading not supported오류와 같은 호환성 문제가 발생할 수 있습니다. 이때 이 매개변수를 true로 설정하면 Table 객체에서 직접 테이블 스키마를 가져옵니다. 다만 이 방법을 사용하면 열의 기본값 정보가 무시됩니다. 이 속성은 버전 2.1.10 및 3.0.6부터 지원됩니다. -
hive.recursive_directories: 파티션 디렉터리 목록을 조회할 때 하위 디렉터리를 재귀적으로 탐색할지 지정합니다. 이 매개변수는 버전 3.0.2부터 지원됩니다. 버전 4.0 이전에는 기본값이false였으며, 이후 버전에서는 기본값이true입니다. 일부 Hive 테이블의 파티션 경로는 테이블 스키마의 파티션 정보와 일치하지 않을 수 있습니다. 하위 디렉터리의 데이터 파일을 가져오려면 이 매개변수를 true로 설정해야 합니다. -
hive.ignore_absent_partitions: 존재하지 않는 파티션을 무시할지 지정합니다. 기본값은true입니다.false로 설정하면 존재하지 않는 파티션을 만났을 때 쿼리가 오류를 반환합니다. 이 매개변수는 버전 3.0.2부터 지원됩니다. -
hive.staging_dir: Hive 쓰기 작업에 사용할 임시 스테이징 루트 디렉터리를 설정합니다. 쓰기 과정에서 데이터는 먼저 이 디렉터리에 기록되며, 완료 후 최종 Hive 테이블 디렉터리로 이동합니다. 이 경로는 Hive 테이블 루트 디렉터리를 기준으로 한 상대 경로이거나 절대 경로일 수 있습니다. 기본값은/tmp/.doris_staging입니다. Hive 테이블에 쓸 때/tmp디렉터리와 테이블 디렉터리가 서로 다른 네임스페이스에 속해 쓰기가 실패하는 경우가 있습니다. 이때 이 매개변수를 상대 경로로 변경하면 문제를 해결할 수 있습니다. 이 매개변수는 버전 4.0.3부터 지원됩니다.
-
-
{CommonProperties}CommonProperties 부분에는 공통 속성을 입력합니다. Catalog 개요의 "공통 속성" 절을 참고하세요.
메타데이터 캐시
Apache Doris는 외부 데이터 소스에 대한 접근 성능을 높이기 위해 Hive 메타데이터를 캐시합니다. 메타데이터에는 테이블 구조(Schema), 파티션 목록, 파티션 속성, 파일 목록이 포함됩니다.
Doris 4.1.x 이전 버전에서는 주로 FE 설정 항목을 통해 메타데이터 캐시를 전역적으로 제어합니다. 자세한 내용은 메타데이터 캐시를 참고하세요.
Doris 4.1.x부터는 통합된 meta.cache.* 키를 사용하여 Hive Catalog의 외부 메타데이터 캐시를 설정합니다.
캐시 속성 설정(4.1.x+)
각 엔진의 캐시 항목은 통합된 설정 키 형식인 meta.cache.<engine>.<entry>.{enable,ttl-second,capacity,max-weight}를 사용합니다. max-weight는 현재 추정기를 사용하는 일부 항목에서만 지원됩니다. 외부 메타데이터 캐시 메모리 관리를 참고하세요.
| 속성 | 예 | 의미 |
|---|---|---|
enable | true/false | 이 캐시 모듈의 활성화 여부입니다. |
ttl-second | 600, 0, -1 | 0은 캐시 비활성화를 의미합니다(즉시 적용되며 최신 데이터를 확인하는 데 사용할 수 있음). -1은 만료되지 않음을 의미합니다. 그 밖의 양의 정수는 접근 시간을 기준으로 한 초 단위 TTL을 의미합니다. |
capacity | 10000 | 캐시에 저장할 수 있는 최대 항목 수입니다. max-weight가 적용 중일 때는 항목 수 제한이 동시에 적용되지 않지만, 0으로 설정하면 여전히 캐시가 비활성화됩니다. |
max-weight | 1GB | Doris 4.1.4부터 지원됩니다. 선택적으로 설정하는 예상 보유 메모리 한도입니다. 현재 Hive의 partition_values에서 지원하며, 0으로 설정하면 해당 항목이 비활성화됩니다. |
적용 조건: 모듈 캐시는 enable=true, ttl-second != 0, capacity > 0이고, max-weight가 없거나 0이 아닐 때 적용됩니다.
캐시 모듈
Hive Catalog에는 다음 캐시 모듈이 포함됩니다.
모듈(<entry>) | 속성 키 접두사 | 캐시 내용 및 영향 |
|---|---|---|
schema | meta.cache.hive.schema. | 테이블 구조를 캐시합니다. 영향: 테이블 열 정보가 반영되는 시점입니다. 비활성화하면 쿼리마다 최신 Schema를 가져옵니다. |
partition_values | meta.cache.hive.partition_values. | 파티션 값/이름 목록을 캐시합니다. 영향: 파티션 프루닝 및 열거입니다. 비활성화하면 외부에 새로 생성된 파티션을 실시간으로 확인할 수 있습니다. |
partition | meta.cache.hive.partition. | 파티션 속성(Location, 입력 형식 등)을 캐시합니다. 영향: 파티션의 세부 메타데이터입니다. |
file | meta.cache.hive.file. | 파일 목록을 캐시합니다. 영향: 원격 LIST 작업의 오버헤드를 줄입니다. 비활성화하면 파일 변경 사항을 실시간으로 확인할 수 있습니다. |
기존 매개변수 매핑 및 전환
버전 4.1.x 이상에서는 통합 키를 사용하는 것이 좋습니다. 기존 Catalog 속성과 4.1.x+ 통합 키의 매핑은 다음과 같습니다.
| 기존 속성 키 | 4.1.x+ 통합 키 | 설명 |
|---|---|---|
schema.cache.ttl-second | meta.cache.hive.schema.ttl-second | 테이블 구조 캐시의 만료 시간 |
partition.cache.ttl-second | meta.cache.hive.partition_values.ttl-second | 파티션 값 캐시의 만료 시간 |
file.meta.cache.ttl-second | meta.cache.hive.file.ttl-second | 파일 목록 캐시의 만료 시간 |
권장 사용 방법
- 최신 데이터에 실시간으로 접근: 각 쿼리가 외부 데이터 소스의 최신 파티션 또는 파일 변경 사항을 확인하도록 하려면 해당
ttl-second를0으로 설정할 수 있습니다.-- Disable file list cache to see file changes in real-time
ALTER CATALOG hive_ctl SET PROPERTIES ("meta.cache.hive.file.ttl-second" = "0");
-- Disable partition value cache to see new partitions in real-time
ALTER CATALOG hive_ctl SET PROPERTIES ("meta.cache.hive.partition_values.ttl-second" = "0"); - 성능 최적화: 메타데이터가 자주 변경되지 않는 시나리오에서는
capacity와ttl-second를 적절히 늘려 Hive Metastore와 파일 시스템의 접근 부하를 줄이는 것이 좋습니다.
Hive Catalog 참고 사항: Doris 4.1.4부터 Catalog 속성 변경이 성공하면 Catalog 실행 컨텍스트가 재설정되고, 해당 Catalog를 통해 라우팅되는 모든 메타데이터 캐시 엔진의 초기화된 항목이 지워집니다. Doris는 다음 접근 시 새 컨텍스트와 설정으로 해당 항목을 다시 생성합니다. 이미 진행 중인 쿼리에는 영향을 주지 않습니다.
관측 가능성
information_schema.catalog_meta_cache_statistics 시스템 테이블을 통해 캐시 지표를 확인할 수 있습니다.
SELECT catalog_name, engine_name, entry_name,
effective_enabled, ttl_second, capacity,
estimated_size, hit_rate, load_failure_count, last_error
FROM information_schema.catalog_meta_cache_statistics
WHERE catalog_name = 'hive_ctl' AND engine_name = 'hive'
ORDER BY entry_name;
이 시스템 테이블에 대한 문서는 catalog_meta_cache_statistics를 참고하세요.
지원하는 Hive 버전
Hive 1.x, 2.x, 3.x, 4.x를 지원합니다.
Hive 트랜잭션 테이블은 버전 3.x부터 지원됩니다. 자세한 내용은 "Hive 트랜잭션 테이블" 절을 참고하세요.
지원하는 메타데이터 서비스
참고: Doris 버전에 따라 지원하는 서비스 유형과 매개변수가 조금씩 다릅니다. [예제] 절을 참고하세요.
Hive Catalog 기능 지원 표
| 메타데이터 서비스 | 테이블 쿼리 | 뷰 쿼리 | DDL 작업 | 데이터 쓰기 반환 |
|---|---|---|---|---|
| Hive | ✅ | ✅ | ✅ | ✅ |
| AWS Glue | ✅ | ✅ | ❌ | ❌ |
| DLF | ✅ | ✅ | ✅ | ✅ |
지원하는 스토리지 시스템
- HDFS
- AWS S3
- Google Cloud Storage
- Azure Blob
- Apache Ozone (4.0.4부터 지원)
- Alibaba Cloud OSS
- Tencent Cloud COS
- Huawei Cloud OBS
- MINIO
Doris를 통해 Hive 테이블을 생성하고 데이터를 쓰려면 Catalog 속성에
fs.defaultFS속성을 명시적으로 추가해야 합니다. 쿼리 전용으로 Catalog를 생성하는 경우에는 이 매개변수를 생략할 수 있습니다.Doris 버전에 따라 지원하는 서비스 유형과 매개변수가 조금씩 다릅니다. [예제] 절을 참고하세요.
Parquet INT96 작성자 시간대(4.1.5부터)
선택적 Catalog 속성인 hive.parquet.time-zone은 Parquet INT96을 읽을 때 작성자 시간대를 지정합니다. 기본값은 빈 문자열이며, 이 경우 현지 시각을 그대로 유지합니다. 비어 있지 않은 값은 IANA 시간대이거나 -12:00부터 +14:00까지의 UTC 오프셋이어야 합니다. UTC와 GMT는 허용되지만 CST, PRC 같은 짧은 별칭은 허용되지 않습니다. 예를 들어 "hive.parquet.time-zone" = "Asia/Shanghai"를 사용합니다. INT96에는 시간대 주석이 없으므로 읽기 세션에서 작성자 시간대를 추론하지 마세요. Parquet를 참고하세요.
지원하는 데이터 형식
열 유형 매핑
Doris 4.2의 전체 매핑 표, 정밀도 규칙 및 지원되지 않는 유형에 대해서는 Hive에서 Doris로의 데이터 유형 매핑을 참조하세요.
예제
Hive Metastore
버전 3.1+
- HDFS
- ViewFs
- S3
- OSS
- COS
- OBS
- GCS
- Azure Blob
- Ozone
- MinIO
Kerberos 인증 없이 HMS 및 HDFS 서비스에 접근
CREATE CATALOG hive_hms_hdfs_test_catalog PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9383',
'fs.defaultFS' = 'hdfs://127.0.0.1:8520',
'hadoop.username' = 'doris'
);
Kerberos 인증이 활성화된 HMS 및 HDFS 서비스에 접근
CREATE CATALOG hive_hms_hdfs_kerberos_test_catalog PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9583',
'hive.metastore.client.principal' = 'hive/presto-master.docker.cluster@LABS.TERADATA.COM',
'hive.metastore.client.keytab' = '/keytabs/hive-presto-master.keytab',
'hive.metastore.service.principal' = 'hive/hadoop-master@LABS.TERADATA.COM',
'hive.metastore.sasl.enabled' = 'true',
'hive.metastore.authentication.type' = 'kerberos',
'fs.defaultFS' = 'hdfs://127.0.0.1:8520',
'hadoop.security.auth_to_local' = 'RULE:[2:\$1@\$0](.*@LABS.TERADATA.COM)s/@.*//
RULE:[2:\$1@\$0](.*@OTHERLABS.TERADATA.COM)s/@.*//
RULE:[2:\$1@\$0](.*@OTHERREALM.COM)s/@.*//
DEFAULT',
'hadoop.security.authentication' = 'kerberos',
'hadoop.kerberos.principal' = 'hive/presto-master.docker.cluster@LABS.TERADATA.COM',
'hadoop.kerberos.keytab' = '/keytabs/hive-presto-master.keytab'
);
CREATE CATALOG hive_viewfs PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://172.0.0.1:9083',
'fs.defaultFS' = 'viewfs://your-cluster',
'fs.viewfs.mounttable.your-cluster.link./ns1' = 'hdfs://your-nameservice/',
'fs.viewfs.mounttable.your-cluster.homedir' = '/ns1',
'dfs.nameservices' = 'your-nameservice',
'dfs.ha.namenodes.your-nameservice' = 'nn1,nn2',
'dfs.namenode.rpc-address.your-nameservice.nn1' = '172.21.0.2:8088',
'dfs.namenode.rpc-address.your-nameservice.nn2' = '172.21.0.3:8088',
'dfs.client.failover.proxy.provider.your-nameservice' = 'org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider'
);
Kerberos 인증 없이 HMS에 접근
CREATE CATALOG hive_hms_s3_test_catalog PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9383',
's3.region' = 'ap-east-1',
's3.access_key' = '<ak>',
's3.secret_key' = '<sk>'
);
IAM Assumed Role을 사용하여 S3 접근 자격 증명 가져오기(3.1.2+)
CREATE CATALOG hive_hms_on_s3_iamrole PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9383',
's3.region' = 'us-east-1',
's3.role_arn' = 'arn:aws:iam::543815668950:role/role'
);
Kerberos 인증 없이 HMS에 접근
CREATE CATALOG hive_hms_on_oss_catalog PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9383',
'oss.region' = 'cn-beijing',
'oss.endpoint' = 'oss-cn-beijing.aliyuncs.com',
'oss.access_key' = '<ak>',
'oss.secret_key' = '<sk>'
);
Kerberos 인증이 활성화된 HMS에 접근
CREATE CATALOG hive_hms_on_oss_kerberos_old_catalog PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9583',
'hive.metastore.client.principal' = 'hive/presto-master.docker.cluster@LABS.TERADATA.COM',
'hive.metastore.client.keytab' = '/keytabs/hive-presto-master.keytab',
'hive.metastore.service.principal' = 'hive/hadoop-master@LABS.TERADATA.COM',
'hive.metastore.sasl.enabled' = 'true',
'hive.metastore.authentication.type' = 'kerberos',
'hadoop.security.auth_to_local' = 'RULE:[2:\$1@\$0](.*@LABS.TERADATA.COM)s/@.*//
RULE:[2:\$1@\$0](.*@OTHERLABS.TERADATA.COM)s/@.*//
RULE:[2:\$1@\$0](.*@OTHERREALM.COM)s/@.*//
DEFAULT',
'oss.region' = 'cn-beijing',
'oss.endpoint' = 'oss-cn-beijing.aliyuncs.com',
'oss.access_key' = '<ak>',
'oss.secret_key' = '<sk>'
);
Kerberos 인증 없이 HMS에 접근
CREATE CATALOG hive_hms_cos_test_region_catalog PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9383',
'cos.region' = 'ap-beijing',
'cos.endpoint' = 'cos.ap-beijing.myqcloud.com',
'cos.access_key' = '<ak>',
'cos.secret_key' = '<sk>'
);
Kerberos 인증이 활성화된 HMS에 접근
CREATE CATALOG hive_hms_on_cos_kerberos_new_catalog PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9583',
'hive.metastore.client.principal' = 'hive/presto-master.docker.cluster@LABS.TERADATA.COM',
'hive.metastore.client.keytab' = '/keytabs/hive-presto-master.keytab',
'hive.metastore.service.principal' = 'hive/hadoop-master@LABS.TERADATA.COM',
'hive.metastore.sasl.enabled' = 'true',
'hive.metastore.authentication.type' = 'kerberos',
'hadoop.security.auth_to_local' = 'RULE:[2:\$1@\$0](.*@LABS.TERADATA.COM)s/@.*//
RULE:[2:\$1@\$0](.*@OTHERLABS.TERADATA.COM)s/@.*//
RULE:[2:\$1@\$0](.*@OTHERREALM.COM)s/@.*//
DEFAULT',
'cos.region' = 'ap-beijing',
'cos.endpoint' = 'cos.ap-beijing.myqcloud.com',
'cos.access_key' = '<ak>',
'cos.secret_key' = '<sk>'
);
Kerberos 인증 없이 HMS에 접근
CREATE CATALOG test_hive_on_hms_obs_catalog PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9383',
'obs.region' = 'cn-north-4',
'obs.endpoint' = 'obs.cn-north-4.myhuaweicloud.com',
'cos.access_key' = '<ak>',
'cos.secret_key' = '<sk>'
);
Kerberos 인증이 활성화된 HMS에 접근
CREATE CATALOG hive_hms_on_obs_kerberos_new_catalog PROPERTIES (
'type' = 'hms',
'iceberg.catalog.type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9583',
'hive.metastore.service.principal' = 'hive/hadoop-master@LABS.TERADATA.COM',
'hive.metastore.sasl.enabled' = 'true',
'hive.metastore.client.principal' = 'hive/presto-master.docker.cluster@LABS.TERADATA.COM',
'hive.metastore.client.keytab' = '/keytabs/hive-presto-master.keytab',
'hive.metastore.authentication.type' = 'kerberos',
'hadoop.security.auth_to_local' = 'RULE:[2:\$1@\$0](.*@LABS.TERADATA.COM)s/@.*//
RULE:[2:\$1@\$0](.*@OTHERLABS.TERADATA.COM)s/@.*//
RULE:[2:\$1@\$0](.*@OTHERREALM.COM)s/@.*//
DEFAULT',
'obs.region' = 'cn-north-4',
'obs.endpoint' = 'obs.cn-north-4.myhuaweicloud.com',
'obs.access_key' = '<ak>',
'obs.secret_key' = '<sk>'
);
Kerberos 인증 없이 HMS에 접근
CREATE CATALOG `hive_hms_on_gcs_new_catalog` PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9383',
'gs.access_key' = '<ak>',
'gs.secret_key' = '<sk>',
'fs.gcs.support'='true'
);
3.1.3부터 지원
CREATE CATALOG `hive_hms_on_azure_blob_new_catalog` PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9383',
'azure.account_name' = '<account_name>',
'azure.account_key' = '<account_key>',
'azure.endpoint' = 'https://<account_name>.blob.core.windows.net',
'fs.azure.support'='true'
);
4.0.4부터 지원
CREATE CATALOG `hive_hms_on_ozone_new_catalog` PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9383',
'fs.ozone.support' = 'true',
'ozone.endpoint' = 'http://ozone-s3g:9878',
'ozone.access_key' = '<ak>',
'ozone.secret_key' = '<sk>',
'ozone.region' = 'us-east-1',
'ozone.use_path_style' = 'true'
);
CREATE CATALOG test_hive_on_hms_minio_catalog PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9383',
'fs.minio.support' = 'true',
'minio.use_path_style' = 'true',
'minio.endpoint' = 'http://127.0.0.1:19001',
'minio.access_key' = '<ak>',
'minio.secret_key' = '<sk>'
);
버전 2.1 & 3.0
- HDFS
- S3
- OSS
- COS
- OBS
- GCS
- MinIO
Kerberos 인증 없이 HMS에 접근
CREATE CATALOG hive_hms_hdfs_test_catalog PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9383',
'hadoop.username' = 'doris',
'fs.defaultFS' = 'hdfs://127.0.0.1:8320'
);
Kerberos 인증이 활성화된 HMS에 접근
CREATE CATALOG test_two_hive_kerberos PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9583',
'hive.metastore.sasl.enabled' = 'true',
'hive.metastore.kerberos.principal' = 'hive/hadoop-master@LABS.TERADATA.COM',
'fs.defaultFS' = 'hdfs://127.0.0.1:8520',
'hadoop.kerberos.min.seconds.before.relogin' = '5',
'hadoop.security.authentication' = 'kerberos',
'hadoop.kerberos.principal' = 'hive/presto-master.docker.cluster@LABS.TERADATA.COM',
'hadoop.kerberos.keytab' = '/keytabs/hive-presto-master.keytab',
'hadoop.security.auth_to_local' = 'RULE:[2:\$1@\$0](.*@LABS.TERADATA.COM)s/@.*//
RULE:[2:\$1@\$0](.*@OTHERLABS.TERADATA.COM)s/@.*//
RULE:[2:\$1@\$0](.*@OTHERREALM.COM)s/@.*//
DEFAULT'
);
CREATE CATALOG hms_on_s3_catalog PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9383',
's3.region' = 'ap-east-1',
's3.endpoint' = 'https://s3.ap-east-1.amazonaws.com',
's3.access_key' = '<ak>',
's3.secret_key' = '<sk>'
);
CREATE CATALOG hive_hms_on_oss_catalog PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9383',
'oss.region' = 'cn-beijing',
'oss.endpoint' = 'oss-cn-beijing.aliyuncs.com',
'oss.access_key' = '<ak>',
'oss.secret_key' = '<sk>'
);
CREATE CATALOG hive_hms_cos_test_region_catalog PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9383',
'cos.region' = 'ap-beijing',
'cos.endpoint' = 'cos.ap-beijing.myqcloud.com',
'cos.access_key' = '<ak>',
'cos.secret_key' = '<sk>'
);
CREATE CATALOG test_hive_on_hms_obs_catalog PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9383',
'obs.region' = 'cn-north-4',
'obs.endpoint' = 'obs.cn-north-4.myhuaweicloud.com',
'obs.access_key' = '<ak>',
'obs.secret_key' = '<sk>'
);
CREATE CATALOG hive_hms_on_gcs_s3 PROPERTIES (
'type'='hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9383',
'warehouse' = 's3://bucket/gcs/paimon_warehouse',
'gs.access_key' = '<ak>',
'gs.secret_key' = '<sk>',
'gs.endpoint' = 'storage.googleapis.com'
);
CREATE CATALOG test_hive_on_hms_minio_catalog PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9383',
's3.endpoint' = 'http://127.0.0.1:19000',
's3.access_key' = '<ak>',
's3.secret_key' = '<sk>',
's3.path.style.access' = 'true'
);
AWS Glue
버전 3.1+
- S3
AWS Glue와 S3 스토리지 서비스가 동일한 인증 정보를 공유합니다.
CREATE CATALOG hive_glue_on_s3_catalog PROPERTIES (
'type' = 'hms',
'hive.metastore.type' = 'glue',
'glue.region' = 'ap-east-1',
'glue.endpoint' = 'https://glue.ap-east-1.amazonaws.com',
'glue.access_key' = '<ak>',
'glue.secret_key' = '<sk>'
);
Glue 서비스의 인증 정보가 S3 인증 정보와 다르면 다음과 같이 S3 인증 정보를 별도로 지정할 수 있습니다.
CREATE CATALOG hive_glue_on_s3_catalog PROPERTIES (
'type' = 'hms',
'hive.metastore.type' = 'glue',
'glue.region' = 'ap-east-1',
'glue.endpoint' = 'https://glue.ap-east-1.amazonaws.com',
'glue.access_key' = '<ak>',
'glue.secret_key' = '<sk>',
's3.region' = 'ap-east-1',
's3.endpoint' = 'https://s3.ap-east-1.amazonaws.com/',
's3.access_key' = '<ak>',
's3.secret_key' = '<sk>'
);
IAM Assumed Role을 사용하여 S3 접근 자격 증명 가져오기(3.1.2+부터)
CREATE CATALOG `glue_hive_iamrole` PROPERTIES (
'type' = 'hms',
'hive.metastore.type' = 'glue',
'glue.region' = 'us-east-1',
'glue.endpoint' = 'https://glue.us-east-1.amazonaws.com',
'glue.role_arn' = '<role_arn>'
);
버전 2.1 & 3.0
- S3
AWS Glue와 S3 스토리지 서비스가 동일한 인증 자격 증명을 공유합니다.
EC2가 아닌 환경에서는 aws configure를 사용하여 자격 증명 정보를 설정하고 ~/.aws 디렉터리에 자격 증명 파일을 생성해야 합니다.
또는 Catalog를 생성할 때 자격 증명 공급자 팩토리 클래스를 명시적으로 지정할 수 있습니다.
"aws.catalog.credentials.provider.factory.class" = "com.amazonaws.glue.catalog.credentials.ConfigurationAWSCredentialsProviderFactory"create catalog hive_glue PROPERTIES(
'type' = 'hms',
'hive.metastore.type' = 'glue',
'glue.endpoint' = 'https://glue.ap-northeast-1.amazonaws.com',
'glue.region' = 'ap-northeast-1',
'glue.access_key' = '<ak>',
'glue.secret_key' = '<sk>'
);
Aliyun DLF
버전 3.1+
- DLF 1.0
CREATE CATALOG hive_dlf_oss_test_catalog PROPERTIES (
'type' = 'hms',
'hive.metastore.type' = 'dlf',
'dlf.uid' = '203225413946383283',
'dlf.catalog_id' = 'p2_regression_case',
'dlf.endpoint' = 'dlf.cn-beijing.aliyuncs.com',
'dlf.region' = 'cn-beijing',
'dlf.access_key' = '<ak>',
'dlf.secret_key' = '<sk>'
);
버전 2.1 & 3.0
- DLF 1.0
CREATE CATALOG hive_dlf_oss_test_catalog PROPERTIES (
'type' = 'hms',
'hive.metastore.type' = 'dlf',
'dlf.uid' = '203225413946383283',
'dlf.catalog.id' = 'p2_regression_case',
'dlf.endpoint' = 'dlf.cn-beijing.aliyuncs.com',
'dlf.region' = 'cn-beijing',
'dlf.access_key' = '<ak>',
'dlf.secret_key' = '<sk>'
);
쿼리 작업
기본 쿼리
Catalog를 설정한 후 다음 방법으로 Catalog 내 테이블 데이터를 쿼리할 수 있습니다.
-- 1. switch to catalog, use database and query
SWITCH hive_ctl;
USE hive_db;
SELECT * FROM hive_tbl LIMIT 10;
-- 2. use hive database directly
USE hive_ctl.hive_db;
SELECT * FROM hive_tbl LIMIT 10;
-- 3. use full qualified name to query
SELECT * FROM hive_ctl.hive_db.hive_tbl LIMIT 10;
Hive 파티션 쿼리
다음 두 가지 방법으로 Hive 파티션 정보를 쿼리할 수 있습니다.
-
SHOW PARTITIONS FROM [catalog.][db.]hive_table이 문은 지정한 Hive 테이블의 모든 파티션과 해당 값을 나열합니다.
SHOW PARTITIONS FROM hive_table;
+--------------------------------+
| Partition |
+--------------------------------+
| pt1=2024-10-10/pt2=beijing |
| pt1=2024-10-10/pt2=shanghai |
| pt1=2024-10-11/pt2=beijing |
| pt1=2024-10-11/pt2=shanghai |
| pt1=2024-10-12/pt2=nanjing |
+--------------------------------+ -
table$partitions메타데이터 테이블 사용버전 2.1.7 및 3.0.3부터
table$partitions메타데이터 테이블을 통해 Hive 파티션 정보를 쿼리할 수 있습니다. 이 테이블은 각 파티션 열이 하나의 열로 표현되는 관계형 구조이므로 모든 SELECT 문에서 사용할 수 있습니다.SELECT * FROM hive_table$partitions;
+------------+-------------+
| pt1 | pt2 |
+------------+-------------+
| 2024-10-10 | beijing |
| 2024-10-10 | shanghai |
| 2024-10-12 | nanjing |
| 2024-10-11 | beijing |
| 2024-10-11 | shanghai |
+------------+-------------+
버전 4.1.4부터 Hive의 디렉터리 방식 파티셔닝에서 사용하는 기본 파티션 마커인 __HIVE_DEFAULT_PARTITION__은 문자열 \N으로 인코딩되지 않고 실제 NULL 값으로 해석됩니다. 동시에 파티션 경로에 실제로 저장된 리터럴 \N은 데이터로 보존됩니다.
4.1.4 이전에는 두 경우를 구분할 수 없어 쿼리 결과에서 모두 \N으로 표시되었습니다. 업그레이드 후에는 WHERE <partition_col> IS NULL이 Hive 기본 파티션과 올바르게 일치합니다.
Hive 트랜잭션 테이블 쿼리
Hive 트랜잭션 테이블은 ACID 의미 체계를 지원합니다. 자세한 내용은 Hive 트랜잭션을 참고하세요.
-
Hive 트랜잭션 테이블 지원
테이블 유형 Hive에서 지원하는 작업 Hive 테이블 속성 지원하는 Hive 버전 Full-ACID 트랜잭션 테이블 Insert, Update, Delete 지원 'transactional'='true'4.x, 3.x, 2.x (2.x는 읽기 전에 Hive에서 Major Compaction을 수행해야 함) Insert-Only 트랜잭션 테이블 Insert만 지원 'transactional'='true','transactional_properties'='insert_only'4.x, 3.x, 2.x (Catalog 생성 시 hive.version지정) -
현재 제한 사항
Original Files 시나리오는 지원되지 않습니다. 테이블을 트랜잭션 테이블로 변환하면 새 데이터 파일에는 Hive 트랜잭션 테이블 스키마가 사용되지만 기존 데이터 파일은 변환되지 않습니다. 이러한 파일을 Original Files라고 합니다.
Hive 뷰 쿼리
Hive 뷰를 쿼리할 수 있지만 다음과 같은 제한 사항이 있습니다.
-
Hive 뷰 정의(HiveQL)는 Doris가 지원하는 SQL 문과 호환되어야 합니다. 그렇지 않으면 구문 분석 오류가 발생합니다.
-
HiveQL이 지원하는 일부 함수는 Doris의 함수와 이름이 같아도 동작이 다를 수 있습니다. 이로 인해 Hive와 Doris에서 얻은 결과가 다를 수 있습니다. 이러한 문제가 발생하면 커뮤니티에 알려 주세요.
관련 매개변수
- 세션 변수
| 매개변수 이름 | 기본값 | 설명 | 도입 버전 |
|---|---|---|---|
hive_parquet_use_column_names | true | Doris가 Hive 테이블의 Parquet 데이터 유형을 읽을 때는 기본적으로 Hive 테이블의 열 이름에 따라 Parquet 파일에서 동일한 이름의 열을 찾아 데이터를 읽습니다. 이 변수가 false이면 열 이름과 관계없이 Hive 테이블의 열 순서에 따라 Parquet 파일에서 데이터를 읽습니다. Hive의 parquet.column.index.access 변수와 유사합니다. 이 매개변수는 최상위 열 이름에만 적용되며 Struct 내부에는 적용되지 않습니다. | 2.1.6+, 3.0.3+ |
hive_orc_use_column_names | true | hive_parquet_use_column_names와 유사하며, Hive 테이블의 ORC 데이터 유형에 사용됩니다. Hive의 orc.force.positional.evolution 변수와 유사합니다. | 2.1.6+, 3.0.3+ |
쓰기 작업
INSERT 문을 사용하여 Hive 테이블에 데이터를 쓸 수 있습니다. Doris에서 생성한 Hive 테이블이나 호환 형식의 기존 Hive 테이블에서 지원됩니다.
파티션 테이블에서는 데이터에 따라 해당 파티션에 자동으로 데이터를 쓰거나 새 파티션을 생성합니다. 4.1.5부터 PARTITION (column = literal)은 정적 파티션과 정적·동적 파티션 열의 혼합을 지원합니다. 정적 파티션 열은 INSERT 대상 열 목록과 SELECT 또는 VALUES 출력에서 제외하고, 나머지 동적 파티션 열은 입력에 포함하세요.
INSERT INTO
INSERT 작업은 대상 테이블에 데이터를 추가합니다.
INSERT INTO hive_tbl VALUES (val1, val2, val3, val4);
INSERT INTO hive_ctl.hive_db.hive_tbl SELECT col1, col2 FROM internal.db1.tbl1;
INSERT INTO hive_tbl(col1, col2) VALUES (val1, val2);
INSERT INTO hive_tbl(col1, col2, partition_col1, partition_col2) VALUES (1, 2, "beijing", "2023-12-12");
4.1.5부터 쓰기 작업에서 정적 파티션 또는 정적·동적 파티션의 혼합을 지원합니다.
-- Full Static Partition
INSERT INTO hive_tbl PARTITION (partition_col1='2026-07-30', partition_col2='beijing')
VALUES (val1, val2);
INSERT INTO hive_tbl PARTITION (partition_col1='2026-07-30', partition_col2='beijing')
SELECT col1, col2 FROM source_table;
-- Hybrid Partition Mode: "partition_col1" is static, "partition_col2" comes from SELECT dynamically
INSERT INTO hive_tbl PARTITION (partition_col1='2026-07-30')
VALUES (val1, val2, partition_val2);
INSERT INTO hive_tbl PARTITION (partition_col1='2026-07-30')
SELECT col1, col2, partition_col2 FROM source_table;
INSERT OVERWRITE
INSERT OVERWRITE는 테이블의 기존 데이터를 새 데이터로 완전히 대체합니다.
INSERT OVERWRITE TABLE hive_tbl VALUES (val1, val2, val3, val4);
INSERT OVERWRITE TABLE hive_ctl.hive_db.hive_tbl(col1, col2) SELECT col1, col2 FROM internal.db1.tbl1;
4.1.5부터 쓰기 작업에서 정적 파티션 또는 정적·동적 파티션의 혼합을 지원합니다.
-- Full Static Partition
INSERT OVERWRITE TABLE hive_tbl PARTITION (partition_col1='2026-07-30', partition_col2='beijing')
VALUES (val1, val2);
INSERT OVERWRITE TABLE hive_tbl PARTITION (partition_col1='2026-07-30', partition_col2='beijing')
SELECT col1, col2 FROM source_table;
-- Hybrid Partition Mode: "partition_col1" is static, "partition_col2" comes from SELECT dynamically
INSERT OVERWRITE TABLE hive_tbl PARTITION (partition_col1='2026-07-30')
VALUES (val1, val2, partition_val2);
INSERT OVERWRITE TABLE hive_tbl PARTITION (partition_col1='2026-07-30')
SELECT col1, col2, partition_col2 FROM source_table;
INSERT OVERWRITE의 의미 체계는 Hive와 일치하며, 다음과 같이 동작합니다.
-
대상 테이블이 파티션 테이블이고 소스 테이블이 비어 있으면 작업이 아무런 영향을 주지 않습니다. 대상 테이블은 변경되지 않습니다.
-
대상 테이블이 비파티션 테이블이고 소스 테이블이 비어 있으면 대상 테이블의 데이터가 모두 지워집니다.
-
4.1.5부터 쓰기 시 정적 파티션을 지정하거나 정적·동적 파티션을 결합한 혼합 모드를 사용할 수 있습니다. 다만 정적 파티션을 지정하더라도 소스 쿼리 결과가 비어 있으면 지정한 파티션의 데이터가 지워지지 않습니다.
정적 파티션 전체 예제(4.1.5부터)
이 페이지에 설명된 Hive Catalog를 설정하고 기존 hive_ctl.hive_db 데이터베이스를 준비한 다음 테이블 생성, 쓰기, 쿼리 권한을 부여하세요. 쓰기에 사용하는 Catalog에는 fs.defaultFS가 설정되어 있어야 합니다. 이 예제에서는 정적 날짜와 동적 지역을 결합한 뒤, 모든 키를 지정한 정적 파티션 하나를 덮어씁니다.
CREATE TABLE hive_ctl.hive_db.static_write_demo (
id INT,
dt STRING,
region STRING
)
ENGINE=HIVE
PARTITION BY LIST (dt, region) ()
PROPERTIES ("file_format" = "parquet");
INSERT INTO hive_ctl.hive_db.static_write_demo PARTITION (dt='2026-10-01')
VALUES (1, 'beijing'), (2, 'shanghai');
INSERT OVERWRITE TABLE hive_ctl.hive_db.static_write_demo
PARTITION (dt='2026-10-01', region='beijing') VALUES (3);
SELECT id, dt, region FROM hive_ctl.hive_db.static_write_demo ORDER BY id;
+----+------------+----------+
| id | dt | region |
+----+------------+----------+
| 2 | 2026-10-01 | shanghai |
| 3 | 2026-10-01 | beijing |
+----+------------+----------+
정적 파티션 값은 리터럴이어야 합니다. 파티션 키를 중복 지정하거나 명시적인 INSERT 열 목록에 정적 파티션 열을 다시 포함하지 마세요. 정적 키 이름은 대소문자를 구분하지 않고 일치 여부를 확인하며, 존재하지 않는 파티션 열을 지정하면 오류가 발생합니다.
CTAS
CTAS (CREATE TABLE AS SELECT) 문을 사용하여 Hive 테이블을 생성하고 데이터를 삽입할 수 있습니다.
CREATE TABLE hive_ctas ENGINE=hive AS SELECT * FROM other_table;
CTAS는 다음과 같이 파일 형식, 파티셔닝 방식 등의 지정을 지원합니다.
CREATE TABLE hive_ctas ENGINE=hive
PARTITION BY LIST (pt1, pt2) ()
AS SELECT col1, pt1, pt2 FROM part_ctas_src WHERE col1 > 0;
CREATE TABLE hive_ctl.hive_db.hive_ctas (col1, col2, pt1) ENGINE=hive
PARTITION BY LIST (pt1) ()
PROPERTIES (
"file_format"="parquet",
"compression"="zstd"
)
AS SELECT col1, pt1 AS col2, pt2 AS pt1 FROM test_ctas.part_ctas_src WHERE col1 > 0;
관련 매개변수
-
BE 설정
매개변수 이름 기본값 설명 hive_sink_max_file_size1GB 최대 데이터 파일 크기입니다. 데이터 크기가 이 한도를 초과하면 현재 파일을 닫고 새 파일을 생성하여 쓰기를 계속합니다. table_sink_partition_write_max_partition_nums_per_writer128 BE 노드에서 각 인스턴스가 데이터를 쓸 수 있는 최대 파티션 수입니다. table_sink_non_partition_write_scaling_data_processed_threshold25MB 비파티션 테이블에서 쓰기 확장을 시작하는 데이터량 임계값입니다. 데이터가 table_sink_non_partition_write_scaling_data_processed_threshold만큼 추가될 때마다 새 writer(인스턴스)를 사용합니다. 이 메커니즘은 데이터량에 따라 writer(인스턴스) 수를 조정하여 동시 쓰기 처리량을 높이며, 데이터량이 적을 때는 리소스를 절약하고 파일 수를 최소화합니다.table_sink_partition_write_min_data_processed_rebalance_threshold25MB 파티션 테이블의 재분배를 트리거하는 최소 데이터량 임계값입니다. current accumulated data volume-data volume since last rebalancing or initial accumulation>=table_sink_partition_write_min_data_processed_rebalance_threshold이면 재분배가 트리거됩니다. 최종 파일 크기의 편차가 크면 이 임계값을 낮춰 균형을 개선할 수 있습니다. 다만 임계값이 낮을수록 재분배 비용이 증가하여 성능에 영향을 줄 수 있습니다.table_sink_partition_write_min_partition_data_processed_rebalance_threshold15MB 재분배를 트리거하는 최소 파티션 데이터량 임계값입니다. current partition data volume>=threshold*number of tasks already allocated to the partition이면 재분배가 수행됩니다. 최종 파일 크기의 편차가 크면 이 임계값을 낮춰 균형을 개선할 수 있습니다. 다만 임계값이 낮을수록 재분배 비용이 증가하여 성능에 영향을 줄 수 있습니다.
데이터베이스 및 테이블 관리
사용자는 Doris를 통해 Hive Metastore에서 데이터베이스와 테이블을 생성하고 삭제할 수 있습니다. 이 작업에서 Doris는 Hive Metastore API만 호출하며, Hive 메타데이터를 자체적으로 저장하거나 영구 보관하지 않습니다.
데이터베이스 생성 및 삭제
SWITCH 문으로 해당 Catalog로 전환한 후 CREATE DATABASE 문을 실행할 수 있습니다.
SWITCH hive_ctl;
CREATE DATABASE [IF NOT EXISTS] hive_db;
다음과 같이 전체 정규화 이름을 사용하거나 위치를 지정하여 데이터베이스를 생성할 수도 있습니다.
CREATE DATABASE [IF NOT EXISTS] hive_ctl.hive_db;
CREATE DATABASE [IF NOT EXISTS] hive_ctl.hive_db
PROPERTIES ('location'='hdfs://172.21.16.47:4007/path/to/db/');
SHOW CREATE DATABASE 명령으로 데이터베이스의 위치 정보를 확인할 수 있습니다.
mysql> SHOW CREATE DATABASE hive_db;
+----------+---------------------------------------------------------------------------------------------+
| Database | Create Database |
+----------+---------------------------------------------------------------------------------------------+
| hive_db | CREATE DATABASE hive_db LOCATION 'hdfs://172.21.16.47:4007/usr/hive/warehouse/hive_db.db' |
+----------+---------------------------------------------------------------------------------------------+
데이터베이스를 삭제하려면 다음을 실행합니다.
DROP DATABASE [IF EXISTS] hive_ctl.hive_db;
Hive 데이터베이스를 삭제하려면 먼저 해당 데이터베이스의 모든 테이블을 삭제해야 합니다. 그렇지 않으면 오류가 발생합니다. 이 작업은 Hive의 해당 데이터베이스도 삭제합니다.
테이블 생성 및 삭제
-
테이블 생성
Doris는 Hive에서 파티션 테이블과 비파티션 테이블 생성을 모두 지원합니다.
-- Create unpartitioned hive table
CREATE TABLE unpartitioned_table (
`col1` BOOLEAN COMMENT 'col1',
`col2` INT COMMENT 'col2',
`col3` BIGINT COMMENT 'col3',
`col4` CHAR(10) COMMENT 'col4',
`col5` FLOAT COMMENT 'col5',
`col6` DOUBLE COMMENT 'col6',
`col7` DECIMAL(9,4) COMMENT 'col7',
`col8` VARCHAR(11) COMMENT 'col8',
`col9` STRING COMMENT 'col9'
) ENGINE=hive
PROPERTIES (
'file_format'='parquet'
);
-- Create partitioned hive table
-- The partition columns must be in table's column definition list
CREATE TABLE partition_table (
`col1` BOOLEAN COMMENT 'col1',
`col2` INT COMMENT 'col2',
`col3` BIGINT COMMENT 'col3',
`col4` DECIMAL(2,1) COMMENT 'col4',
`pt1` VARCHAR COMMENT 'pt1',
`pt2` VARCHAR COMMENT 'pt2'
) ENGINE=hive
PARTITION BY LIST (pt1, pt2) ()
PROPERTIES (
'file_format'='orc',
'compression'='zlib'
);
-- Create text format table(Since 2.1.7 & 3.0.3)
CREATE TABLE text_table (
`id` INT,
`name` STRING
) PROPERTIES (
'file_format'='text',
'compression'='gzip',
'field.delim'='\t',
'line.delim'='\n',
'collection.delim'=';',
'mapkey.delim'=':',
'serialization.null.format'='\\N',
'escape.delim'='\\'
);테이블을 생성한 후
SHOW CREATE TABLE명령으로 Hive 테이블 생성문을 확인할 수 있습니다.Hive의 테이블 생성 구문과 달리, Doris에서 파티션 테이블을 생성할 때는 테이블 스키마에 파티션 열을 포함해야 합니다. 또한 파티션 열은 스키마의 마지막에 배치하고 동일한 순서를 유지해야 합니다.
팁ACID 트랜잭션 기능이 기본적으로 활성화된 Hive 클러스터에서는 Doris가 생성한 테이블의
transactional속성이true로 설정됩니다. Doris는 Hive 트랜잭션 테이블의 일부 기능만 지원하므로, Doris가 직접 생성한 Hive 테이블을 읽지 못하는 문제가 발생할 수 있습니다. 이를 방지하려면 테이블 속성에"transactional" = "false"를 명시적으로 설정하여 비트랜잭션 Hive 테이블을 생성하세요.CREATE TABLE non_acid_table(
`col1` BOOLEAN COMMENT 'col1',
`col2` INT COMMENT 'col2',
`col3` BIGINT COMMENT 'col3'
) ENGINE=hive
PROPERTIES (
'transactional'='false'
); -
테이블 삭제
DROP TABLE문을 사용하여 Hive 테이블을 삭제할 수 있습니다. 테이블을 삭제하면 파티션 데이터를 포함한 모든 데이터도 삭제됩니다. -
열 유형 매핑
자세한 내용은 [열 유형 매핑] 절을 참고하세요. 다음 제한 사항에 유의하세요.
- 열은 기본값인 nullable 유형이어야 하며,
NOT NULL은 지원되지 않습니다. - Hive 3.0은 기본값 설정을 지원합니다. 기본값을 설정하려면 Catalog 속성에
"hive.version" = "3.0.0"을 명시적으로 추가하세요. - 삽입하는 데이터 유형이 호환되지 않으면(예: 숫자 유형에
'abc'삽입) 해당 값은null로 변환됩니다.
- 열은 기본값인 nullable 유형이어야 하며,
-
파티셔닝
Hive의 파티션 유형은 Doris의 List 파티션에 해당합니다. 따라서 Doris에서 Hive 파티션 테이블을 생성할 때는 List 파티션 구문을 사용하되 각 파티션을 명시적으로 나열할 필요는 없습니다. 데이터를 삽입할 때 Doris가 데이터 값에 따라 해당 Hive 파티션을 자동으로 생성합니다. 단일 열 또는 다중 열 파티션 테이블을 지원합니다.
-
파일 형식
-
ORC(기본값)
-
Parquet
DATETIME 유형을 Parquet 파일에 쓸 때 사용하는 물리적 유형은 INT64가 아닌 INT96입니다. 이는 4.0 이전 Hive 버전의 로직과 호환되도록 하기 위한 것입니다.
-
Text(버전 2.1.7 및 3.0.3부터 지원)
Text 형식은 다음 테이블 속성을 지원합니다.
field.delim: 열 구분자입니다. 기본값은\1입니다.line.delim: 행 구분자입니다. 기본값은\n입니다.collection.delim: 복합 유형의 요소 구분자입니다. 기본값은\2입니다.mapkey.delim: map 키-값 쌍의 구분자입니다. 기본값은\3입니다.serialization.null.format:NULL값을 저장하는 형식입니다. 기본값은\N입니다.escape.delim: 이스케이프 문자입니다. 기본값은\입니다.
-
-
압축 형식
- Parquet: snappy(기본값), zstd, plain(압축 없음)
- ORC: snappy, zlib(기본값), zstd, plain(압축 없음)
- Text: gzip, deflate, bzip2, zstd, lz4, lzo, snappy, plain(기본값, 압축 없음)
-
스토리지 매체
- HDFS
- 객체 스토리지
Hive Metastore 이벤트 구독
FE 노드가 HMS의 Notification Events를 주기적으로 읽도록 하면 Doris가 Hive 테이블 메타데이터의 실시간 변경 사항을 감지하여 메타데이터의 최신성을 높일 수 있습니다. 현재 다음 이벤트를 지원합니다.
| 이벤트 | 작업 및 해당 동작 |
|---|---|
| CREATE DATABASE | 해당 데이터 디렉터리에 데이터베이스를 생성합니다. |
| DROP DATABASE | 해당 데이터 디렉터리에서 데이터베이스를 삭제합니다. |
| ALTER DATABASE | 주로 데이터베이스 속성, 주석, 기본 저장 위치의 변경에 영향을 줍니다. 이러한 변경은 Doris의 외부 데이터 디렉터리 쿼리 기능에 영향을 주지 않으므로 현재 이 이벤트는 무시됩니다. |
| CREATE TABLE | 해당 데이터베이스에 테이블을 생성합니다. |
| DROP TABLE | 해당 데이터베이스에서 테이블을 삭제하고 테이블 캐시를 무효화합니다. |
| ALTER TABLE | 이름이 변경된 경우 기존 테이블을 삭제하고 새 이름으로 새 테이블을 생성합니다. 그 외에는 테이블 캐시를 무효화합니다. |
| ADD PARTITION | 해당 테이블의 캐시된 파티션 목록에 파티션을 추가합니다. |
| DROP PARTITION | 캐시된 파티션 목록에서 파티션을 제거하고 파티션 캐시를 무효화합니다. |
| ALTER PARTITION | 이름이 변경된 경우 기존 파티션을 삭제하고 새 이름으로 새 파티션을 생성합니다. 그 외에는 파티션 캐시를 무효화합니다. |
-
데이터 가져오기로 파일이 변경되면 파티션 테이블은
ALTER PARTITION이벤트를 트리거하고, 비파티션 테이블은ALTER TABLE이벤트를 트리거합니다. -
HMS를 거치지 않고 파일 시스템을 직접 조작하면 HMS가 해당 이벤트를 생성하지 않으므로 Doris는 메타데이터 변경 사항을 감지하지 못합니다.
fe.conf의 다음 매개변수가 이 기능과 관련됩니다.
-
enable_hms_events_incremental_sync: 자동 증분 메타데이터 동기화를 활성화합니다. 기본적으로 비활성화되어 있습니다. -
hms_events_polling_interval_ms: 이벤트를 읽는 간격이며, 기본값은 10000밀리초입니다. -
hms_events_batch_size_per_rpc: RPC당 읽을 최대 이벤트 수이며, 기본값은 500입니다.
이 기능을 사용하려면(Huawei Cloud MRS 제외) HMS의 hive-site.xml을 수정하고 HMS와 HiveServer2를 모두 재시작해야 합니다.
<property>
<name>hive.metastore.event.db.notification.api.auth</name>
<value>false</value>
</property>
<property>
<name>hive.metastore.dml.events</name>
<value>true</value>
</property>
<property>
<name>hive.metastore.transactional.event.listeners</name>
<value>org.apache.hive.hcatalog.listener.DbNotificationListener</value>
</property>
Huawei Cloud MRS에서는 hivemetastore-site.xml을 수정하고 HMS와 HiveServer2를 모두 재시작해야 합니다.
<property>
<name>metastore.transactional.event.listeners</name>
<value>org.apache.hive.hcatalog.listener.DbNotificationListener</value>
</property>
부록
트랜잭션 메커니즘
Hive에 대한 쓰기 작업은 별도의 트랜잭션에서 수행됩니다. 트랜잭션이 커밋되기 전에는 데이터가 외부에 보이지 않습니다. 트랜잭션이 커밋된 후에야 관련 테이블 작업이 다른 사용자에게 보입니다.
트랜잭션은 작업의 원자성을 보장합니다. 즉, 트랜잭션 내의 모든 작업은 함께 성공하거나 함께 실패합니다.
트랜잭션은 작업의 격리성을 완전히 보장하지는 못하지만, 파일 시스템 작업과 Hive Metastore 메타데이터 작업을 분리하여 불일치를 최소화하려고 합니다.
예를 들어 Hive 테이블의 여러 파티션을 수정해야 하는 트랜잭션에서 작업을 두 배치로 나누면, 두 번째 배치가 완료되기 전에 첫 번째 배치가 외부에 보일 수 있습니다. 이 경우 첫 번째 배치의 파티션은 읽을 수 있지만 두 번째 배치의 파티션은 읽을 수 없습니다.
트랜잭션 커밋 과정에서 예외가 발생하면 HDFS 파일 및 Hive Metastore 메타데이터에 대한 변경을 포함하여 트랜잭션 전체가 롤백되며, 사용자가 추가로 개입할 필요가 없습니다.
동시 쓰기 메커니즘
Apache Doris는 현재 여러 insert 문을 사용한 동시 쓰기를 지원합니다. 다만 사용자는 동시 쓰기로 인해 충돌이 발생하지 않도록 해야 합니다.
일반적인 비트랜잭션 Hive 테이블에는 완전한 트랜잭션 메커니즘이 없으므로, Apache Doris의 트랜잭션 메커니즘은 불일치가 발생하는 시간 구간을 최소화하는 것을 목표로 하지만 진정한 ACID 속성을 보장하지는 못합니다. 따라서 Apache Doris에서 Hive 테이블에 동시에 쓰면 데이터 일관성 문제가 발생할 수 있습니다.
-
동시
INSERT작업 -
INSERT작업은 데이터를 추가하며 동시에 실행해도 충돌하지 않으므로 예상한 결과를 얻을 수 있습니다. -
동시
INSERT OVERWRITE작업 -
같은 테이블이나 파티션에 대한 동시
INSERT OVERWRITE작업은 데이터 손실 또는 손상을 일으켜 예측할 수 없는 결과를 초래할 수 있습니다. -
일반적인 해결 방법은 다음과 같습니다.
-
파티션 테이블에서는 서로 다른 파티션에 데이터를 씁니다. 서로 다른 파티션에 대한 동시 작업은 충돌하지 않습니다.
-
비파티션 테이블에서는
INSERT를 사용하고INSERT OVERWRITE는 사용하지 않아 충돌을 방지합니다. -
충돌 가능성이 있는 작업은 비즈니스 로직에서 한 번에 하나의 쓰기 작업만 수행되도록 보장합니다.
-
HDFS 파일 작업
HDFS에 저장된 Hive 테이블 데이터는 일반적으로 먼저 임시 디렉터리에 쓴 다음 rename과 같은 파일 시스템 작업으로 최종 반영합니다. 다음은 데이터 작업별로 HDFS에서 수행하는 파일 작업에 대한 자세한 설명입니다.
데이터의 임시 디렉터리 형식은 /tmp/.doris_staging/<username>/<uuid>입니다.
기록되는 데이터 파일 이름의 형식은 <query-id>_<uuid>-<index>.<compress-type>.<file-type>입니다.
다양한 시나리오의 파일 작업 예는 다음과 같습니다.
-
비파티션 테이블
-
추가(데이터 추가)
-
대상 테이블 디렉터리:
hdfs://ns/usr/hive/warehouse/example.db/table1 -
임시 파일:
hdfs://ns/tmp/.doris_staging/root/f02247cb662846038baae272af5eeb05/b35fdbcea3a4e39-86d1f36987ef1492_7e3985bf-9de9-4fc7-b84e-adf11aa08756-0.orc -
커밋 단계에서 모든 임시 파일을 대상 테이블 디렉터리로 이동합니다.
-
-
덮어쓰기(데이터 대체)
-
대상 테이블 디렉터리:
hdfs://ns/usr/hive/warehouse/example.db/table1 -
임시 파일:
hdfs://ns/tmp/.doris_staging/root/f02247cb662846038baae272af5eeb05/b35fdbcea3a4e39-86d1f36987ef1492_7e3985bf-9de9-4fc7-b84e-adf11aa08756-0.orc -
커밋 단계:
-
대상 테이블 디렉터리의 이름을 임시 디렉터리 이름으로 변경합니다.
hdfs://ns/usr/hive/warehouse/example.db/_temp_b35fdbcea3a4e39-86d1f36987ef1492_table1 -
임시 디렉터리의 이름을 대상 테이블 디렉터리 이름으로 변경합니다.
-
임시로 이름을 변경한 대상 테이블 디렉터리를 삭제합니다.
-
-
-
-
파티션 테이블
-
추가(새 파티션에 추가)
-
대상 테이블 디렉터리:
hdfs://ns/usr/hive/warehouse/example.db/table2/part_col=2024-01-01 -
임시 파일:
hdfs://ns/tmp/.doris_staging/root/a7eac7505d7a42fdb06cb9ef1ea3e912/par1=a/d678a74d232345e0-b659e2fb58e86ffd_549ad677-ee75-4fa1-b8a6-3e821e1dae61-0.orc -
커밋 단계에서 임시 디렉터리의 이름을 대상 테이블 디렉터리 이름으로 변경합니다.
-
-
추가(기존 파티션에 데이터 추가)
-
대상 테이블 디렉터리:
hdfs://ns/usr/hive/warehouse/example.db/table2/part_col=2024-01-01 -
임시 파일:
hdfs://ns/tmp/.doris_staging/root/a7eac7505d7a42fdb06cb9ef1ea3e912/par1=a/d678a74d232345e0-b659e2fb58e86ffd_549ad677-ee75-4fa1-b8a6-3e821e1dae61-0.orc -
커밋 단계에서 임시 디렉터리의 파일을 대상 테이블 디렉터리로 이동합니다.
-
-
덮어쓰기(기존 파티션 대체)
-
대상 테이블 디렉터리:
hdfs://ns/usr/hive/warehouse/example.db/table2/part_col=2024-01-01 -
임시 파일:
hdfs://ns/tmp/.doris_staging/root/a7eac7505d7a42fdb06cb9ef1ea3e912/par1=a/d678a74d232345e0-b659e2fb58e86ffd_549ad677-ee75-4fa1-b8a6-3e821e1dae61-0.orc -
커밋 단계:
-
대상 파티션 디렉터리의 이름을 임시 파티션 디렉터리 이름으로 변경합니다.
hdfs://ns/usr/hive/warehouse/example.db/table2/_temp_d678a74d232345e0-b659e2fb58e86ffd_part_col=2024-01-01 -
임시 파티션 디렉터리의 이름을 대상 파티션 디렉터리 이름으로 변경합니다.
-
임시로 이름을 변경한 대상 파티션 디렉터리를 삭제합니다.
-
-
-
변경 이력
| Doris 버전 | 지원 기능 |
|---|---|
| 2.1.6 | Hive 테이블에 데이터 쓰기 반환 지원 |
| 3.0.4 | JsonSerDe 형식의 Hive 테이블 지원. Hive4의 트랜잭션 테이블 지원. |