Broker Load は非同期の一括インポート方式で、分散ストレージシステム(Hadoop 分散ファイルシステム (HDFS)、Object Storage Service (OSS)、Amazon Simple Storage Service (Amazon S3))から ApsaraDB for SelectDB に直接データをロードします。単一のインポートジョブで数百 GB のデータを処理でき、クラスターをブロックしません。
仕組み
MySQL プロトコル経由で
LOAD LABEL文を送信します。ジョブは即座に受理され、非同期で実行されます。ブローカーがリモートストレージシステムに接続し、指定されたファイルを読み取ります。
データがターゲットテーブルにロードされます。複数のテーブルにロードする場合、そのジョブ内のすべての書き込み操作はアトミック(不可分)です。
ラベルにはジョブの完了状態が記録され、同じリクエストを再送信しても重複インポートを防止します。
パフォーマンス
データ量 | 想定完了時間 |
~100 MB | ~10 秒 |
~100 GB | ~10 分 |
前提条件
作業を開始する前に、以下の要件を満たしていることを確認してください。
ApsaraDB for SelectDB インスタンス。
ソースストレージシステム(HDFS、OSS、または Amazon S3)へのネットワークアクセスが可能であること。リモートストレージシステムがパブリックネットワーク環境にデプロイされている場合、ご利用の ApsaraDB for SelectDB インスタンスはパブリックネットワークアクセスを有効にする必要があります。詳細については、「データソースのネットワーク問題の解決」をご参照ください。
ターゲットテーブルがご利用の SelectDB インスタンス内に作成済みであること。
Broker Load ジョブの送信
構文
LOAD LABEL load_label
(
data_desc1[, data_desc2, ...]
)
WITH broker_type
[broker_properties]
[load_properties];パラメーター
パラメーター | 説明 |
| ジョブの一意な識別子で、形式は |
| インポートするファイルを記述します。詳細については、「データ記述パラメーター」をご参照ください。 |
| ブローカータイプ。有効な値は |
| リモートストレージシステムへの接続パラメーター。形式は |
| インポート動作に関するパラメーター。詳細については、「インポートプロパティ」をご参照ください。 |
データ記述パラメーター
[MERGE|APPEND|DELETE]
DATA INFILE
(
"file_path1"[, file_path2, ...]
)
[NEGATIVE]
INTO TABLE `table_name`
[PARTITION (p1, p2, ...)]
[COLUMNS TERMINATED BY "column_separator"]
[FORMAT AS "file_type"]
[(column_list)]
[COLUMNS FROM PATH AS (c1, c2, ...)]
[PRECEDING FILTER predicate]
[SET (column_mapping)]
[WHERE predicate]
[DELETE ON expr]
[ORDER BY source_sequence]
[PROPERTIES ("key1"="value1", ...)]パラメーター | 説明 |
| マージモード。デフォルトは |
| インポートするファイルのパス。複数のパスおよびワイルドカードがサポートされています。各パスはディレクトリではなく、実際のファイルを指している必要があります。 |
| SUM 関数で集計される整数値を反転させます。誤ってインポートされたデータを相殺するために使用します。INTEGER 型の列で SUM 集計を行う場合にのみ有効です。 |
| 特定のパーティションに限定してインポートを行います。指定されたパーティション外のデータは除外されます。 |
| 列区切り文字。CSV ファイルにのみ適用されます。シングルバイトのデリミタのみ使用可能です。 |
| ファイル形式。デフォルトは |
| ソースファイル内の列の順序。 |
| ファイルパスから列を抽出します。 |
|
|
| インポート中に適用される列変換式。 |
| 列マッピング後に適用される行フィルター。条件に一致する行のみがインポートされます。 |
|
|
| データの順序を維持するためのシーケンス列を指定します。Unique Key モデルのテーブルでのみ有効です。 |
| ファイル形式固有のパラメーター。JSON ファイルの場合は |
インポートプロパティ
パラメーター | デフォルト | 説明 |
|
| タイムアウト時間(秒)。タイマーはジョブ送信時に開始されます。この期間内にジョブが完了しない場合、失敗とみなされます。 |
|
| 許容されるエラー行の最大比率( |
|
| ジョブに割り当てられる最大メモリ量(バイト単位)。 |
|
|
|
|
| タイムゾーンに依存する関数( |
|
| インポートの並列処理の次数(DOP)。この値を |
| — | データバッチ送信時の並列処理の次数(DOP)。計算クラスターのバックエンド(BE)構成における |
|
|
|
使用例
以下の例はすべて同じテーブル構造を使用しています。最初に次の文を実行して、テーブルとサンプルデータファイルを作成してください。
テーブルの作成
CREATE TABLE test_table
(
id int,
name varchar(50),
age int,
address varchar(50)
)
UNIQUE KEY(`id`)
DISTRIBUTED BY HASH(id) BUCKETS 4
PROPERTIES("replication_num" = "1");
CREATE TABLE test_table2
(
id int,
name varchar(50),
age int,
address varchar(50)
)
DISTRIBUTED BY HASH(id) BUCKETS 4
PROPERTIES("replication_num" = "1");サンプルデータファイル
file1.txt(カンマ区切り):
1,tomori,32,shanghai
2,anon,22,beijing
3,taki,23,shenzhen
4,rana,45,hangzhou
5,soyo,14,shanghai
6,saki,25,hangzhou
7,mutsumi,45,shanghai
8,uika,26,shanghai
9,umiri,27,shenzhen
10,nyamu,37,shanghaifile2.csv(カンマ区切り):
1,saki,25,hangzhou
2,mutsumi,45,shanghai
3,uika,26,shanghai
4,umiri,27,shenzhen
5,nyamu,37,shanghai例 1:HDFS から CSV ファイルをインポート
カンマを列区切り文字として使用し、file1.txt を test_table にインポートします。fs.defaultFS プロパティは HDFS クラスターへの接続に必須です。
LOAD LABEL example_db.label1
(
DATA INFILE("hdfs://hdfs_host:hdfs_port/example/file1.txt")
INTO TABLE `test_table`
COLUMNS TERMINATED BY ","
)
WITH HDFS
(
"fs.defaultFS" = "hdfs://hdfs_host:hdfs_port"
);例 2:1 つのジョブで複数のファイルを複数のテーブルにインポート
file2.csv を test_table に、file1.txt を test_table2 に、1 つのアトミックジョブでインポートします。SET 句により、ソースファイルの temp_age 列を使用して age 列の値を 1 増分します。
LOAD LABEL test_db.test_02
(
DATA INFILE("hdfs://hdfs_host:hdfs_port/example/file2.csv")
INTO TABLE `test_table`
COLUMNS TERMINATED BY ","
(id, name, temp_age, address)
SET (
age = temp_age + 1
),
DATA INFILE("hdfs://hdfs_host:hdfs_port/example/file1.txt")
INTO TABLE `test_table2`
COLUMNS TERMINATED BY ","
)
WITH HDFS
(
"fs.defaultFS" = "hdfs://hdfs_host:hdfs_port"
);例 3:高可用性(HA)モードの HDFS クラスターからのインポート
ワイルドカードを使用して /example/ ディレクトリ内のすべてのファイルをインポートします。\\x01 デリミタは Hive のデフォルトのフィールド区切り文字です。
LOAD LABEL test_db.test_03
(
DATA INFILE("hdfs://hdfs_host:hdfs_port/example/*")
INTO TABLE `test_table`
COLUMNS TERMINATED BY "\\x01"
)
WITH HDFS
(
"hadoop.username" = "hive",
"fs.defaultFS" = "hdfs://my_ha",
"dfs.nameservices" = "my_ha",
"dfs.ha.namenodes.my_ha" = "my_namenode1, my_namenode2",
"dfs.namenode.rpc-address.my_ha.my_namenode1" = "nn1_host:rpc_port",
"dfs.namenode.rpc-address.my_ha.my_namenode2" = "nn2_host:rpc_port",
"dfs.client.failover.proxy.provider.my_ha" = "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider"
);例 4:行フィルターを使用したインポート
file1.txt から age < 20 の条件を満たす行のみをインポートします。
LOAD LABEL test_db.test_04
(
DATA INFILE("hdfs://host:port/example/file1.txt")
INTO TABLE `test_table2`
COLUMNS TERMINATED BY ","
(id, name, age, address)
WHERE age < 20
)
WITH HDFS
(
"fs.defaultFS" = "hdfs://hdfs_host:hdfs_port"
);例 5: タイムアウトとエラー許容を伴う MERGE モード
Unique Key モデルを使用する test_table に file1.txt を MERGE モードでインポートします。age < 20 の行は削除対象としてマークされます。このジョブは最大 10% のエラー行を許容し、タイムアウトは 1 時間に設定されています。
LOAD LABEL test_db.test_05
(
MERGE DATA INFILE("hdfs://hdfs_host:hdfs_port/example/file1.txt")
INTO TABLE `test_table`
COLUMNS TERMINATED BY ","
(id, name, age, address)
DELETE ON age < 20
)
WITH HDFS
(
"fs.defaultFS" = "hdfs://hdfs_host:hdfs_port"
)
PROPERTIES
(
"timeout" = "3600",
"max_filter_ratio" = "0.1"
);ジョブステータスの確認
Broker Load は非同期で実行されます。LOAD LABEL の送信が成功しても、データのロードが完了したことを意味するものではなく、ジョブが受理されたことを示すだけです。進行状況を追跡するには SHOW LOAD を使用してください。
構文
SHOW LOAD
[FROM db_name]
[
WHERE
[LABEL [ = "your_label" | LIKE "label_matcher"]]
[STATE = ["PENDING"|"ETL"|"LOADING"|"FINISHED"|"CANCELLED"]]
]
[ORDER BY ...]
[LIMIT limit][OFFSET offset];パラメーター
パラメーター | 説明 |
| クエリ対象のデータベース。省略時は現在のデータベースが使用されます。 |
| ラベルによるフィルター。完全一致および |
| ジョブ状態によるフィルター。 |
| 結果のソート方法。 |
| 返される結果の件数を制限します。省略時はすべての結果が返されます。 |
| 先頭から N 件の結果をスキップします。デフォルトは |
ジョブ状態
状態 | 意味 | 対応方法 |
| ジョブがキューに登録され、実行を待機中です。 | 待機してください。長時間 PENDING 状態が続く場合は、キューの深さを監視してください。 |
| データの抽出および変換が進行中です。 | 待機してください。 |
| データがテーブルに書き込まれています。 | 待機してください。 |
| インポートが正常に完了しました。 | 特に操作は不要です。 |
| ジョブがキャンセルされたか、失敗しました。このラベルは新しいジョブで再利用可能です。 |
|
出力カラム
SHOW LOAD は各ジョブについて以下のカラムを返します。
カラム | 説明 |
| SelectDB が割り当てる内部ジョブ ID。 |
|
|
| 現在のジョブ状態。「ジョブ状態」をご参照ください。 |
| インポート進捗率(パーセント表示)。 |
| インポートタイプ(例: |
| ETL フェーズの統計情報(行数、フィルターされた行数など)。 |
| タスクレベルの詳細情報(クラスター、タイムアウト、 |
| ジョブが失敗またはキャンセルされた場合のエラーメッセージ。 |
| ジョブ作成時刻。 |
| ETL フェーズ開始時刻。 |
| ETL フェーズ終了時刻。 |
| ロードフェーズ開始時刻。 |
| ロードフェーズ終了時刻。 |
| エラーログへの URL。ジョブが失敗した場合や |
| ファイルごとの統計情報を含む JSON オブジェクト(スキャンされた行数、フィルターされた行数、選択されなかった行数など)。 |
ジョブが CANCELLED 状態の場合、再送信前にErrorMsgおよびURLフィールドを使用して障害を診断してください。
使用例
ラベルパターンでジョブを検索し、古い順に 10 件取得
SHOW LOAD FROM example_db WHERE LABEL LIKE "2014_01_02" LIMIT 10;特定のジョブを検索し、開始時刻でソート
SHOW LOAD FROM example_db
WHERE LABEL = "load_example_db_20140102"
ORDER BY LoadStartTime DESC;LOADING 状態のジョブを検索
SHOW LOAD FROM example_db
WHERE LABEL = "load_example_db_20140102" AND STATE = "loading";結果をページネーション:先頭 5 件をスキップし、次の 10 件を取得
SHOW LOAD FROM example_db ORDER BY LoadStartTime DESC LIMIT 10 OFFSET 5;ジョブのキャンセル
PENDING、ETL、または LOADING 状態のジョブは CANCEL LOAD を使用してキャンセルできます。キャンセルされたジョブによって書き込まれたデータは自動的にロールバックされます。
構文
CANCEL LOAD
[FROM db_name]
WHERE [LABEL = "load_label" | LABEL LIKE "label_pattern"];パラメーター
パラメーター | 説明 |
| ジョブが含まれるデータベース。省略時は現在のデータベースが使用されます。 |
| キャンセル対象のジョブの正確なラベル、または |
使用例
特定のジョブをキャンセル
CANCEL LOAD
FROM example_db
WHERE LABEL = "example_db_test_load_label";ラベルが `example_` で始まるすべてのジョブをキャンセル
CANCEL LOAD
FROM example_db
WHERE LABEL LIKE "example_";ベストプラクティス
個々のジョブのデータ量を 100 GB 未満に抑える
1 ジョブあたりのデータ上限はノード数 × 3 GB です。大規模なデータセットの場合は、1 つの大きなジョブではなく複数のジョブに分割してください。これにより、ジョブが失敗した場合のリトライコストを削減し、進行状況の追跡も容易になります。
トレーサビリティを考慮したラベル設計
メタデータをエンコードしたラベルを使用してください(例:etl_orders_20260328_batch01)。これにより、失敗したジョブの特定、特定バッチの再実行、SHOW LOAD を使用したロード履歴の監査が容易になります。
送信前にキュー状況を監視する
SelectDB はクラスターあたりの同時インポートジョブ数を 3~10 に制限しており、キュー上限は 100 です。キュー上限を超えたジョブは即座に拒否されます。新しいジョブを送信する前に、SHOW LOAD を使用してアクティブおよびキュー中のジョブを監視してください。
キュー待ち時間もジョブのタイムアウトに含まれます。キュー内で実行開始までに時間がかかりすぎると、タイムアウトによりジョブがキャンセルされる可能性があります。ワークロードにキュー遅延が含まれる場合は、timeout プロパティを調整してください。データ品質に基づいて max_filter_ratio を設定する
値 | 動作 | 使用タイミング |
| いずれかの行にフォーマットエラーがあるとジョブが失敗し、行はスキップされません。 | 信頼性が高く、検証済みのソースデータ。 |
| SelectDB は指定された比率までの不正なフォーマットの行をスキップし、ジョブを完了させます。 | 少数の不正フォーマット行が許容可能な大規模インポート。 |
| 上記と同様ですが、高い比率は通常、上流のデータ品質に問題があることを示唆します。 | このしきい値を引き上げる前に、ソースデータを調査してください。 |
ジョブが失敗または行をスキップした場合、SHOW LOAD の URL フィールドに記載された URL を開き、どの行が拒否されたのか、その理由を正確に確認してください。
大規模インポートには load_parallelism を使用する
load_parallelism を 1 より大きい値に設定すると、複数の実行計画が同時に実行されます。これにより大規模ファイルのインポートが高速化されますが、メモリ使用量も増加します。クラスターの容量に応じて、2 または 4 から開始し、必要に応じて調整してください。
ラベルによる冪等性の確保
Broker Load はラベル単位で at-most-once セマンティクスを保証します。特定のラベルを持つジョブが成功(FINISHED 状態)した場合、同じラベルを再送信しても効果はありません。ジョブが失敗またはキャンセルされた場合は、そのラベルを再利用できます。再送信の判断を行う前に、必ず SHOW LOAD で状態を確認してください。
使用制限
制限項目 | 値 |
クラスターあたりの同時インポートジョブ数 | 3~10 |
最大キュー長 | 100(この上限を超えるジョブは拒否されます) |
デフォルトタイムアウト | 4 時間(ジョブ送信時からタイマーが開始され、キュー待ち時間も含まれます) |
列区切り文字 | シングルバイトのデリミタのみ。CSV ファイルにのみ適用。 |
MERGE および DELETE モード | Unique Key モデルのテーブルにのみ適用。 |
NEGATIVE | INTEGER 型の列で SUM 集計を行う場合にのみ適用。 |
次のステップ
OSS を使用したデータのインポート — Object Storage Service 向けの S3 ブローカーを使用した Broker Load
ソースデータの変換 ― カラムマッピング、導出、およびフィルターの詳細