データロードのトラブルシューティング
このガイドは、DBA や運用エンジニアが外部の監視システムに頼らずに SQL インターフェースを通じてデータロードジョブのステータスを監視するのを支 援するために設計されています。また、ロード操作中のパフォーマンスボトルネックの特定や異常のトラブルシューティングに関するガイダンスも提供します。
用語
Load Job: Routine Load Job や Pipe Job のような継続的なデータロードプロセス。
Load Task: 通常、単一のロードトランザクションに対応する一度きりのデータロードプロセス。例として、Broker Load、Stream Load、Spark Load、および INSERT INTO があります。Routine Load ジョブと Pipe ジョブは、データ取り込みを行うためにタスクを継続的に生成します。
ロードジョブの観察
ロードジョブを観察する方法は2つあります:
- SQL ステートメント SHOW ROUTINE LOAD および SHOW PIPES を使用する。
- システムビュー information_schema.routine_load_jobs および information_schema.pipes を使用する。
ロードタスクの観察
ロードタスクも2つの方法で監視できます:
- SQL ステートメント SHOW LOAD および SHOW ROUTINE LOAD TASK を使用する。
- システムビュー information_schema.loads および statistics.loads_history を使用する。
SQL ステートメント
SHOW ステートメントは、現在のデータベースの進行中および最近完了したロードタスクを表示し、タスクのステータスを迅速に把握できます。取得される情報は、statistics.loads_history システムビューのサブセットです。
SHOW LOAD ステートメントは Broker Load、Insert Into、Spark Load タスクの情報を返し、SHOW ROUTINE LOAD TASK ステートメントは Routine Load タスクの情報を返します。
システムビュー
information_schema.loads
information_schema.loads システムビューは、最近のロードタスクに関する情報を保存し、アクティブなものと最近完了したものを含みます。StarRocks は定期的にデータを statistics.loads_history システムテーブルに同期し、永続的に保存します。
information_schema.loads は以下のフィールドを提供します:
| フィールド | 説明 |
|---|---|
| ID | グローバルに一意の識別子。 |
| LABEL | ロードジョブのラベル。 |
| PROFILE_ID | ANALYZE PROFILE を通じて分析できるプロファイルの ID。 |
| DB_NAME | 対象テーブルが属するデータベース。 |
| TABLE_NAME | 対象テーブル。 |
| USER | ロードジョブを開始したユーザー。 |
| WAREHOUSE | ロードジョブが属するウェアハウス。 |
| STATE | ロードジョブの状態。 有効な値:
|
| PROGRESS | ロードジョブの ETL ステージと LOADING ステージの進捗。 |
| TYPE | ロードジョブのタイプ。 Broker Load の場合、返される値は BROKER。INSERT の場合、返される値は INSERT。Stream Load の場合、返される値は STREAM。Routine Load の場合、返される値は ROUTINE。 |
| PRIORITY | ロードジョブの優先度。 有効な値: HIGHEST, HIGH, NORMAL, LOW, LOWEST。 |
| SCAN_ROWS | スキャンされたデータ行の数。 |
| SCAN_BYTES | スキャンされたバイト数。 |
| FILTERED_ROWS | データ品質が不十分なためにフィルタリングされたデータ行の数。 |
| UNSELECTED_ROWS | WHERE 句で指定された条件によりフィルタリングされたデータ行の数。 |
| SINK_ROWS | ロードされたデータ行の数。 |
| RUNTIME_DETAILS | ロードの実行時メタデータ。詳細は RUNTIME_DETAILS を参照。 |
| CREATE_TIME | ロードジョブが作成された時間。フォーマット: yyyy-MM-dd HH:mm:ss。例: 2023-07-24 14:58:58。 |
| LOAD_START_TIME | ロードジョブの LOADING ステージの開始時間。フォーマット: yyyy-MM-dd HH:mm:ss。例: 2023-07-24 14:58:58。 |
| LOAD_COMMIT_TIME | ロADING トランザクションがコミットされた時間。フォーマット: yyyy-MM-dd HH:mm:ss。例: 2023-07-24 14:58:58。 |
| LOAD_FINISH_TIME | ロードジョブの LOADING ステージの終了時間。フォーマット: yyyy-MM-dd HH:mm:ss。例: 2023-07-24 14:58:58。 |
| PROPERTIES | ロードジョブの静的プロパティ。詳細は PROPERTIES を参照。 |
| ERROR_MSG | ロードジョブのエラーメッセージ。エラーが発生しなかった場合、NULL が返されます。 |
| TRACKING_SQL | ロードジョブの追跡ログをクエリするために使用できる SQL ステートメント。ロードジョブが不適格なデータ行を含む場合にのみ SQL ステートメントが返されます。不適格なデータ行を含まない場合、NULL が返されます。 |
| REJECTED_RECORD_PATH | ロードジョブでフィルタリングされたすべての不適格なデータ行にアクセスできるパス。ログに記録される不適格なデータ行の数は、ロードジョブで設定された log_rejected_record_num パラメータによって決まります。このパスにアクセスするには wget コマンドを使用できます。不適格なデータ行を含まない場合、NULL が返されます。 |
RUNTIME_DETAILS
- 共通メトリクス:
| メトリック | 説明 |
|---|---|
| load_id | ロード実行計画のグローバルに一意の ID。 |
| txn_id | ロードトランザクション ID。 |
- Broker Load、INSERT INTO、Spark Load の特定メトリクス:
| メトリック | 説明 |
|---|---|
| etl_info | ETL 詳細。このフィールドは Spark Load ジョブにのみ有効です。他のタイプのロードジョブでは、値は空になります。 |
| etl_start_time | ロードジョブの ETL ステージの開始時間。フォーマット: yyyy-MM-dd HH:mm:ss。例: 2023-07-24 14:58:58。 |
| etl_start_time | ロードジョブの ETL ステージの終了時間。フォーマット: yyyy-MM-dd HH:mm:ss。例: 2023-07-24 14:58:58。 |
| unfinished_backends | 実行が完了していない BEs のリスト。 |
| backends | 実行に参加している BEs のリスト。 |
| file_num | 読み取られたファイルの数。 |
| file_size | 読み取られたファイルの合計サイズ。 |
| task_num | サブタスクの数。 |
- Routine Load の特定メトリクス:
| メトリック | 説明 |
|---|---|
| schedule_interval | Routine Load がスケジュールされる間隔。 |
| wait_slot_time | Routine Load タスクが実行スロットを待機している間に経過した時間。 |
| check_offset_time | Routine Load タスクのスケジューリング中にオフセット情報を確認する際に消費される時間。 |
| consume_time | Routine Load タスクが上流データを読み取るのに消費する時間。 |
| plan_time | 実行計画を生成する時間。 |
| commit_publish_time | COMMIT RPC を実行するのに消費される時間。 |
- Stream Load の特定メトリクス:
| メトリック | 説明 |
|---|---|
| timeout | ロードタスクのタイムアウト。 |
| begin_txn_ms | トランザクションを開始するのに消費される時間。 |
| plan_time_ms | 実行計画を生成する時間。 |
| receive_data_time_ms | データを受信する時間。 |
| commit_publish_time_ms | COMMIT RPC を実行するのに消費される時間。 |
| client_ip | クライアントの IP アドレス。 |
PROPERTIES
- Broker Load、INSERT INTO、Spark Load の特定プロパティ:
| プロパティ | 説明 |
|---|---|
| timeout | ロードタスクのタイムアウト。 |
| max_filter_ratio | データ品質が不十分なためにフィルタリングされるデータ行の最大比率。 |
- Routine Load の特定プロパティ:
| プロパティ | 説明 |
|---|---|
| job_name | Routine Load ジョブ名。 |
| task_num | 実際に並行して実行されるサブタスクの数。 |
| timeout | ロードタスクのタイムアウト。 |
statistics.loads_history
statistics.loads_history システムビューは、デフォルトで過去3か月間のロード記録を保存します。DBA はビューの partition_ttl を変更して保持期間を 調整できます。statistics.loads_history は information_schema.loads と一貫したスキーマを持っています。
Load Profiles でロードパフォーマンスの問題を特定する
Load Profile は、データロードに関与するすべてのワーカーノードの実行詳細を記録します。これにより、StarRocks クラスター内のパフォーマンスボトルネックを迅速に特定できます。
Load Profiles を有効にする
StarRocks は、ロードの種類に応じて Load Profiles を有効にする複数の方法を提供します:
Broker Load と INSERT INTO の場合
Broker Load と INSERT INTO の Load Profiles をセッションレベルで有効にします:
SET enable_profile = true;
デフォルトでは、長時間実行されるジョブ(300 秒以上)に対してプロファイルが自動的に有効になります。このしきい値をカスタマイズするには:
SET big_query_profile_threshold = 60s;
big_query_profile_threshold がデフォルト値 0 に設定されている場合、デフォルトの動作はクエリのプロファイリングを無効にすることです。ただし、ロードタスクの場合、実行時間が 300 秒を超えるタスクには自動的にプロファイルが記録されます。
StarRocks は Runtime Profiles もサポートしており、長時間実行されるロードジョブの実行メトリクスを定期的に(30 秒ごとに)報告します。報告間隔をカスタマイズするには:
SET runtime_profile_report_interval = 60;
runtime_profile_report_interval はロードタスクの最小報告間隔のみを指定します。実際の報告間隔は動的に調整され、この値を超える場合があります。
Stream Load と Routine Load の場合
Stream Load と Routine Load の Load Profiles をテーブルレベルで有効にします:
ALTER TABLE <table_name> SET ("enable_load_profile" = "true");
Stream Load は通常、高い QPS を持つため、StarRocks は広範なプロファイリングによるパフォーマンス低下を避けるために Load Profile 収集のサンプリングを許可しています。収集間隔を調整するには、FE パラメータ load_profile_collect_interval_second を設定します。この設定は、テーブルプロパティを介して有効にされた Load Profiles にのみ適用されます。デフォルト値は 0 です。
ADMIN SET FRONTEND CONFIG ("load_profile_collect_interval_second"="30");
StarRocks はまた、特定の時間しきい値を超え るロードジョブからのみプロファイルを収集することを許可しています。このしきい値を調整するには、FE パラメータ stream_load_profile_collect_threshold_second を設定します。デフォルト値は 0 です。
ADMIN SET FRONTEND CONFIG ("stream_load_profile_collect_threshold_second"="10");
Load Profiles を分析する
Load Profiles の構造は Query Profiles と同一です。詳細な手順については、Query Tuning Recipes を参照してください。
Load Profiles を分析するには、ANALYZE PROFILE を実行しま す。詳細な手順については、Analyze text-based Profiles を参照してください。
プロファイルは詳細なオペレーターメトリクスを提供します。主要なコンポーネントには OlapTableSink オペレーターと LoadChannel オペレーターが含まれます。
OlapTableSink オペレーター
| メトリック | 説明 |
|---|---|
| IndexNum | 対象テーブルの同期マテリアライズドビューの数。 |
| ReplicatedStorage | シングルリーダーレプリケーションが有効かどうか。 |
| TxnID | ロードトランザクション ID。 |
| RowsRead | 上流オペレーターから読み取られたデータ行の数。 |
| RowsFiltered | データ品質が不十分なためにフィルタリングされたデータ行の数。 |
| RowsReturned | ロードされたデータ行の数。 |
| RpcClientSideTime | クライアント側の統計からのデータ書き込み RPC に消費される合計時間。 |
| RpcServerSideTime | サーバー側の統計からのデータ書き込み RPC に消費される合計時間。 |
| PrepareDataTime | データフォーマット変換とデータ品質チェックに消費される時間。 |
| SendDataTime | データ送信に消費されるローカル時間。データのシリアル化、圧縮、および送信キューへの書き込みを含む。 |
OLAP_TABLE_SINKのPushChunkNumの最大値と最小値の間の大きな差異は、上流オペレーターでのデータスキューを示しており、書き込みパフォーマンスのボトルネックを引き起こす可能性があります。RpcClientSideTimeはRpcServerSideTime、ネットワーク伝送時間、および RPC フレームワーク処理時間の合計に等しいです。RpcClientSideTimeとRpcServerSideTimeの差が大きい場合、データ圧縮を有効にして伝送時間を短縮することを検討してください。RpcServerSideTimeが時間の大部分を占める場合、さらなる分析はLoadChannelプロファイルを使用して実施できます。
LoadChannel オペレーター
| メトリック | 説 明 |
|---|---|
| Address | BE ノードの IP アドレスまたは FQDN。 |
| LoadMemoryLimit | ロードのメモリ制限。 |
| PeakMemoryUsage | ロードのピークメモリ使用量。 |
| OpenCount | チャネルが開かれた回数。シンクの総並列度を反映します。 |
| OpenTime | チャネルを開くのに消費される合計時間。 |
| AddChunkCount | ロードチャンクの数、つまり TabletsChannel::add_chunk の呼び出し回数。 |
| AddRowNum | ロードされたデータ行の数。 |
| AddChunkTime | ロードチャンクに消費される合計時間、つまり TabletsChannel::add_chunk の総実行時間。 |
| WaitFlushTime | TabletsChannel::add_chunk が MemTable フラッシュを待機するのに費やした合計時間。 |
| WaitWriterTime | TabletsChannel::add_chunk が非同期デルタライターの実行を待機するのに費やした合計時間。 |
| WaitReplicaTime | TabletsChannel::add_chunk がレプリカからの同期を待機するのに費やした合計時間。 |
| PrimaryTabletsNum | プライマリタブレットの数。 |
| SecondaryTabletsNum | セカンダリタブレットの数。 |
WaitFlushTime が長時間かかる場合、フラッシュスレッドのリソースが不足している可能性があります。BE の設定 flush_thread_num_per_store を調整することを検討してください。
ベストプラクティス
Broker Load のパフォーマンスボトルネックを診断する
-
Broker Load を使用してデータをロードします:
LOAD LABEL click_bench.hits_1713874468
(
DATA INFILE ("s3://test-data/benchmark_data/query_data/click_bench/hits.tbl*")
INTO TABLE hits COLUMNS TERMINATED BY "\t" (WatchID,JavaEnable,Title,GoodEvent,EventTime,EventDate,CounterID,ClientIP,RegionID,UserID,CounterClass,OS,UserAgent,URL,Referer,IsRefresh,RefererCategoryID,RefererRegionID,URLCategoryID,URLRegionID,ResolutionWidth,ResolutionHeight,ResolutionDepth,FlashMajor,FlashMinor,FlashMinor2,NetMajor,NetMinor,UserAgentMajor,UserAgentMinor,CookieEnable,JavascriptEnable,IsMobile,MobilePhone,MobilePhoneModel,Params,IPNetworkID,TraficSourceID,SearchEngineID,SearchPhrase,AdvEngineID,IsArtifical,WindowClientWidth,WindowClientHeight,ClientTimeZone,ClientEventTime,SilverlightVersion1,SilverlightVersion2,SilverlightVersion3,SilverlightVersion4,PageCharset,CodeVersion,IsLink,IsDownload,IsNotBounce,FUniqID,OriginalURL,HID,IsOldCounter,IsEvent,IsParameter,DontCountHits,WithHash,HitColor,LocalEventTime,Age,Sex,Income,Interests,Robotness,RemoteIP,WindowName,OpenerName,HistoryLength,BrowserLanguage,BrowserCountry,SocialNetwork,SocialAction,HTTPError,SendTiming,DNSTiming,ConnectTiming,ResponseStartTiming,ResponseEndTiming,FetchTiming,SocialSourceNetworkID,SocialSourcePage,ParamPrice,ParamOrderID,ParamCurrency,ParamCurrencyID,OpenstatServiceName,OpenstatCampaignID,OpenstatAdID,OpenstatSourceID,UTMSource,UTMMedium,UTMCampaign,UTMContent,UTMTerm,FromTag,HasGCLID,RefererHash,URLHash,CLID)
)
WITH BROKER
(
"aws.s3.access_key" = "<iam_user_access_key>",
"aws.s3.secret_key" = "<iam_user_secret_key>",
"aws.s3.region" = "<aws_s3_region>"
) -
SHOW PROFILELIST を使用して、ランタイムプロファイルのリストを取得します。
MySQL [click_bench]> SHOW PROFILELIST;
+--------------------------------------+---------------------+----------+---------+----------------------------------------------------------------------------------------------------------------------------------+
| QueryId | StartTime | Time | State | Statement |
+--------------------------------------+---------------------+----------+---------+----------------------------------------------------------------------------------------------------------------------------------+
| 3df61627-f82b-4776-b16a-6810279a79a3 | 2024-04-23 20:28:26 | 11s850ms | Running | LOAD LABEL click_bench.hits_1713875306 (DATA INFILE ("s3://test-data/benchmark_data/query_data/click_bench/hits.tbl*" ... |
+--------------------------------------+---------------------+----------+---------+----------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec) -
ANALYZE PROFILE を使用して、ランタイムプロファイルを表示します。
MySQL [click_bench]> ANALYZE PROFILE FROM '3df61627-f82b-4776-b16a-6810279a79a3';
+-------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Explain String |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Summary |
| Attention: The transaction of the statement will be aborted, and no data will be actually inserted!!! |
| Attention: Profile is not identical!!! |
| QueryId: 3df61627-f82b-4776-b16a-6810279a79a3 |
| Version: default_profile-70fe819 |
| State: Running |
| Legend: ⏳ for blocked; 🚀 for running; ✅ for finished |
| TotalTime: 31s832ms |
| ExecutionTime: 30s1ms [Scan: 28s885ms (96.28%), Network: 0ns (0.00%), ResultDeliverTime: 7s613ms (25.38%), ScheduleTime: 145.701ms (0.49%)] |
| FrontendProfileMergeTime: 3.838ms |
| QueryPeakMemoryUsage: 141.367 MB, QueryAllocatedMemoryUsage: 82.422 GB |
| Top Most Time-consuming Nodes: |
| 1. FILE_SCAN (id=0) 🚀 : 28s902ms (85.43%) |
| 2. OLAP_TABLE_SINK 🚀 : 4s930ms (14.57%) |
| Top Most Memory-consuming Nodes: |
| Progress (finished operator/all operator): 0.00% |
| NonDefaultVariables: |
| big_query_profile_threshold: 0s -> 60s |
| enable_adaptive_sink_dop: false -> true |
| enable_profile: false -> true |
| sql_mode_v2: 32 -> 34 |
| use_compute_nodes: -1 -> 0 |
| Fragment 0 |
| │ BackendNum: 3 |
| │ InstancePeakMemoryUsage: 128.541 MB, InstanceAllocatedMemoryUsage: 82.422 GB |
| │ PrepareTime: 2.304ms |
| └──OLAP_TABLE_SINK |
| │ TotalTime: 4s930ms (14.57%) [CPUTime: 4s930ms] |
| │ OutputRows: 14.823M (14823424) |
| │ PartitionType: RANDOM |
| │ Table: hits |
| └──FILE_SCAN (id=0) 🚀 |
| Estimates: [row: ?, cpu: ?, memory: ?, network: ?, cost: ?] |
| TotalTime: 28s902ms (85.43%) [CPUTime: 17.038ms, ScanTime: 28s885ms] |
| OutputRows: 14.823M (14823424) |
| Progress (processed rows/total rows): ? |
| Detail Timers: [ScanTime = IOTaskExecTime + IOTaskWaitTime] |
| IOTaskExecTime: 25s612ms [min=19s376ms, max=28s804ms] |
| IOTaskWaitTime: 63.192ms [min=20.946ms, max=91.668ms] |
| |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------+
40 rows in set (0.04 sec)
プロファイルは、FILE_SCAN セクションが約 29 秒かかり、合計 32 秒の約 90% を占めていることを示しています。これは、オブジェクトストレージからデータを読み取ることが現在のロードプロセスのボトルネックであることを示しています。