メインコンテンツまでスキップ
に最終更新

Amazon S3

Doris では、Amazon S3 からファイルをロードする方法として、非同期シナリオと同期シナリオにそれぞれ適した 2 つの方法を提供しています。

方法種類用途
S3 Load非同期大規模バッチデータのロード、スケジュール済みジョブ、高スループットと安定性が必要なオフラインロード
TVF (Table Value Function)同期アドホッククエリ、ETL 処理、INSERT INTO ... SELECT と組み合わせた同期書き込み

ヒント: S3 Load は Broker Load に基づいて実装されています。詳細な動作については、Broker Load マニュアルを参照してください。

方法 1: S3 Load でロード(非同期)​

S3 Load は非同期のロード方式です。送信後すぐに戻り、バックグラウンドで実行されます。データ量が多いシナリオや、バックグラウンドでのバッチ処理が必要なシナリオに適しています。

ステップ 1: データを準備する​

S3 上に s3load_example.csv という 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" = "https://s3.us-west-2.amazonaws.com",
"s3.region" = "us-west-2",
"s3.access_key" = "<your-ak>",
"s3.secret_key" = "<your-sk>"
)
PROPERTIES
(
"timeout" = "3600"
);

主なパラメータ:

パラメータ説明
DATA INFILES3 上でロードするファイルの URI。形式は s3://bucket/path
COLUMNS TERMINATED BYCSV の列区切り文字
FORMAT ASファイル形式。例:CSV
providerオブジェクトストレージプロバイダー。AWS S3 には S3 を指定
s3.endpointS3 サービスのエンドポイント。例:s3.us-west-2.amazonaws.com
s3.regionS3 バケットが存在するリージョン
s3.access_keyAWS Access Key
s3.secret_keyAWS Secret Key
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)

方法 2: TVF でロード(同期)​

TVF (Table Value Function) は S3 上のファイルをテーブルとして扱います。SELECT で直接クエリを実行でき、INSERT INTO と組み合わせて結果を Doris のテーブルに同期的に書き込めます。結果をすぐに確認する必要があり、データ量が中程度のシナリオに適しています。

ステップ 1: データを準備する​

S3 上に s3load_example.csv という 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",
"s3.endpoint" = "https://s3.us-west-2.amazonaws.com",
"s3.region" = "us-west-2",
"s3.access_key" = "<your-ak>",
"s3.secret_key" = "<your-sk>",
"column_separator" = ",",
"csv_schema" = "user_id:int;name:string;age:int"
);

主なパラメータ:

パラメータ説明
uriS3 上で読み取るファイルの URI
formatファイル形式。例:csv
s3.endpointS3 サービスのエンドポイント
s3.regionS3 バケットが存在するリージョン
s3.access_keyAWS Access Key
s3.secret_keyAWS Secret Key
column_separator列区切り文字
csv_schemaCSV ファイルのスキーマ定義。形式は column_name:type;...

ステップ 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)

AWS Assume Role による認証​

Access Key / Secret Key の使用に加えて、Doris は AWS Assume Role による S3 Load および TVF の認証にも対応しています。認証情報の配布を制限している企業に適しています。詳細な設定については、AWS 統合 - Assumed Role 認証を参照してください。

FAQ​

Q1: S3 Load と TVF はどのように選択すればよいですか?

  • 大規模バッチ、オフライン処理、スケジュール済みジョブの場合:S3 Load を優先します(非同期、バックグラウンドで実行、タイムアウト制御に対応)。
  • アドホッククエリや、書き込む前に SQL でデータを処理する必要がある場合:TVF を優先します(同期、SELECT / INSERT と組み合わせ可能)。

Q2: S3 ファイルの Region と Endpoint はどのように指定しますか?

  • s3.region を使用してバケットが存在するリージョンを指定します。例:us-west-2。
  • s3.endpoint を使用してサービスアドレスを指定します。例:s3.us-west-2.amazonaws.com。
  • 2 つの値は一致している必要があります。一致しない場合、接続失敗やリダイレクトエラーが発生する可能性があります。

Q3: TVF ロードでは csv_schema が必須ですか?

ソースファイルが CSV の場合は、各列の名前と型を指定するために csv_schema を明示的に指定することをお勧めします。これにより、型推論による不確実性を回避できます。

Q4: S3 Load ジョブの実行時間が長すぎる場合はどうすればよいですか?

timeout を PROPERTIES 内で適切に増やします(単位は秒)。例では 3600 を使用しており、データ規模に応じて調整できます。

トラブルシューティング​

症状考えられる原因推奨される対処
S3 への接続に失敗 / タイムアウトs3.endpoint が s3.region と一致していない、またはネットワークに到達できないEndpoint と Region を確認し、Doris BE ノードが S3 にアクセスできることを確認する
認証に失敗(403)Access Key / Secret Key が正しくない、または権限が不足しているAK/SK が正しいか確認し、対応するバケットとオブジェクトに対する読み取り権限を確認する
ファイルが見つからないDATA INFILE / uri のパスが正しくないバケット名、キーのパス、大文字と小文字を確認する
CSV の解析エラー区切り文字またはスキーマが一致していないCOLUMNS TERMINATED BY / column_separator と csv_schema を確認する
ジョブがタイムアウトするデータ量が多い、またはネットワークが遅いtimeout を増やすか、ファイルを分割して並列ロードする