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부터 지원됩니다. -
hive.parquet.time-zone: FileScannerV2가 Hive 테이블을 읽을 때 레거시 ParquetINT96타임스탬프를 복원하는 데 사용하는 호환성 시간대입니다. 기본값은 비어 있으며, 이 경우INT96에 저장된 현지 날짜 및 시간 필드를 시간대 변환 없이 유지합니다. Catalog의INT96파일이 쓰기 엔진에서 알려진 시간대를 기준으로 정규화된 경우에만 이 속성을 설정하세요. Hudi 테이블은 의도적으로 이 속성을 무시하고 기존 SQL 세션 시간대 동작을 유지합니다. 자세한 내용은 Parquet INT96 타임스탬프 호환성을 참조하세요.
-
-
{CommonProperties}CommonProperties에는 공통 속성을 입력합니다. Catalog 개요의 "공통 속성" 절을 참조하세요.
메타데이터 캐시
Apache Doris는 외부 데이터 소스에 접근할 때의 성능을 높이기 위해 Hive 메타데이터를 캐시합니다. 메타데이터에는 테이블 객체, 파티션 이름, 파티션 객체, 열 통계, 파일 목록, 파티션 프루닝을 위해 파생된 구조가 포함됩니다.
Doris 4.1.x 이전 버전에서는 메타데이터 캐시를 주로 FE 설정 항목으로 전역 제어합니다. 자세한 내용은 메타데이터 캐시를 참조하세요.
Doris 4.1.x부터 Hive Catalog의 외부 메타데이터 캐시는 통합된 meta.cache.* 키로 설정합니다. 아래 항목은 현재 버전을 설명합니다. Doris 4.1.x 및 4.2.x는 다른 항목 집합을 사용하며, 이 페이지의 4.x 버전에 설명되어 있습니다.
캐시 속성 설정
각 캐시 항목은 통합된 설정 키 형식인 meta.cache.<engine>.<entry>.{enable,ttl-second,capacity,max-weight}를 사용합니다. Hive의 경우 <engine>은 hive입니다. Iceberg 테이블을 포함하는 Hive Metastore Catalog는 iceberg 항목도 사용합니다. 해당 항목은 Iceberg Catalog에 설명되어 있습니다.
| 속성 | 예제 | 의미 |
|---|---|---|
enable | true/false | 이 캐시 항목을 활성화할지 여부입니다. |
ttl-second | 600, 0, -1 | 0은 항목을 비활성화합니다. 즉시 적용되므로 최신 데이터를 확인하는 데 사용할 수 있습니다. -1은 만료되지 않음을 의미하며, 그 외 양의 정수는 접근 시간을 기준으로 한 TTL을 초 단위로 나타냅니다. |
capacity | 10000 | 개수 기준 캐시 항목의 최대 수입니다. 0은 항목을 비활성화합니다. |
max-weight | 1GB | Doris 4.1.4부터 지원됩니다. 항목이 유지하는 메모리의 추정 사용량에 대한 선택적 제한입니다. 양수여야 하며, 0은 허용되지 않습니다. 아래에 표시된 항목에서만 사용할 수 있습니다. |
적용 조건: enable=true, ttl-second != 0, capacity > 0 조건을 모두 충족하면 항목이 활성화됩니다. FE 전체, Catalog 또는 항목 수준의 메모리 제한이 설정되어 있으면 추정 메모리 사용량에 따라 캐시 수용 여부를 추가로 제어합니다. 외부 메타데이터 캐시 메모리 관리를 참조하세요.
캐시 모듈
Hive Catalog에는 다음 캐시 항목이 포함됩니다. 모든 항목에서 max-weight를 사용할 수 있습니다.
항목 (<entry>) | 속성 키 접두사 | ENTRY_NAME | 캐시되는 내용 및 영향 | 기본 활성화 여부 / TTL / 용량 |
|---|---|---|---|---|
table | meta.cache.hive.table. | hive-table | Hive Metastore의 테이블 객체입니다. 영향: 계획 수립 중 Metastore와의 왕복 통신을 줄입니다. | true / 86400 s / 10000 |
partition_names | meta.cache.hive.partition_names. | hive-partition-names | 파티션 이름 목록입니다. 영향: 파티션 열거에 사용되며, 비활성화하면 새 파티션이 즉시 표시됩니다. | true / 86400 s / 10000 |
partition | meta.cache.hive.partition. | hive-partition | 위치와 입력 형식 등의 정보를 담은 파티션 객체입니다. | true / 86400 s / 100000 |
column_stats | meta.cache.hive.column_stats. | hive-column-stats | Hive Metastore의 열 통계입니다. | true / 86400 s / 10000 |
file | meta.cache.hive.file. | hive-file | 파일 목록입니다. 영향: 원격 LIST 작업을 줄이며, 비활성화하면 파일 변경 사항이 즉시 표시됩니다. | true / 86400 s / 10000 |
partition_view | meta.cache.hive.partition_view. | hive-partition-view | 파티션 이름에서 파생된 파티션 프루닝 구조입니다. | true / 86400 s / 1000 |
Hive 테이블의 열 스키마는 모든 외부 Catalog가 사용하는 공유 default 엔진(meta.cache.default.schema.*)에 캐시됩니다.
레거시 매개변수 매핑 및 변환
통합 키를 사용하는 것이 좋습니다. 다음 레거시 Catalog 속성도 계속 사용할 수 있으며, 통합 키로 매핑됩니다.
| 레거시 속성 키 | 통합 키 | 설명 |
|---|---|---|
schema.cache.ttl-second | meta.cache.default.schema.ttl-second 및 meta.cache.hive.table.ttl-second | 테이블 스키마 및 테이블 객체 캐시의 만료 시간 |
partition.cache.ttl-second | meta.cache.hive.partition_names.ttl-second | 파티션 이름 목록의 만료 시간 |
file.meta.cache.ttl-second | meta.cache.hive.file.ttl-second | 파일 목록의 만료 시간 |
권장 사용 방법
- 최신 데이터에 실시간 접근: 각 쿼리에서 외부 데이터 소스의 최신 파티션 또는 파일 변경 사항을 확인하려면 해당
ttl-second를0으로 설정하세요.-- Disable the file listing cache to see file changes in real time
ALTER CATALOG hive_ctl SET PROPERTIES ("meta.cache.hive.file.ttl-second" = "0");
-- Disable the partition name cache to see new partitions in real time
ALTER CATALOG hive_ctl SET PROPERTIES ("meta.cache.hive.partition_names.ttl-second" = "0"); - 성능 최적화: 메타데이터가 자주 변경되지 않는 경우
capacity와ttl-second를 늘려 Hive Metastore 및 파일 시스템의 접근 부하를 줄이세요. 매우 큰 테이블의 파일 목록 및 파티션 프루닝 캐시에는max-weight를 사용하여 메모리 사용량을 제한하세요.
Catalog 속성이 성공적으로 변경되면 영향을 받는 메타데이터 캐시가 삭제되고, 다음 접근 시 새 설정으로 다시 생성됩니다. meta.cache.max-weight 또는 schema.cache.ttl-second를 변경하면 Catalog의 모든 캐시가 삭제됩니다. meta.cache.<engine>.<entry>.*를 변경하면 해당 엔진의 캐시가 삭제됩니다. 이미 실행 중인 쿼리에는 영향을 주지 않습니다.
관측성
캐시 지표는 information_schema.catalog_meta_cache_statistics 시스템 테이블에서 확인할 수 있습니다. ENTRY_NAME에는 위 표에 나열된 이름이 표시되며, default 엔진 행은 공유 테이블 스키마 캐시를 나타냅니다.
SELECT engine_name, entry_name,
effective_enabled, ttl_second, capacity,
estimated_size, hit_rate, max_weight, estimated_weight
FROM information_schema.catalog_meta_cache_statistics
WHERE catalog_name = 'hive_ctl'
ORDER BY engine_name, 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 타임스탬프 호환성
Hive 테이블에는 서로 다른 엔진에서 생성한 타임스탬프 파일이 포함될 수 있습니다. 시간대 변환이 필요한지는 물리적 인코딩과 쓰기 엔진의 동작에 따라 결정됩니다. Parquet INT96 값에는 시간대 주석이 없으므로 Doris는 INT96 값에서 쓰기 엔진의 시간대를 추론하지 않습니다.
4.1.5부터 hive.parquet.time-zone에는 IANA 시간대 또는 -12:00부터 +14:00까지의 UTC 오프셋을 지정할 수 있습니다. UTC와 GMT는 허용되며, CST와 PRC 같은 짧은 별칭은 허용되지 않습니다. Parquet을 참조하세요.
Parquet INT96 타임스탬프
FileScannerV2는 Parquet 타임스탬프를 다음과 같이 처리합니다.
| 물리적 인코딩 | 기본 동작 | hive.parquet.time-zone의 영향 |
|---|---|---|
INT96을 DATETIMEV2로 매핑 | 파일에 저장된 날짜 및 시간 필드를 유지합니다. SQL 세션 시간대에 따라 값이 이동하지 않습니다. | 원시 INT96 값을 UTC 시점으로 해석하고 설정된 호환성 시간대로 변환하여 레거시 쓰기 엔진이 정규화한 타임스탬프를 복원합니다. |
timestamp 논리 타입을 갖는 INT64 | Parquet 논리 타입의 의미를 따릅니다. | 영향을 받지 않습니다. |
예를 들어, 의도한 현지 타임스탬프가 2021-01-01 10:11:00이고 시간대가 Asia/Shanghai라고 가정해 보겠습니다.
- 파일이 현지 시간 필드를
10:11:00으로 직접 저장한다면hive.parquet.time-zone을 설정하지 마세요. Doris는10:11:00을 반환하며, SQL 세션이Asia/Shanghai를 사용하더라도 동일합니다. - 레거시 쓰기 엔진이 값을 UTC로 정규화한 후
INT96으로 저장하면 파일에02:11:00이 저장될 수 있습니다.hive.parquet.time-zone을Asia/Shanghai로 설정하면 Doris가10:11:00을 복원합니다.
Catalog를 생성할 때 호환성 시간대를 설정하세요.
CREATE CATALOG hive_legacy_int96 PROPERTIES (
'type' = 'hms',
'hive.metastore.uris' = 'thrift://127.0.0.1:9083',
'hive.parquet.time-zone' = 'Asia/Shanghai'
);
값으로는 Asia/Shanghai 같은 IANA 시간대 이름이나 -12:00부터 +14:00까지의 UTC 오프셋을 사용할 수 있습니다. 유효하지 않은 값을 지정하면 Catalog 생성이 실패합니다.
hive.parquet.time-zone은 Catalog 내 Hive 테이블에서 INT96 타임스탬프 열이 DATETIMEV2로 매핑되는 모든 경우에 적용됩니다. Iceberg는 자체 타임스탬프 의미를 정의하므로 동일한 Hive Metastore에 있는 Iceberg 테이블에는 영향을 주지 않습니다. Hudi도 의도적으로 이 속성을 무시합니다. 네이티브 기본 파일 스캔과 JNI merge-on-read 스캔 모두 SQL 세션 시간대로 타임스탬프를 해석하는 기존 동작을 유지합니다. Parquet 메타데이터만으로는 INT96 쓰기 엔진이 어떤 규칙을 사용했는지 Doris가 신뢰성 있게 판단할 수 없습니다. SQL 세션 시간대와 맞추기 위한 목적으로만 이 속성을 설정하지 마세요. 하나의 Hive Metastore에 서로 다른 규칙으로 작성된 INT96 파일을 사용하는 Hive 테이블이 있다면, 가능한 경우 별도의 Catalog를 통해 접근하도록 구성하세요.
Parquet 파일을 읽는 파일 테이블 반환 함수에서도 같은 속성을 사용할 수 있습니다. 호환성 변환은 FileScannerV2의 Parquet INT96 디코딩에만 적용됩니다. FileScannerV1은 의도적으로 변경하지 않았으므로 다른 결과를 반환할 수 있습니다. FileScannerV1으로 전환하는 것은 이 변경에 대한 호환성 확보 수단이 아닙니다. Parquet INT64 논리 타임스탬프는 영향을 받지 않습니다. INT96 열이 TIMESTAMPTZ로 매핑되면 Doris는 이 속성을 무시하고 UTC 시점을 유지합니다. 해당 값의 표시는 여전히 TIMESTAMPTZ와 세션 시간대의 의미를 따릅니다.
마이그레이션 권장 사항
- Doris는 기본적으로 Parquet
INT64논리 타임스탬프를 기록합니다.enable_int96_timestamps = true는 Hive 2 또는 Hive 3 같은 레거시 읽기 엔진에서INT96이 필요한 경우에만 설정하세요. - 이 FileScannerV2 동작이 적용된 버전으로 업그레이드할 때는 배포 전에 기존 Hive 테이블을 확인하세요. 레거시 쓰기 엔진이 정규화한
INT96파일을 포함하는 Catalog는 업그레이드 후 다른 현지 시간 값을 반환할 수 있습니다. 대표적인 값을 비교하고 변환이 필요한 경우hive.parquet.time-zone을 쓰기 엔진의 시간대로 설정하세요. Hudi는 기존 세션 시간대 동작을 유지하므로 이 변경에 따른 마이그레이션이 필요하지 않습니다. hive.parquet.time-zone을 설정하기 전에 대표적인 파일을 검사하고 알려진 타임스탬프 값을 비교하세요. 불필요하게 설정하면 이 속성으로 바로잡으려던 것과 같은 종류의 시간 차이가 발생합니다.- 쓰기 엔진의
INT96처리 규칙이 다른 파일은 별도의 Catalog에 두거나, 일관된INT64인코딩으로 다시 작성하세요. - Doris가
INT96을enable_int96_timestamps = true로 명시적으로 내보내면 내보내기 세션의 시간대를 기준으로 타임스탬프를 정규화합니다. FileScannerV2로 파일을 다시 읽으려면hive.parquet.time-zone을 해당 내보내기 세션의 시간대로 설정하세요. 내보내기 개요를 참조하세요.
열 타입 매핑
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 트랜잭션 테이블의 일부 기능만 지원하므로, 자신이 생성한 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의 트랜잭션 테이블 지원. |