S3 순서 기반 데이터 적재
Doris의 지속적 데이터 적재는 실험적 기능이며 Doris 4.1.5부터 지원됩니다.
순서 기반 데이터 적재는 ORDERED_LIST를 사용해 경로와 파일 이름을 포함한 키의 사전식 순서로 새 S3 객체를 지속적으로 찾습니다. 타임스탬프나 순번이 증가하도록 이름을 지정한 로그 및 ETL 파일에 적합합니다. 이 순서는 파일을 찾는 순서를 뜻하며 대상 테이블의 행 순서를 보장하지 않습니다.
이 방식은 기본 S3 데이터 적재 모드이며 큐가 필요하지 않습니다. 파일이 순서와 관계없이 도착한다면 알림 기반 데이터 적재를 사용하세요. 미리 준비된 고정 파일 집합에는 일회성 데이터 적재를 사용하세요.
작동 방식
Doris는 가장 최근에 커밋된 키 이후의 일치하는 파일을 검색합니다. 새 키는 커밋된 키보다 사전식 순서로 커야 합니다. file1, file2, file3를 적재한 뒤 새로 업로드한 file0은 읽지 않습니다. 새 파일이 없으면 작업은 max_interval 간격으로 확인합니다.
빠른 시작
단계 1: 대상 테이블과 파일 준비
실행 계정에는 대상 테이블에 대한 LOAD 권한과 데이터베이스 및 테이블을 생성하는 데 필요한 권한이 있어야 합니다. S3 자격 증명에는 s3:ListBucket 및 s3:GetObject 권한이 필요합니다. Doris 노드는 S3 endpoint에 접근할 수 있어야 합니다.
CREATE DATABASE IF NOT EXISTS db1;
CREATE TABLE db1.tbl1 (
id INT,
name STRING
)
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 1
PROPERTIES ("replication_num" = "1");
이 예시는 단일 BE 클러스터에 복제본 하나를 사용합니다. 운영 클러스터에 맞게 복제본 수를 설정하세요. 다음 내용을 s3://bucket/001.csv로 업로드하고, SQL의 bucket, endpoint, Region, 자격 증명을 실제 값으로 바꾸세요.
1,Alice
2,Bob
단계 2: 작업 생성
기본값을 사용하려면 s3.ingestion_mode를 생략하거나, Job의 PROPERTIES에서 ORDERED_LIST로 명시적으로 설정하세요.
CREATE JOB my_job
ON STREAMING
DO
INSERT INTO db1.tbl1
select * from S3(
"uri" = "s3://bucket/*.csv",
"s3.access_key" = "<s3_access_key>",
"s3.secret_key" = "<s3_secret_key>",
"s3.region" = "<s3_region>",
"s3.endpoint" = "<s3_endpoint>",
"format" = "csv",
"column_separator" = ","
);
적재한 뒤 SELECT * FROM db1.tbl1 ORDER BY id;를 실행하세요. 예상 결과는 다음과 같습니다.
+----+-------+
| id | name |
+----+-------+
| 1 | Alice |
| 2 | Bob |
+----+-------+
단계 3: 진행 상황 확인
SELECT Name, Status, CurrentOffset, EndOffset, ErrorMsg
FROM jobs("type" = "insert")
WHERE Name = 'my_job';
001.csv가 커밋되면 Status는 RUNNING, CurrentOffset은 {"fileName":"001.csv"}일 것으로 예상됩니다. 데이터 적재를 계속하려면 002.csv처럼 사전식 순서로 더 큰 키를 업로드하세요. 새 파일이 없어도 작업은 실행 상태를 유지합니다.
매개변수
다음 항목은 Job의 PROPERTIES에서 설정합니다. S3 연결, 자격 증명, 파일 형식 옵션은 S3(...)에서 설정합니다.
| 매개변수 | 유형 | 기본값 | 필수 여부 | 설명 |
|---|---|---|---|---|
s3.ingestion_mode | 문자열 | ORDERED_LIST | 아니요 | ORDERED_LIST로 설정합니다. 생성 후에는 변경할 수 없습니다. |
offset | JSON 문자열 | 없음 | 아니요 | 지정한 키 이후부터 읽습니다. 예: '{"fileName":"data/001.csv"}'. 설정하지 않으면 일치하는 경로의 시작부터 읽습니다. |
s3.max_batch_files | 양의 정수 | 256 | 아니요 | 배치당 파일 수 임계값입니다. |
s3.max_batch_bytes | 정수 | 10737418240 | 아니요 | 배치당 바이트 수 임계값입니다. 범위는 104857600부터 10737418240까지이며 단위 접미사는 사용할 수 없습니다. |
max_interval | 양의 정수 | 10 | 아니요 | 새 파일이 없을 때 작업을 예약하는 간격(초)입니다. |
배치 임계값에 도달할 때까지 기다려야만 삽입이 시작되는 것은 아닙니다.
특정 파일 이후부터 시작
data/001.csv와 그 이전 파일을 이미 처리했다면 다음과 같이 data/002.csv부터 읽으세요.
CREATE JOB s3_after_offset_job
PROPERTIES (
"s3.ingestion_mode" = "ORDERED_LIST",
"offset" = "{\"fileName\":\"data/001.csv\"}"
)
ON STREAMING DO
INSERT INTO db1.tbl1
SELECT * FROM S3(
"uri" = "s3://bucket/data/*.csv",
"format" = "csv",
"column_separator" = ",",
"s3.region" = "<s3_region>",
"s3.endpoint" = "<s3_endpoint>",
"s3.access_key" = "<s3_access_key>",
"s3.secret_key" = "<s3_secret_key>"
);
이 설정은 data/001.csv와 그보다 작은 모든 키를 건너뛰고, 이후의 일치하는 키만 적재합니다. 빠른 시작 예시와 데이터가 중복되지 않도록 이 예시에는 별도의 대상 테이블을 사용하세요.
데이터 적재 모드와 S3 URI는 생성 후 변경할 수 없습니다. 모드나 경로를 바꾸려면 새 작업을 생성하세요.
문제 해결 및 제한 사항
- 새 파일이 적재되지 않음: 키가 URI와 일치하고
CurrentOffset보다 큰지 확인하세요. 커서 이전에 추가된 파일은 자동으로 소급 적재되지 않습니다. 소급 적재에는 별도의 접두사와 일회성 작업을 사용하거나, 파일을 업로드하기 전에 알림 기반 데이터 적재를 설정하세요. - 예상과 다른 순서:
000001.csv처럼 고정 길이 타임스탬프나 앞을 0으로 채운 순번을 사용하세요. 그렇지 않으면file10이file2보다 앞에 정렬됩니다. - 객체가 덮어써지거나 삭제됨: 각 키를 고유하게 유지하고 적재 중에는 내용을 변경하지 않으며 읽을 수 있도록 유지하세요. 이미 커밋된 객체를 덮어써도 다시 적재되지 않습니다.
- 빈 경로에서 생성 실패: 작업을 생성할 때 S3 TVF가 스키마를 추론하려면 일치하는, 읽을 수 있는 비어 있지 않은 파일이 필요합니다.
작업 일시 중지, 재개 및 태스크 확인은 지속적 데이터 적재 개요를 참조하세요. 작업을 수정하려면 ALTER JOB을 참조하세요.