Routine Load は Kafka トピックからメッセージを継続的に読み取り、ApsaraDB for SelectDB にロードします。一度作成された Routine Load ジョブは永続的に実行され、バッチごとに再送信する必要はありません。
仕組み
Routine Load ジョブを作成すると、フロントエンド (FE) が永続的なロードジョブを生成し、それを複数のタスクに分割します。各タスクは独立したトランザクションであり、Kafka メッセージの有界なスライスを消費します。タスクは、次のしきい値のいずれかに最初に到達した時点で終了します:max_batch_interval、max_batch_rows、または max_batch_size。タスクがコミットされた後、新しいタスクが直ちにスケジュールされます。
このアーキテクチャにより、ジョブを停止することなく、同時実行数、バッチサイズ、エラー許容度を調整できます。
前提条件
開始前に、以下の要件を満たしていることを確認してください。
ApsaraDB for SelectDB インスタンスからアクセス可能な Kafka クラスター(バージョン 0.10.0.0 以降)
CSV または JSON 形式のメッセージを含む Kafka トピック(CSV メッセージは末尾の改行を含まない単一行である必要があります)
ApsaraDB for SelectDB 内の送信先テーブル
ネットワーク接続性:Kafka クラスターがパブリックネットワーク環境にデプロイされている場合、ApsaraDB for SelectDB インスタンスは Kafka ブローカーに接続するためにパブリックネットワークアクセスを備えている必要があります。詳細については、「データソースのネットワーク問題の解決」をご参照ください。
注意事項
Kafka 0.10.0.0 以降はデフォルトでサポートされています。古い Kafka バージョン(0.9.0、0.8.2、0.8.1、または 0.8.0)を使用する場合は、次のいずれかの方法を採用してください。
バックエンド (BE) 構成で
kafka_broker_version_fallbackを対象の Kafka バージョンに設定します。Routine Load ジョブ作成時に
property.broker.version.fallbackを設定します。
Kafka バージョン 0.10.0.0 より前のバージョンでは、一部の機能が利用できません。たとえば、時間ベースのパーティションオフセットはサポートされていません。
クイックスタート
この例では、Kafka から CSV データを SelectDB テーブルにロードします。
ステップ 1:Kafka 内のサンプルデータを確認します
1,Alice,30
2,Bob,25
3,Carol,35ステップ 2:送信先テーブルを作成します
CREATE TABLE testdb.users (
id INT NOT NULL,
name VARCHAR(50),
age INT
)
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 4
PROPERTIES ("replication_num" = "1");ステップ 3:Routine Load ジョブを作成します
CREATE ROUTINE LOAD testdb.load_users ON users
COLUMNS TERMINATED BY ",",
COLUMNS(id, name, age)
PROPERTIES (
"desired_concurrent_number" = "3",
"max_batch_interval" = "20",
"max_batch_rows" = "300000",
"max_batch_size" = "209715200",
"strict_mode" = "false"
)
FROM KAFKA (
"kafka_broker_list" = "broker1:9092,broker2:9092",
"kafka_topic" = "users",
"property.kafka_default_offsets" = "OFFSET_BEGINNING"
);ステップ 4:ジョブのステータスを確認します
SHOW ROUTINE LOAD FOR testdb.load_users;Routine Load ジョブの作成
構文
CREATE ROUTINE LOAD [db.]job_name ON tbl_name
[merge_type]
[load_properties]
[job_properties]
FROM data_source [data_source_properties]パラメーター
パラメーター | 説明 |
| ジョブ名。データベース内では、同じ名前のジョブを同時に 1 つしか実行できません。 |
| 送信先テーブル名。 |
| データマージモード。デフォルトは |
| インポートデータの処理に関するパラメーター。詳細については、「load_properties パラメーター」をご参照ください。 |
| ジョブレベルのパラメーター。詳細については、「job_properties パラメーター」をご参照ください。 |
| Kafka 接続パラメーター。詳細については、「data_source_properties パラメーター」をご参照ください。 |
load_properties パラメーター
[column_separator],
[columns_mapping],
[preceding_filter],
[where_predicates],
[partitions],
[DELETE ON],
[ORDER BY]パラメーター | 例 | 説明 |
|
| カラム区切り文字。デフォルトは |
|
| ソース列を送信先列にマッピングし、変換を適用します。詳細については、「ソースデータの変換」をご参照ください。 |
| — | カラムマッピングの前にソースデータをフィルタリングします。詳細については、「ソースデータの変換」をご参照ください。 |
|
| カラムマッピング後に、行をフィルタリングします。詳細については、「ソースデータの変換」をご参照ください。 |
|
| ターゲットパーティション。省略した場合、データは自動的に一致するパーティションにルーティングされます。 |
|
| Delete Flag カラムの式を指定します。 |
| — | インポート中にレコード順序を維持するためのシーケンスカラムを指定します。Unique Key モデルテーブルでのみ有効です。 |
job_properties パラメーター
PROPERTIES (
"key1" = "val1",
"key2" = "val2"
)タスクは、max_batch_interval、max_batch_rows、またはmax_batch_sizeのいずれかに最初に到達した時点で終了します。
パラメーター | デフォルト | 有効範囲 | 説明 |
|
| 整数 > 0 | ジョブで同時に実行できる最大タスク数。実際の同時実行数はクラスターノード数、負荷、データソースに依存します。最適なスループットを得るには、この値を |
|
| 5~60 秒 | タスクあたりの最大実行時間。 |
|
| ≥ 200000 | タスクあたりの最大読み取り行数。 |
|
| 100 MB~1 GB | タスクあたりの最大読み取りバイト数。 |
|
| 整数 > 0 | サンプリングウィンドウ(10 × |
|
|
|
|
| セッションタイムゾーン | — | ジョブ内のタイムゾーン関連関数すべてに適用されるタイムゾーン(例: |
|
|
| メッセージフォーマット。 |
| — | — | JSON 形式データの JSON フィールド抽出パス(例: |
|
|
|
|
| — | — | JSON 抽出のルートノードパス(例: |
| — | — | バッチデータ送信の最大並列スレッド数。BE 構成の |
|
|
|
|
Strict モードの動作
Strict モードは、型変換失敗時の処理方法を制御します。
TINYINT カラム(NULL 許容)へのインポート:
ソースデータの型 | 例となる値 | 変換結果 | Strict モード | 結果 |
NULL |
| — |
| NULL |
NOT NULL |
| NULL |
| フィルター(無効) |
NOT NULL |
| NULL |
| NULL |
NOT NULL |
|
|
| インポート済み |
DECIMAL(1,0) カラム(NULL 許容)へのインポート:
ソースデータの型 | 例となる値 | 変換結果 | Strict モード | 結果 |
NULL |
| — |
| NULL |
NOT NULL |
| NULL |
| フィルター(無効) |
NOT NULL |
| NULL |
| NULL |
NOT NULL |
|
|
| インポート |
値 10 は DECIMAL(1,0) の範囲を超えていますが、Strict モードではフィルターされません。これは、値自体が型変換を通過するためです。この値は、抽出・変換・書き出し(ETL)プロセス中に後からフィルターされます。data_source_properties パラメーター
FROM KAFKA (
"key1" = "val1",
"key2" = "val2"
)パラメーター | 説明 |
| ブローカーアドレス。形式: |
| サブスクライブする Kafka トピック。 |
| サブスクライブするパーティション ID をカンマ区切りで指定します。例: |
|
|
| カスタム Kafka クライアントプロパティ。Kafka シェルの |
時間ベースのオフセットと数値オフセットは、同じ kafka_offsets 値内で混在させることはできません。
パーティションとオフセットの組み合わせ
kafka_partitions、kafka_offsets、および property.kafka_default_offsets は次のように相互作用します。
方法 |
|
|
| 動作 |
1 | 未設定 | 未設定 | 未設定 | すべてのパーティションを終端オフセットから開始します。 |
2 | 未設定 | 未設定 | 設定済み | すべてのパーティションを指定されたデフォルトオフセットから開始します。 |
3 | 設定 | 未設定 | 未設定 | 指定されたパーティションを終端オフセットから開始します。 |
4 | 設定済み | 設定 | 未設定 | 指定されたパーティションを指定されたオフセットから開始します。 |
5 | 設定済み | 未設定 | 設定済み | 指定されたパーティションを指定されたデフォルトオフセットから開始します。 |
例 — オフセットが混在するパーティション:
"kafka_partitions" = "0,1,2,3",
"kafka_offsets" = "101,0,OFFSET_BEGINNING,OFFSET_END"例 — タイムスタンプベースのオフセットを持つパーティション:
"kafka_partitions" = "0,1,2,3",
"kafka_offsets" = "2021-05-22 11:00:00,2021-05-22 11:00:00,2021-05-22 11:00:00,2021-05-22 11:00:00"例
CSV データのロード
送信先テーブルを作成します。
CREATE TABLE test_table ( id INT, name VARCHAR(50), age INT, address VARCHAR(50), url VARCHAR(500) ) UNIQUE KEY(`id`, `name`) DISTRIBUTED BY HASH(id) BUCKETS 4 PROPERTIES ("replication_num" = "1");すべてのパーティションの先頭から読み取る Routine Load ジョブを作成します。
CREATE ROUTINE LOAD example_db.test1 ON test_table COLUMNS TERMINATED BY ",", COLUMNS(k1, k2, k3, v1, v2, v3 = k1 * 100) PROPERTIES ( "desired_concurrent_number" = "3", "max_batch_interval" = "20", "max_batch_rows" = "300000", "max_batch_size" = "209715200", "strict_mode" = "false" ) FROM KAFKA ( "kafka_broker_list" = "broker1:9092,broker2:9092,broker3:9092", "kafka_topic" = "my_topic", "property.kafka_default_offsets" = "OFFSET_BEGINNING" );Strict モードを有効にして Routine Load ジョブを作成します。
CREATE ROUTINE LOAD example_db.test2 ON test_table COLUMNS TERMINATED BY ",", COLUMNS(k1, k2, k3, v1, v2, v3 = k1 * 100) PROPERTIES ( "desired_concurrent_number" = "3", "max_batch_interval" = "20", "max_batch_rows" = "300000", "max_batch_size" = "209715200", "strict_mode" = "true" ) FROM KAFKA ( "kafka_broker_list" = "broker1:9092,broker2:9092,broker3:9092", "kafka_topic" = "my_topic", "property.kafka_default_offsets" = "OFFSET_BEGINNING" );特定のタイムスタンプから消費を開始します。
CREATE ROUTINE LOAD example_db.test4 ON test_table PROPERTIES ( "desired_concurrent_number" = "3", "max_batch_interval" = "30", "max_batch_rows" = "300000", "max_batch_size" = "209715200" ) FROM KAFKA ( "kafka_broker_list" = "broker1:9092,broker2:9092", "kafka_topic" = "my_topic", "property.kafka_default_offset" = "2024-01-21 10:00:00" );
JSON データのロード
Routine Load は次の 2 種類の JSON メッセージ構造をサポートしています。
単一の JSON オブジェクト — メッセージごとに 1 レコード:
{"key1":"value1","key2":"value2","key3":"value3"}JSON 配列 — メッセージごとに複数レコード:
[ {"key1":"value11","key2":"value12","key3":"value13","key4":14}, {"key1":"value21","key2":"value22","key3":"value23","key4":24} ]
複数テーブルインポートモードでは、各メッセージの先頭に送信先テーブル名を付加します。
table_name|{"key1":"value1","key2":"value2","key3":"value3"}例:JSON データのロード
送信先テーブルを作成します。
CREATE TABLE `example_tbl` ( `category` VARCHAR(24) NULL, `author` VARCHAR(24) NULL, `timestamp` BIGINT(20) NULL, `dt` INT(11) NULL, `price` DOUBLE REPLACE ) ENGINE=OLAP AGGREGATE KEY(`category`, `author`, `timestamp`, `dt`) PARTITION BY RANGE(`dt`) ( PARTITION p0 VALUES [("-2147483648"), ("20230509")), PARTITION p20200509 VALUES [("20230509"), ("20231010")), PARTITION p20200510 VALUES [("20231010"), ("20231211")), PARTITION p20200511 VALUES [("20231211"), ("20240512")) ) DISTRIBUTED BY HASH(`category`, `author`, `timestamp`) BUCKETS 4;両方のメッセージタイプを Kafka トピックに公開します。
{"category":"value1331","author":"value1233","timestamp":1700346050,"price":1413}[ {"category":"value13z2","author":"vaelue13","timestamp":1705645251,"price":14330}, {"category":"lvalue211","author":"lvalue122","timestamp":1684448450,"price":24440} ]シンプルモードでロードします(フィールド名がカラム名と一致)。
CREATE ROUTINE LOAD example_db.test_json_label_1 ON example_tbl COLUMNS(category, price, author) PROPERTIES ( "desired_concurrent_number" = "3", "max_batch_interval" = "20", "max_batch_rows" = "300000", "max_batch_size" = "209715200", "strict_mode" = "false", "format" = "json" ) FROM KAFKA ( "kafka_broker_list" = "broker1:9092,broker2:9092,broker3:9092", "kafka_topic" = "my_topic", "kafka_partitions" = "0,1,2", "kafka_offsets" = "0,0,0" );明示的な JSON パス抽出と外側の配列のストリップを伴ってロードします。
dtカラムはソースデータに存在しません。その値は、COLUMNS句内のtimestampを使用してdt=from_unixtime(timestamp,'%Y%m%d')で導出されます。CREATE ROUTINE LOAD example_db.test_json_label_3 ON example_tbl COLUMNS(category, author, price, timestamp, dt=from_unixtime(timestamp, '%Y%m%d')) PROPERTIES ( "desired_concurrent_number" = "3", "max_batch_interval" = "20", "max_batch_rows" = "300000", "max_batch_size" = "209715200", "strict_mode" = "false", "format" = "json", "jsonpaths" = "[\"$.category\",\"$.author\",\"$.price\",\"$.timestamp\"]", "strip_outer_array" = "true" ) FROM KAFKA ( "kafka_broker_list" = "broker1:9092,broker2:9092,broker3:9092", "kafka_topic" = "my_topic", "kafka_partitions" = "0,1,2", "kafka_offsets" = "0,0,0" );
認証付き Kafka クラスターへの接続
ApsaraDB for SelectDB は Kafka への接続に librdkafka C++ クライアントライブラリを使用します。サポートされている構成プロパティについては、「librdkafka 構成リファレンス」をご参照ください。
SSL 認証
必要な証明書ファイルを最初にアップロードしてから、Routine Load ジョブを作成します。
証明書ファイルをアップロードします。
CREATE FILE "ca.pem" PROPERTIES ("url" = "https://example_url/kafka-key/ca.pem", "catalog" = "kafka"); CREATE FILE "client.key" PROPERTIES ("url" = "https://example_url/kafka-key/client.key", "catalog" = "kafka"); CREATE FILE "client.pem" PROPERTIES ("url" = "https://example_url/kafka-key/client.pem", "catalog" = "kafka");Routine Load ジョブを作成します。
プロパティ
必須
説明
property.security.protocol常に
sslに設定します。property.ssl.ca.location常に
Kafka ブローカーの公開鍵を認証する CA 証明書のパス。
property.ssl.certificate.locationKafka サーバーでクライアント認証が有効になっている場合のみ
クライアント公開鍵証明書のパス。
property.ssl.key.locationKafka サーバーでクライアント認証が有効になっている場合のみ
クライアント秘密鍵ファイルのパス。
property.ssl.key.passwordKafka サーバーでクライアント認証が有効になっている場合のみ
クライアント秘密鍵のパスワード。
CREATE ROUTINE LOAD db1.job1 ON tbl1 PROPERTIES ( "desired_concurrent_number" = "1" ) FROM KAFKA ( "kafka_broker_list" = "broker1:9091,broker2:9091", "kafka_topic" = "my_topic", "property.security.protocol" = "ssl", "property.ssl.ca.location" = "FILE:ca.pem", "property.ssl.certificate.location" = "FILE:client.pem", "property.ssl.key.location" = "FILE:client.key", "property.ssl.key.password" = "abcdefg" );
PLAIN 認証
CREATE ROUTINE LOAD db1.job1 ON tbl1
PROPERTIES (
"desired_concurrent_number" = "1"
)
FROM KAFKA (
"kafka_broker_list" = "broker1:9092,broker2:9092",
"kafka_topic" = "my_topic",
"property.security.protocol" = "SASL_PLAINTEXT",
"property.sasl.mechanism" = "PLAIN",
"property.sasl.username" = "admin",
"property.sasl.password" = "admin"
);プロパティ | 値 | 説明 |
|
| 簡易認証およびセキュリティ層(SASL)プレーンテキストを使用します。 |
|
| SASL メカニズム。 |
| — | SASL ユーザー名。 |
| — | SASL パスワード。 |
Kerberos 認証
ジョブを作成する前に、ApsaraDB for SelectDB クラスターのすべてのノードに Kerberos クライアント kinit をデプロイし、krb5.conf を構成して、キー配布センター(KDC)サービスを指定する必要があります。
CREATE ROUTINE LOAD db1.job1 ON tbl1
PROPERTIES (
"desired_concurrent_number" = "1"
)
FROM KAFKA (
"kafka_broker_list" = "broker1:9092,broker2:9092",
"kafka_topic" = "my_topic",
"property.security.protocol" = "SASL_PLAINTEXT",
"property.sasl.kerberos.service.name" = "kafka",
"property.sasl.kerberos.keytab" = "/etc/krb5.keytab",
"property.sasl.kerberos.principal" = "id@your.com"
);プロパティ | 説明 |
|
|
| Kafka ブローカーサービス名。 |
| ローカル |
| Kafka クラスターに接続するために使用する Kerberos プリンシパル。 |
Routine Load ジョブの変更
PAUSED 状態のジョブのみ変更できます。
構文
ALTER ROUTINE LOAD FOR [db.]job_name
[job_properties]
FROM data_source
[data_source_properties]変更可能なパラメーター
job_properties — 次のパラメーターを変更できます。
desired_concurrent_numbermax_error_numbermax_batch_intervalmax_batch_rowsmax_batch_sizejsonpathsjson_rootstrip_outer_arraystrict_modetimezonenum_as_stringfuzzy_parse
data_source_properties — Kafka プロパティのみ変更できます。
kafka_partitionskafka_offsetskafka_broker_listkafka_topicカスタムプロパティ(例:
property.group.id)
kafka_partitionsおよびkafka_offsetsは、すでに消費中のパーティションのオフセットのみを変更できます。新しいパーティションの追加はサポートされていません。
例
ジョブ db1.label1 の同時実行数を 1 に変更します。
ALTER ROUTINE LOAD FOR db1.label1
PROPERTIES (
"desired_concurrent_number" = "1"
);同時実行数を 10 に変更し、パーティションオフセットとコンシューマーグループ ID を調整します。
ALTER ROUTINE LOAD FOR db1.label1
PROPERTIES (
"desired_concurrent_number" = "10"
)
FROM KAFKA (
"kafka_partitions" = "0, 1, 2",
"kafka_offsets" = "100, 200, 100",
"property.group.id" = "new_group"
);Routine Load ジョブの一時停止
構文
PAUSE ROUTINE LOAD FOR [db.]job_name;
PAUSE ALL ROUTINE LOAD;例
ジョブ test1 を一時停止します。
PAUSE ROUTINE LOAD FOR test1;現在のデータベース内のすべての Routine Load ジョブを一時停止します。
PAUSE ALL ROUTINE LOAD;Routine Load ジョブの再開
再開されたジョブは、最後にコミットされたオフセットから消費を継続します。
構文
RESUME ROUTINE LOAD FOR [db.]job_name;
RESUME ALL ROUTINE LOAD;例
ジョブ test1 を再開します。
RESUME ROUTINE LOAD FOR test1;現在のデータベース内で一時停止中のすべての Routine Load ジョブを再開します。
RESUME ALL ROUTINE LOAD;Routine Load ジョブの停止
停止されたジョブは再起動できず、停止前にインポートされたデータはロールバックできません。
構文
STOP ROUTINE LOAD FOR [db.]job_name;例
STOP ROUTINE LOAD FOR test1;Routine Load ジョブのステータス確認
構文
SHOW [ALL] ROUTINE LOAD [FOR [db.]job_name];ALL を指定しない場合、実行中および一時停止中のジョブのみが返されます。ALL を指定すると、停止およびキャンセルされたジョブも含まれます。
出力フィールド
フィールド | 説明 |
| ApsaraDB for SelectDB によって自動的に割り当てられるジョブ ID。 |
| ジョブ名。 |
| ジョブが作成された時刻。 |
| ジョブが最後に一時停止された時刻。 |
| ジョブが終了した時刻(停止またはキャンセル)。 |
| 現在のジョブ状態: |
| データソースタイプ。Routine Load ジョブでは常に |
| 現在実行中のタスク数。 |
| エラーログを指す URL。ブラウザで任意の URL を開くと、無効な行の詳細を確認できます。 |
例
test1 という名前のすべてのジョブ(停止およびキャンセルされたものを含む)を照会します。
SHOW ALL ROUTINE LOAD FOR test1;test1 という名前で実行中のジョブのみを照会します。
SHOW ROUTINE LOAD FOR test1;example_db 内のすべてのジョブ(停止およびキャンセルされたものを含む)を照会します。
USE example_db;
SHOW ALL ROUTINE LOAD;example_db 内で実行中のジョブのみを照会します。
USE example_db;
SHOW ROUTINE LOAD;データベースと名前で特定のジョブを照会します。
SHOW ROUTINE LOAD FOR example_db.test1;システム構成
次の FE および BE パラメーターは Routine Load の動作に影響します。すべての FE パラメーターはランタイムで変更可能です。
パラメーター | スコープ | デフォルト | 説明 |
| FE |
| Routine Load ジョブで同時に実行できる最大タスク数。デフォルト値を推奨します。値を高く設定しすぎると、クラスターリソースが枯渇する可能性があります。 |
| FE |
| 各 BE ノードで同時に実行できる最大タスク数。デフォルト値を推奨します。 |
| FE |
| Routine Load ジョブの最大数( |
| BE |
| タスクごとに生成される最大コンシューマー数。たとえば、6 つの Kafka パーティションを消費するタスクは 3 つのコンシューマーを生成し、それぞれが 2 つのパーティションを処理します。 |
| FE |
| 自動ジョブ再スケジューリングがブロックされる前に停止してもよい BE ノードの最大数。値 |
| FE |
| ApsaraDB for SelectDB は、この時間枠内で一時停止中のジョブの再スケジューリングを最大 3 回試行します。3 回失敗すると、ジョブはロックされ、再開するには手動での介入が必要になります。 |
その他の考慮事項
Routine Load とスキーマ変更
Routine Load ジョブは
SCHEMA CHANGEまたはROLLUP操作をブロックしません。SCHEMA CHANGE後、ソースカラムが送信先テーブルと一致しなくなった場合、エラー行数が増加し、ジョブが一時停止する可能性があります。これを防ぐには、COLUMNS句で明示的なカラムマッピングを使用し、送信先カラムをNULLABLEまたはDEFAULT値付きで定義してください。パーティションが削除された場合、ターゲットパーティションが見つからないため、ジョブは一時停止します。
Routine Load と他の書き込み操作
Routine Load は
LOADまたはINSERT操作と競合しません。テーブルに対して
DELETE操作を実行する前に、そのテーブルの Routine Load ジョブを一時停止し、進行中のすべてのタスクが完了するのを待ってください。
Routine Load とテーブルまたはデータベースの削除
送信先テーブルまたはデータベースが削除された場合、Routine Load ジョブは自動的にキャンセルされます。
Kafka トピックの自動作成
CREATE ROUTINE LOAD で指定されたトピックが存在しない場合、Kafka ブローカーは auto.create.topics.enable 設定に基づいてトピックを自動作成することがあります。
true:Kafka はnum.partitionsパーティションでトピックを自動作成します。ジョブはすぐにそこから読み取りを開始します。false:トピックが作成され、データが利用可能になるまでジョブは一時停止します。
ネットワークアクセス要件
kafka_broker_listにリストされたすべてのブローカーは、ApsaraDB for SelectDB クラスターから到達可能である必要があります。Kafka で
advertised.listenersが構成されている場合、アドバタイズされたアドレスも到達可能である必要があります。
STOPPED と PAUSED の違い
状態 | 動作 |
|
|
| ジョブは永久に終了し、FE によって定期的にクリアされます。再起動できません。 |