본문으로 건너뛰기
최종 수정: 에

S3 호환 스토리지

Apache Doris는 MinIO, Ceph, Huawei Cloud OBS, Tencent Cloud COS 등 S3 프로토콜과 호환되는 다양한 객체 스토리지 시스템에서 데이터를 적재할 수 있습니다. 이 문서에서는 두 가지 데이터 적재 방식의 적용 시나리오와 전체 절차를 설명합니다.

방식 선택​

데이터 크기와 처리 모드에 따라 적절한 데이터 적재 방식을 선택하세요:

데이터 적재 방식모드적용 시나리오참고 자료
S3 Load비동기대규모 배치 데이터 적재, 작업 관리 및 재시도 메커니즘 필요Broker Load 매뉴얼
TVF (Table Value Function)동기임시 쿼리, 소규모 배치 데이터 적재, SQL에서 직접 데이터 사용-
참고

S3 SDK는 기본적으로 virtual-hosted style로 객체 스토리지에 접근합니다. 대상 스토리지 시스템에서 이 방식을 활성화하지 않았거나 지원하지 않는 경우, "use_path_style" = "true" 매개변수를 추가하여 path style을 강제로 사용하도록 설정하세요.

S3 Load로 데이터 적재(비동기)​

S3 Load는 대규모 배치 데이터 적재에 적합합니다. 데이터 적재 작업은 비동기로 제출되며, Doris가 백그라운드에서 스케줄링합니다. 자세한 동작 원리는 Broker Load 매뉴얼을 참조하세요.

1단계: 데이터 준비​

S3 호환 스토리지에 다음 내용의 CSV 파일 s3load_example.csv를 생성하세요:

1,Emily,25
2,Benjamin,35
3,Olivia,28
4,Alexander,60
5,Ava,17
6,William,69
7,Sophia,32
8,James,64
9,Emma,37
10,Liam,64

2단계: Doris에 대상 테이블 생성​

CREATE TABLE test_s3load(
user_id BIGINT NOT NULL COMMENT "user id",
name VARCHAR(20) COMMENT "name",
age INT COMMENT "age"
)
DUPLICATE KEY(user_id)
DISTRIBUTED BY HASH(user_id) BUCKETS 10;

3단계: S3 Load 작업 제출​

LOAD LABEL s3_load_2022_04_01
(
DATA INFILE("s3://your_bucket_name/s3load_example.csv")
INTO TABLE test_s3load
COLUMNS TERMINATED BY ","
FORMAT AS "CSV"
(user_id, name, age)
)
WITH S3
(
"provider" = "S3",
"s3.endpoint" = "play.min.io:9000",
"s3.region" = "us-east-1",
"s3.access_key" = "<your-ak>",
"s3.secret_key" = "<your-sk>",
"use_path_style" = "true"
)
PROPERTIES
(
"timeout" = "3600"
);

주요 매개변수:

매개변수설명
provider객체 스토리지 공급자 유형입니다. S3 호환 스토리지에는 항상 S3를 사용하세요.
s3.endpointS3 호환 스토리지의 접근 엔드포인트입니다(프로토콜 접두사 제외).
s3.region버킷이 위치한 리전입니다.
s3.access_key액세스 키(AK)입니다.
s3.secret_key시크릿 키(SK)입니다.
use_path_stylepath style 접근을 사용할지 여부입니다. MinIO 등의 스토리지 시스템에서는 일반적으로 이 값을 true로 설정해야 합니다.
timeout데이터 적재 작업의 제한 시간이며, 단위는 초입니다.

4단계: 데이터 적재 결과 확인​

SELECT * FROM test_s3load;

예상 출력:

mysql> select * from test_s3load;
+---------+-----------+------+
| user_id | name | age |
+---------+-----------+------+
| 5 | Ava | 17 |
| 10 | Liam | 64 |
| 7 | Sophia | 32 |
| 9 | Emma | 37 |
| 1 | Emily | 25 |
| 4 | Alexander | 60 |
| 2 | Benjamin | 35 |
| 3 | Olivia | 28 |
| 6 | William | 69 |
| 8 | James | 64 |
+---------+-----------+------+
10 rows in set (0.04 sec)

TVF로 데이터 적재(동기)​

TVF는 S3 호환 스토리지의 파일을 테이블로 취급하여 쿼리할 수 있게 합니다. INSERT INTO ... SELECT와 함께 사용하면 동기 데이터 적재가 가능하며, 임시 분석과 소규모 배치 데이터 적재에 적합합니다.

1단계: 데이터 준비​

S3 호환 스토리지에 다음 내용의 CSV 파일 s3load_example.csv를 생성하세요:

1,Emily,25
2,Benjamin,35
3,Olivia,28
4,Alexander,60
5,Ava,17
6,William,69
7,Sophia,32
8,James,64
9,Emma,37
10,Liam,64

2단계: Doris에 대상 테이블 생성​

CREATE TABLE test_s3load(
user_id BIGINT NOT NULL COMMENT "user id",
name VARCHAR(20) COMMENT "name",
age INT COMMENT "age"
)
DUPLICATE KEY(user_id)
DISTRIBUTED BY HASH(user_id) BUCKETS 10;

3단계: TVF로 동기 데이터 적재​

INSERT INTO test_s3load
SELECT * FROM S3
(
"uri" = "s3://your_bucket_name/s3load_example.csv",
"format" = "csv",
"provider" = "S3",
"s3.endpoint" = "play.min.io:9000",
"s3.region" = "us-east-1",
"s3.access_key" = "<your-ak>",
"s3.secret_key" = "<your-sk>",
"column_separator" = ",",
"csv_schema" = "user_id:int;name:string;age:int",
"use_path_style" = "true"
);

주요 매개변수:

매개변수설명
uriS3 호환 스토리지에 있는 파일의 전체 경로입니다.
format파일 형식입니다. 예: csv, parquet, orc.
provider객체 스토리지 공급자 유형입니다. S3 호환 스토리지에는 항상 S3를 사용하세요.
s3.endpointS3 호환 스토리지의 접근 엔드포인트입니다.
s3.region버킷이 위치한 리전입니다.
s3.access_key액세스 키(AK)입니다.
s3.secret_key시크릿 키(SK)입니다.
column_separator열 구분자입니다.
csv_schemaCSV 파일의 열 정의이며, field_name:type 형식을 사용합니다.
use_path_stylepath style 접근을 사용할지 여부입니다.

4단계: 데이터 적재 결과 확인​

SELECT * FROM test_s3load;

예상 출력:

mysql> select * from test_s3load;
+---------+-----------+------+
| user_id | name | age |
+---------+-----------+------+
| 5 | Ava | 17 |
| 10 | Liam | 64 |
| 7 | Sophia | 32 |
| 9 | Emma | 37 |
| 1 | Emily | 25 |
| 4 | Alexander | 60 |
| 2 | Benjamin | 35 |
| 3 | Olivia | 28 |
| 6 | William | 69 |
| 8 | James | 64 |
+---------+-----------+------+
10 rows in set (0.04 sec)

자주 묻는 질문​

1. MinIO 등의 스토리지에 접근할 때 버킷이 존재하지 않거나 버킷 이름을 확인할 수 없다는 오류가 발생하는 이유는 무엇인가요?​

S3 SDK는 기본적으로 virtual-hosted style로 도메인 이름을 구성하지만(예: bucket.endpoint), MinIO, Ceph 및 이와 유사한 시스템은 일반적으로 path style을 사용합니다(예: endpoint/bucket). 데이터 적재 매개변수에 "use_path_style" = "true"를 추가하면 이 문제를 해결할 수 있습니다.

2. s3.endpoint에 http:// 또는 https:// 접두사를 포함해야 하나요?​

아니요. s3.endpoint에는 호스트 이름과 포트만 지정합니다(예: play.min.io:9000).

3. S3 Load와 TVF 중 어떤 방식을 선택해야 하나요?​

  • 데이터 양이 많고 비동기 실행과 작업 이력 보존이 필요하면 S3 Load를 사용하세요.
  • 단일 SQL 문으로 S3 파일을 읽고 INSERT INTO ... SELECT로 결과를 동기적으로 기록해야 한다면 TVF를 사용하세요.

4. 데이터 적재 작업의 제한 시간이 초과되면 어떻게 해야 하나요?​

S3 Load의 timeout 속성(초 단위)을 늘리거나, 대용량 파일을 여러 개의 작은 파일로 나누어 동시성을 높이세요.