すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB for SelectDB:Broker Load を使用したデータのインポート

最終更新日:Apr 29, 2026

Broker Load は非同期の一括インポート方式で、分散ストレージシステム(Hadoop 分散ファイルシステム (HDFS)、Object Storage Service (OSS)、Amazon Simple Storage Service (Amazon S3))から ApsaraDB for SelectDB に直接データをロードします。単一のインポートジョブで数百 GB のデータを処理でき、クラスターをブロックしません。

仕組み

  1. MySQL プロトコル経由で LOAD LABEL 文を送信します。ジョブは即座に受理され、非同期で実行されます。

  2. ブローカーがリモートストレージシステムに接続し、指定されたファイルを読み取ります。

  3. データがターゲットテーブルにロードされます。複数のテーブルにロードする場合、そのジョブ内のすべての書き込み操作はアトミック(不可分)です。

  4. ラベルにはジョブの完了状態が記録され、同じリクエストを再送信しても重複インポートを防止します。

パフォーマンス

データ量

想定完了時間

~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];

パラメーター

パラメーター

説明

load_label

ジョブの一意な識別子で、形式は [database.]label_name です。このラベルを持つ以前のジョブが CANCELLED 状態の場合、ラベルを再利用できます。同じバッチのデータに対しては常に同じラベルを使用し、at-most-once セマンティクスを保証してください。同一ラベルでの繰り返し送信は一度のみ受理されます。

data_desc

インポートするファイルを記述します。詳細については、「データ記述パラメーター」をご参照ください。

WITH broker_type

ブローカータイプ。有効な値は HDFS および S3 です。S3 ブローカーを使用するジョブは OSS Load ジョブとも呼ばれます。OSS 固有の手順については、「OSS を使用したデータのインポート」をご参照ください。

broker_properties

リモートストレージシステムへの接続パラメーター。形式は ("key1" = "val1", "key2" = "val2", ...) です。

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", ...)]

パラメーター

説明

MERGE|APPEND|DELETE

マージモード。デフォルトは APPEND(標準的な追加)です。MERGE および DELETE は Unique Key モデルを使用するテーブルにのみ適用されます。MERGE モードでは、DELETE ON を使用して削除フラグ列を指定します。DELETE モードでは、インポートされたすべての行がテーブルから削除されます。

DATA INFILE

インポートするファイルのパス。複数のパスおよびワイルドカードがサポートされています。各パスはディレクトリではなく、実際のファイルを指している必要があります。

NEGATIVE

SUM 関数で集計される整数値を反転させます。誤ってインポートされたデータを相殺するために使用します。INTEGER 型の列で SUM 集計を行う場合にのみ有効です。

PARTITION(p1, p2, ...)

特定のパーティションに限定してインポートを行います。指定されたパーティション外のデータは除外されます。

COLUMNS TERMINATED BY

列区切り文字。CSV ファイルにのみ適用されます。シングルバイトのデリミタのみ使用可能です。

FORMAT AS

ファイル形式。デフォルトは CSV です。有効な値は CSVPARQUETORC です。

column_list

ソースファイル内の列の順序。

COLUMNS FROM PATH AS

ファイルパスから列を抽出します。

PRECEDING FILTER predicate

column_list および COLUMNS FROM PATH AS からアセンブルされた列に対して、列マッピング前の段階で適用される事前フィルターです。

SET (column_mapping)

インポート中に適用される列変換式。

WHERE predicate

列マッピング後に適用される行フィルター。条件に一致する行のみがインポートされます。

DELETE ON expr

MERGE モード使用時に必須です。削除対象の行をマークする式を指定します。Unique Key モデルのテーブルでのみ有効です。

ORDER BY source_sequence

データの順序を維持するためのシーケンス列を指定します。Unique Key モデルのテーブルでのみ有効です。

PROPERTIES ("key1"="value1", ...)

ファイル形式固有のパラメーター。JSON ファイルの場合は json_rootjsonpathsfuzzy_parse などが該当します。

インポートプロパティ

パラメーター

デフォルト

説明

timeout

14400(4 時間)

タイムアウト時間(秒)。タイマーはジョブ送信時に開始されます。この期間内にジョブが完了しない場合、失敗とみなされます。

max_filter_ratio

0

許容されるエラー行の最大比率(01)。デフォルトの 0 は、いずれかの行にフォーマットエラーがあるとジョブが失敗することを意味します。SelectDB が不正なフォーマットの行をスキップできるようにするには、0 より大きい値を設定してください。

exec_mem_limit

2147483648(2 GB)

ジョブに割り当てられる最大メモリ量(バイト単位)。

strict_mode

false

true の場合、厳密モードが有効になり、列マッピング、型変換、フィルタリング動作に影響を与えます。

timezone

Asia/Shanghai

タイムゾーンに依存する関数(strftimealignment_timestampfrom_unixtime)で使用されるタイムゾーン。

load_parallelism

1

インポートの並列処理の次数(DOP)。この値を 1 より大きく設定すると、複数の実行計画が同時に開始され、大規模なインポートが高速化されます。

send_batch_parallelism

データバッチ送信時の並列処理の次数(DOP)。計算クラスターのバックエンド(BE)構成における max_send_batch_parallelism_per_job によって上限が制限されます。

load_to_single_tablet

false

true の場合、パーティションごとに単一のタブレットにデータをインポートします。Duplicate Key モデルのテーブルでランダムバケット化を使用している場合にのみ有効です。

使用例

以下の例はすべて同じテーブル構造を使用しています。最初に次の文を実行して、テーブルとサンプルデータファイルを作成してください。

テーブルの作成

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,shanghai

file2.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.txttest_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.csvtest_table に、file1.txttest_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_tablefile1.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];

パラメーター

パラメーター

説明

db_name

クエリ対象のデータベース。省略時は現在のデータベースが使用されます。

LABEL

ラベルによるフィルター。完全一致および LIKE パターンマッチングがサポートされています。

STATE

ジョブ状態によるフィルター。

ORDER BY

結果のソート方法。

LIMIT

返される結果の件数を制限します。省略時はすべての結果が返されます。

OFFSET

先頭から N 件の結果をスキップします。デフォルトは 0 です。

ジョブ状態

状態

意味

対応方法

PENDING

ジョブがキューに登録され、実行を待機中です。

待機してください。長時間 PENDING 状態が続く場合は、キューの深さを監視してください。

ETL

データの抽出および変換が進行中です。

待機してください。

LOADING

データがテーブルに書き込まれています。

待機してください。

FINISHED

インポートが正常に完了しました。

特に操作は不要です。

CANCELLED

ジョブがキャンセルされたか、失敗しました。このラベルは新しいジョブで再利用可能です。

SHOW LOAD 出力の ErrorMsg および URL フィールドを確認し、失敗の詳細を診断してください。

出力カラム

SHOW LOAD は各ジョブについて以下のカラムを返します。

カラム

説明

JobId

SelectDB が割り当てる内部ジョブ ID。

Label

LOAD LABEL で指定したラベル。

State

現在のジョブ状態。「ジョブ状態」をご参照ください。

Progress

インポート進捗率(パーセント表示)。

Type

インポートタイプ(例:BROKER)。

EtlInfo

ETL フェーズの統計情報(行数、フィルターされた行数など)。

TaskInfo

タスクレベルの詳細情報(クラスター、タイムアウト、max_filter_ratio など)。

ErrorMsg

ジョブが失敗またはキャンセルされた場合のエラーメッセージ。

CreateTime

ジョブ作成時刻。

EtlStartTime

ETL フェーズ開始時刻。

EtlFinishTime

ETL フェーズ終了時刻。

LoadStartTime

ロードフェーズ開始時刻。

LoadFinishTime

ロードフェーズ終了時刻。

URL

エラーログへの URL。ジョブが失敗した場合や max_filter_ratio が 0 より大きい場合、この URL を開くことで拒否された行とその理由を確認できます。

JobDetails

ファイルごとの統計情報を含む 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"];

パラメーター

パラメーター

説明

db_name

ジョブが含まれるデータベース。省略時は現在のデータベースが使用されます。

load_label

キャンセル対象のジョブの正確なラベル、または LABEL LIKE 用のパターン。

使用例

特定のジョブをキャンセル

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 を設定する

動作

使用タイミング

0(デフォルト)

いずれかの行にフォーマットエラーがあるとジョブが失敗し、行はスキップされません。

信頼性が高く、検証済みのソースデータ。

0.010.1

SelectDB は指定された比率までの不正なフォーマットの行をスキップし、ジョブを完了させます。

少数の不正フォーマット行が許容可能な大規模インポート。

>0.1

上記と同様ですが、高い比率は通常、上流のデータ品質に問題があることを示唆します。

このしきい値を引き上げる前に、ソースデータを調査してください。

ジョブが失敗または行をスキップした場合、SHOW LOADURL フィールドに記載された URL を開き、どの行が拒否されたのか、その理由を正確に確認してください。

大規模インポートには load_parallelism を使用する

load_parallelism1 より大きい値に設定すると、複数の実行計画が同時に実行されます。これにより大規模ファイルのインポートが高速化されますが、メモリ使用量も増加します。クラスターの容量に応じて、2 または 4 から開始し、必要に応じて調整してください。

ラベルによる冪等性の確保

Broker Load はラベル単位で at-most-once セマンティクスを保証します。特定のラベルを持つジョブが成功(FINISHED 状態)した場合、同じラベルを再送信しても効果はありません。ジョブが失敗またはキャンセルされた場合は、そのラベルを再利用できます。再送信の判断を行う前に、必ず SHOW LOAD で状態を確認してください。

使用制限

制限項目

クラスターあたりの同時インポートジョブ数

3~10

最大キュー長

100(この上限を超えるジョブは拒否されます)

デフォルトタイムアウト

4 時間(ジョブ送信時からタイマーが開始され、キュー待ち時間も含まれます)

列区切り文字

シングルバイトのデリミタのみ。CSV ファイルにのみ適用。

MERGE および DELETE モード

Unique Key モデルのテーブルにのみ適用。

NEGATIVE

INTEGER 型の列で SUM 集計を行う場合にのみ適用。

次のステップ