メインコンテンツまでスキップ

Routine Load

ルーティンロード

ローディングパフォーマンスを向上させるにはどうすればよいですか?

方法1:実際のロードタスクの並列性を向上させるために、ロードジョブをできるだけ多くの並列ロードタスクに分割します。

注意

この方法はCPUリソースを消費し、多すぎるタブレットバージョンを引き起こす可能性があります。

実際のロードタスクの並列性は、いくつかのパラメータで構成された以下の式で決定されます。ただし、BEノードの数が上限値となります。

min(alive_be_number, partition_number, desired_concurrent_number, max_routine_load_task_concurrent_num)

パラメータの説明:

  • alive_be_number: BEノードの数。
  • partition_number: 処理するパーティションの数。
  • desired_concurrent_number: ルーティンロードジョブの期待されるロードタスクの並列性。デフォルト値は3です。このパラメータをより高い値に設定することで、実際のロードタスクの並列性を向上させることができます。
    • ルーティンロードジョブを作成していない場合は、CREATE ROUTINE LOADを使用する際にこのパラメータを設定する必要があります。
    • 既にルーティンロードジョブを作成している場合は、ALTER ROUTINE LOADを使用してこのパラメータを変更する必要があります。
  • max_routine_load_task_concurrent_num: ルーティンロードジョブのデフォルトの最大タスク並列性。デフォルト値は5です。このパラメータはFEの動的パラメータです。詳細と構成方法については、Parameter configurationを参照してください。

そのため、消費するパーティションの数とBEノードの数が他の2つのパラメータよりも大きい場合は、desired_concurrent_numbermax_routine_load_task_concurrent_numの値を増やして、実際のロードタスクの並列性を向上させることができます。

たとえば、消費するパーティションの数が7で、ライブなBEノードの数が5で、max_routine_load_task_concurrent_numがデフォルト値の5である場合、ロードタスクの並列性を上限値まで増やす必要がある場合は、desired_concurrent_number5(デフォルト値は3)に設定する必要があります。その結果、実際のタスクの並列性min(5,7,5,5)5になります。

その他のパラメータの説明については、CREATE ROUTINE LOADを参照してください。

方法2:1つ以上のパーティションからルーティンロードタスクが消費するデータ量を増やす。

注意

この方法はデータローディングの遅延を引き起こす可能性があります。

ルーチンロードタスクが消費できるメッセージ数の上限は、ロードタスクが消費できるメッセージの最大数を示すパラメータmax_routine_load_batch_sizeまたはメッセージ消費の最大期間を示すパラメータroutine_load_task_consume_secondによって決まります。ロードタスクがこれらの要件を満たすだけのデータを消費すると、消費が完了します。これら2つのパラメータはFEの動的パラメータです。詳細と構成方法については、Parameter configurationを参照してください。

ルーチンロードタスクが消費するデータ量の上限を決定するためには、be/log/be.INFOのログを表示してどのパラメーターが該当するかを分析することができます。そのパラメーターを増やすことで、ルーティンロードタスクが消費するデータ量を増やすことができます。

I0325 20:27:50.410579 15259 data_consumer_group.cpp:131] consumer group done: 41448fb1a0ca59ad-30e34dabfa7e47a0. consume time(ms)=3261, received rows=179190, received bytes=9855450, eos: 1, left_time: -261, left_bytes: 514432550, blocking get time(us): 3065086, blocking put time(us): 24855

通常、ログのleft_bytesフィールドが0以上であれば、ルーティンロードタスクがroutine_load_task_consume_second内でmax_routine_load_batch_sizeを超えるデータ量を消費していないことを示します。これは、スケジュールされたロードタスクのバッチがカフカから遅延なくすべてのデータを消費できることを意味します。この場合、routine_load_task_consume_secondの値を大きく設定して、1つ以上のパーティションからルーティンロードタスクが消費するデータ量を増やすことができます。

left_bytesフィールドが0未満の場合、ルーティンロードタスクがroutine_load_task_consume_second内でmax_routine_load_batch_sizeに到達していることを意味します。カフカのデータがスケジュールされたロードタスクのバッチを埋める度に、まだ消費されていない残りのデータがある可能性が非常に高く、消費の遅延を引き起こす原因となります。この場合、max_routine_load_batch_sizeを大きな値に設定することができます。

SHOW ROUTINE LOADの結果がPAUSED状態である場合にはどうすればよいですか?

  • ReasonOfStateChangedフィールドを確認し、エラーメッセージBroker: Offset out of rangeが報告されている場合は、以下の手順に従ってください。原因の分析: ロードジョブの消費オフセットがKafkaパーティションに存在しない。解決策: SHOW ROUTINE LOADを実行し、パラメータProgressでロードジョブの最新の消費オフセットを確認します。その後、対応するメッセージがKafkaパーティションに存在するかどうかを確認します。存在しない場合は、次の原因が考えられます。
    • ロードジョブの作成時に指定された消費オフセットが未来のオフセットです。
    • ロードジョブによる消費前にKafkaパーティションの指定された消費オフセットのメッセージが削除されている。データの読み込み速度に基づいて、適切なKafkaのログクリーニングポリシーやパラメータ(log.retention.hoursおよびlog.retention.bytesなど)を設定することをおすすめします。
  • ReasonOfStateChangedフィールドを確認し、エラーメッセージBroker: Offset out of rangeが報告されていない場合は、以下の手順に従ってください。原因の分析: ロードタスクのエラーレコード数がしきい値max_error_numberを超えています。解決策: ReasonOfStateChangedおよびErrorLogUrlsのエラーメッセージを使用して問題をトラブルシューティングおよび修正します。
    • データソースのデータ形式が正しくない場合は、データの形式を確認し、問題を修正する必要があります。問題を修正した後、RESUME ROUTINE LOADを使用して一時停止したロードジョブを再開することができます。
    • StarRocksがデータソースのデータ形式を解析できない場合は、しきい値max_error_numberを調整する必要があります。まず、SHOW ROUTINE LOADを実行してmax_error_numberの値を確認し、その後、ALTER ROUTINE LOADを使用してしきい値を増やします。しきい値を変更した後、RESUME ROUTINE LOADを使用して一時停止したロードジョブを再開します。

SHOW ROUTINE LOADの結果がCANCELLED状態である場合にはどうすればよいですか?

原因の分析: ロードジョブがロード中にテーブルが削除されなどの例外が発生しました。

解決策: 問題のトラブルシューティングと修正時には、ReasonOfStateChangedおよびErrorLogUrlsのエラーメッセージを参照することができます。ただし、問題が修正された後は、キャンセルされたロードジョブを再開することはできません。

ルーティンロードは、Kafkaから消費してStarRocksに書き込む際に一貫性のセマンティクスを保証できますか?

ルーティンロードは厳密な一度だけのセマンティクスを保証します。

各ロードタスクは個別のトランザクションです。トランザクションの実行中にエラーが発生した場合、トランザクションは中止され、FEは対応するロードタスクのパーティションの消費プログレスを更新しません。次回FEがタスクキューからロードタスクをスケジュールするとき、ロードタスクはパーティションの最後に保存された消費位置から消費リクエストを送信し、一度だけのセマンティクスを確保します。