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

E-MapReduce:データインポートに関するよくある質問

最終更新日:Aug 20, 2026

このトピックでは、StarRocks のデータインポートに関する一般的な質問に回答します。

「close index channel failed」または「too many tablet versions」エラー

  • 原因

    データインポートの頻度が高いため、コンパクションが間に合わず、未コンパクションのタブレットバージョン数がサポートされる上限を超えてしまいます。

  • 解決策

    デフォルトでは、サポートされる未コンパクションのバージョン数の上限は 1,000 です。この問題を解決するには:

    • 各インポートのデータ量を増やして、データインポートの頻度を減らします。

    • 各バックエンド (BE) の be.conf 設定ファイルで以下のパラメーターを変更し、コンパクションポリシーを調整してコンパクションを高速化します。

      cumulative_compaction_num_threads_per_disk = 4
      base_compaction_num_threads_per_disk = 2
      cumulative_compaction_check_interval_seconds = 2

「Label Already Exists」エラーへの対処

  • 問題の説明

    StarRocks クラスター内の同じデータベースで、同じラベルを持つインポートジョブが既に完了しているか、現在実行中です。

  • 原因

    Stream Load は HTTP プロトコルを使用してインポートジョブのリクエストを送信し、ほとんどの HTTP クライアントには組み込みのリトライメカニズムがあります。StarRocks クラスターが最初のリクエストを受信した後、Stream Load ジョブの処理を開始します。クライアントのタイムアウト期間が終了する前にクラスターがクライアントに応答しない場合、クライアントは同じリクエストを自動的に再送信することがあります。StarRocks クラスターは既に元のリクエストを処理中であるため、2番目のリクエストを拒否し、Label Already Exists エラーを返します。

  • 解決策

    異なるインポート方法間でのラベルの競合や、インポートジョブの重複送信がないか確認してください。以下のように問題を診断できます:

    • プライマリフロントエンド (FE) ノードのログでジョブのラベルを検索します。ラベルが2回出現する場合、クライアントが重複リクエストを送信しています。

      説明

      StarRocks クラスターでは、インポートジョブのラベルはインポート方法によってスコープが区切られていません。そのため、異なる種類のインポートジョブが同じラベルを使用すると競合する可能性があります。

    • SHOW LOAD WHERE LABEL = "xxx" ステートメントを実行して、同じラベルを持つインポートジョブが FINISHED 状態にあるかどうかを確認します。xxx をご利用のラベルに置き換えてください。

    この問題を回避するには、リクエストのデータ量に基づいてインポート時間を推定します。その後、クライアント側で十分な長さのリクエストタイムアウト期間を設定し、早すぎるリトライを避けてください。

「ETL_QUALITY_UNSATISFIED; msg:quality not good enough to cancel」エラーの解決

SHOW LOAD ステートメントを実行します。出力には、無効なデータに関する詳細情報を含む URL が含まれています。一般的なエラーは次のとおりです:

  • convert csv string to INT failed.

    ソースファイルの列にある文字列が、対応するデータ型に変換できません。例えば、システムが「abc」を数値に変換できない場合です。

  • the length of input is too long than schema.

    ソースデータファイルの列のデータが、スキーマで定義された長さを超えています。例えば、固定長文字列がテーブル作成時に指定された長さを超えたり、INT 値が 4 バイトを超えたりする場合です。

  • actual column number is less than schema column number.

    ソースファイルの行を指定された区切り文字で分割した結果、スキーマで定義された列数よりも少なくなる場合に発生します。これは、区切り文字が間違っていることが原因である可能性があります。

  • actual column number is more than schema column number.

    ソースファイルの行を指定された区切り文字で分割した結果、スキーマで定義された列数よりも多くなる場合に発生します。

  • the frac part length longer than schema scale.

    ソースデータファイルの DECIMAL 値の小数部分が、定義されたスケールを超えています。

  • the int part length longer than schema precision.

    ソースデータファイルの DECIMAL 値の整数部分が、定義された精度を超えています。

  • there is no corresponding partition for this key.

    インポートファイルの行のパーティションキー値が、定義されたパーティション範囲外にあります。

エラー: 十分なホストが見つかりませんでした

テーブルプロパティに "replication_num" = "1" を追加できます。

「Too many open files」エラーの解決

この問題を解決するには、次の手順に従います:

  1. システムのファイルハンドル数を増やします。

  2. base_compaction_num_threads_per_disk および cumulative_compaction_num_threads_per_disk パラメーターの値を減らします。それぞれのデフォルト値は 1 です。手順については、「パラメーターの変更」をご参照ください。

  3. 問題が解決しない場合は、クラスターをスケールアウトするか、インポート頻度を減らしてください。

「increase config load_process_max_memory_limit_percent」エラー

データインポート時に以下のようなエラーが表示された場合は、load_process_max_memory_limit_bytes および load_process_max_memory_limit_percent パラメーターを増やしてください。設定項目の変更方法については、「設定項目の変更」をご参照ください。

/root/starrocks/be/src/runtime/plan_fragment_executor.cpp:209 _sink->open(runtime_state())
W0516 15:58:30.892597 28779 fragment_mgr.cpp:193] Fail to open fragment 334f7f8c-0727-5909-afa3-9eb1dxxx : Internal error: intolerable failure in opening node channels
/root/starrocks/be/src/runtime/plan_fragment_executor.cpp:209 _sink->open(runtime_state())
W0516 15:58:30.898306 28779 stream_load_executor.cpp:94] fragment execute failed, query_id=334f7f8c07275909-afa39eb1dxxx, err_msg=intolerable failure in opening node channels, id=334f7f8c07275909-afa3
9eb1db88af94, job_id=-1, txn_id=633657, label=156936fa-1134-4c4c-b473-fa05b4b8bf8c
W0516 15:58:30.907560 28985 stream_load.cpp:315] append body content failed. errmsg=cancelledid=334f7f8c07275909-afa39eb1dbxxx, job_id=-1, txn_id=633657, label=156936fa-1134-4c4c-b473-fa05b4b8bf8c
W0516 15:58:34.353019 28993 data_sink.cpp:104] Ignore option use_vectorized=false
W0516 15:58:34.353847 28795 tablet_sink.cpp:605] NodeChannel[15381-10004]: tablet open failed, load_id=cb4e78a6-f026-c3d9-a700-aba4xxx, txn_id=6336xxx, node=10.28.xxx, 8060, errmsg=memory limit exc
eeded, please reduce load frequency or increase config `load_process_max_memory_limit_percent` or add more BE nodes
W0516 15:58:34.353901 28795 tablet_sink.cpp:605] NodeChannel[15381-10003]: tablet open failed, load_id=cb4e78a6-f026-c3d9-a700-aba4xxx, txn_id=6336xxx, node=10.28.xxx, 8060, errmsg=memory limit exc
eeded, please reduce load frequency or increase config `load_process_max_memory_limit_percent` or add more BE nodes
W0516 15:58:34.353909 28795 tablet_sink.cpp:605] NodeChannel[15381-149009]: tablet open failed, load_id=cb4e78a6-f026-c3d9-a700-abaxxx, txn_id=633xxx, node=10.2xxx, 8060, errmsg=memory limit exc
eeded, please reduce load frequency or increase config `load_process_max_memory_limit_percent` or add more BE nodes
W0516 15:58:34.353914 28795 tablet_sink.cpp:605] NodeChannel[15381-10002]: tablet open failed, load_id=cb4e78a6-f026-c3d9-a700-aba4xxx, txn_id=6336xxx, node=10.28.xxx, 8060, errmsg=memory limit exc
eeded, please reduce load frequency or increase config `load_process_max_memory_limit_percent` or add more BE nodes
W0516 15:58:34.353976 28795 tablet_sink.cpp:605] NodeChannel[15381-149010]: tablet open failed, load_id=cb4e78a6-f026-c3d9-a700-abaxxx, txn_id=633xxx, node=10.2xxx, 8060, errmsg=memory limit exc
eeded, please reduce load frequency or increase config `load_process_max_memory_limit_percent` or add more BE nodes
W0516 15:58:34.353983 28795 tablet_sink.cpp:613] open failed, load_id=cb4e78a6f026c3d9-a700aba44764c288
W0516 15:58:34.353992 28795 plan_fragment_executor.cpp:188] fail to open fragment, instance_id=cb4e78a6-f026-c3d9-a700-aba44xxx, status=Internal error: intolerable failure in opening node channels
/root/starrocks/be/src/runtime/plan_fragment_executor.cpp:209 _sink->open(runtime_state())
W0516 15:58:34.354202 28795 fragment_mgr.cpp:193] Fail to open fragment cb4e78a6-f026-c3d9-a700-aba447xxx : Internal error: intolerable failure in opening node channels
/root/starrocks/be/src/runtime/plan_fragment_executor.cpp:209 _sink->open(runtime_state())
W0516 15:58:34.600633 28795 stream_load_executor.cpp:94] fragment execute failed, query_id=cb4e78a6f026c3d9-a700aba44xxx, err_msg=intolerable failure in opening node channels, id=cb4e78a6f026c3d9-a700
aba44764c288, job_id=-1, txn_id=633662, label=156936fa-1134-4c4c-b473-fa05b4b8bf8c
W0516 15:58:34.600664 28993 stream_load.cpp:132] Fail to handle streaming load, id=cb4e78a6f026c3d9-a700aba447xxx errmsg=intolerable failure in opening node channels
W0516 15:58:39.555845 28995 data_sink.cpp:104] Ignore option use_vectorized=false

データインポート中の RPC タイムアウト

BE の be.conf ファイルにある write_buffer_size パラメーターを確認してください。このパラメーターは BE 上のメモリブロックのサイズしきい値を設定し、デフォルトは 100 MB です。このしきい値が大きすぎると、RPC タイムアウトが発生する可能性があります。これを解決するには、write_buffer_size と tablet_writer_rpc_timeout_sec パラメーターを調整してください。BE 設定パラメーターの詳細については、「パラメーター設定」をご参照ください。

エラー:「Value count does not match column count」

  • 問題の説明

    インポートジョブが失敗し、エラー詳細 URL に「Value count does not match column count」というエラーが表示されます。これは、ソースデータの列数が宛先テーブルの列数と一致しないことを示します。

    Error: Value count does not match column count. Expect 3, but got 1. Row: 2023-01-01T18:29:00Z,cpu0,80.99
    Error: Value count does not match column count. Expect 3, but got 1. Row: 2023-01-01T18:29:10Z,cpu1,75.23
    Error: Value count does not match column count. Expect 3, but got 1. Row: 2023-01-01T18:29:20Z,cpu2,59.44
  • 原因

    このエラーは、インポートコマンドまたはインポートステートメントで指定された列区切り文字がソースデータの区切り文字と一致しない場合に発生します。この例では、ソースデータには3つの列があり、列区切り文字としてカンマ (,) を使用しています。しかし、インポートコマンドまたはステートメントでタブ文字 (\t) を区切り文字として指定すると、ソースデータの3つの列が誤って1つの列として解析されます。

  • 解決策

    インポートコマンドまたはインポートステートメントの列区切り文字をカンマ (,) に変更し、インポートジョブを再試行してください。

インポート方法の選択

詳細については、「データインポート」をご参照ください。

インポート性能に影響を与える要因

以下の要因がインポート性能に影響します:

  • サーバーメモリ

    多数のタブレットは、大量のサーバーメモリを消費します。「バケットの実行方法」で説明されているように、各タブレットのサイズを見積もることを推奨します。

  • ディスク I/O 容量とネットワーク帯域幅

    通常、50 Mbit/s から 100 Mbit/s のネットワーク帯域幅で十分です。

  • インポートのバッチサイズと頻度

    • Stream Load の場合、インポートのバッチサイズは 10 MB から 100 MB を推奨します。

    • Broker Load は、大きなバッチサイズに最適です。

    • 高いインポート頻度は避けてください。SATA HDD の場合、1秒あたり1つのインポートジョブを超えないようにしてください。

Stream Load でのヘッダー行のスキップ

Stream Load は、最初の行をヘッダーとして扱ったり、スキップしたりすることをサポートしていません。Stream Load は最初の行を通常のデータとして扱います。インポートするテキストファイルにヘッダー行が含まれている場合は、次のいずれかの方法を使用してください:

  • エクスポートツールの設定を変更して、ヘッダー行なしでテキストファイルを再エクスポートします。

  • sed -i '1d' filename コマンドを使用して、テキストファイルの最初の行を削除します。

  • Stream Load ステートメントで -H "where: column_name != 'header_text'" を使用して、最初の行をフィルタリングします。

    StarRocks はまずデータ型を変換し、次にフィルターを適用します。ヘッダー行の値がターゲットのデータ型に変換できない場合、その値は null になります。したがって、StarRocks テーブルの列には NOT NULL 制約があってはなりません。

  • Stream Load ステートメントに -H "max_filter_ratio:0.01" を追加して、インポートジョブのフォールトトレランス率を設定し、ヘッダー行をエラーとして無視できるようにします。データ量に応じて率を 1% 以下に設定できますが、少なくとも1つのエラー行を許容できる高さでなければなりません。この設定では、インポートジョブは成功しますが、返される ErrorURL にはヘッダー行のエラーが引き続きリストされます。フォールトトレランス率を高く設定しすぎると、他の正当なデータエラーが見過ごされる可能性があるため、避けてください。

Stream Load における非標準パーティションキー

StarRocks は、インポートプロセス中のデータ変換をサポートしています。

例えば、ソースデータファイル TEST が CSV 形式で、列 NO、DATE、VERSION、PRICE を含み、DATE 列が非標準の 202106.00 形式であるとします。StarRocks で DATE 列をパーティションキーとして使用するには、StarRocks に列 NO、VERSION、PRICE、DATE を含むテーブルを作成し、DATE 列のデータ型を DATE、DATETIME、または INT として指定します。その後、Stream Load ステートメントで次の設定を使用して列を変換します。

-H "columns: NO,DATE_1, VERSION, PRICE, DATE=LEFT(DATE_1,6)"

この例では、DATE_1 はソースデータの仮のプレースホルダーとして機能します。次に LEFT() 関数がこのデータを変換し、その結果が StarRocks テーブルの DATE 列に割り当てられます。ソース CSV ファイルのすべての列を、変換関数を適用する前に一時的な名前にマッピングする必要があることに注意してください。列変換に使用される関数は、非集計関数やウィンドウ関数などのスカラー関数でなければなりません。

「body exceed max size: 10737418240, limit: 10737418240」エラー

  • 原因

    ソースデータファイルが、Stream Load でサポートされる最大ファイルサイズ (10 GB) を超えています。

  • 解決策

    • seq -w 0 n コマンドを使用して、ソースデータファイルをより小さなファイルに分割します。

    • curl -XPOST http:///be_host:http_port/api/update_config?streaming_load_max_mb=<file_size> コマンドを実行して、BE ノードの streaming_load_max_mb パラメーターを変更し、ファイルサイズ制限を増やします。BE パラメーター設定の詳細については、「パラメーター設定」をご参照ください。

インポート性能の向上

方法1:タスクの並列度を上げる

説明

この方法は、より多くの CPU リソースを消費し、過剰な数のタブレットバージョンを生成する可能性があります。

各インポートジョブを複数の並列インポートタスクに分割します。実際のタスク並列度は、次の式によって決定されます:

min(alive_be_number, partition_number, desired_concurrent_number, max_routine_load_task_concurrent_num)

この式のパラメーターは次のとおりです:

  • alive_be_number:アクティブな BE ノードの数。

  • partition_number:消費するパーティションの数。

  • desired_concurrent_number:単一の Routine Load ジョブに期待されるタスク並列度。デフォルトは 3 です。

    • 新しいインポートジョブの場合、CREATE ROUTINE LOAD を実行するときにこのパラメーターを設定します。

    • 既存のインポートジョブの場合、ALTER ROUTINE LOAD を実行するときにこのパラメーターを変更します。

  • max_routine_load_task_concurrent_num:Routine Load ジョブの最大タスク並列度。デフォルトは 5 です。これは FE の動的パラメーターです。設定の詳細については、「パラメーター設定」をご参照ください。

したがって、パーティション数と BE ノード数が多く、desired_concurrent_number および max_routine_load_task_concurrent_num パラメーターを超える場合に実際のタスク並列度を上げる必要がある場合は、desired_concurrent_number および max_routine_load_task_concurrent_num パラメーターを増やすことができます。

例えば、7つのパーティションと5つのアクティブな BE ノードがあり、max_routine_load_task_concurrent_num がデフォルト値の 5 に設定されているとします。実際のタスク並列度を最大化するには、desired_concurrent_number を 5 に設定する必要があります (デフォルトは 3)。実際のタスク並列度は min(5,7,5,5) と計算され、5 になります。

方法2:インポートタスクあたりのデータ量を増やす

説明

この方法は、インポートのレイテンシーを増加させる可能性があります。

2つの FE 動的パラメーター、max_routine_load_batch_size と routine_load_task_consume_second は、インポートタスクが消費できる最大データ量を制御します。インポートタスクは、いずれかのパラメーターのしきい値に達すると終了します。設定の詳細については、「パラメーター設定」をご参照ください。

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 の制限に達しなかったことを示します。これは、インポートタスクが Kafka からのデータストリームに追いついており、消費レイテンシーが発生していないことを意味します。この場合、routine_load_task_consume_second を増やして、各インポートタスクが消費するデータ量を増やすことができます。

left_bytes < 0 の場合、バッチが時間制限 (routine_load_task_consume_second) が切れる前に max_routine_load_batch_size の制限に達したことを示します。これは、各インポートバッチが容量いっぱいまで満たされており、Kafka からのデータバックログにつながる可能性があることを示唆しています。このシナリオでは、max_routine_load_batch_size を増やすことができます。

PAUSED および CANCELLED 状態のインポートジョブのトラブルシューティング

エラーメッセージに基づいて問題をトラブルシューティングします:

  • エラーメッセージ:インポートジョブは PAUSED で、ReasonOfStateChanged には Broker: Offset out of range というエラーが表示されます。

    • 原因:インポートジョブのコンシューマオフセットが Kafka パーティションに存在しません。

    • 解決策:SHOW ROUTINE LOAD コマンドを実行して、Progress パラメーターで最新のコンシューマオフセットを表示します。次に、このオフセットを持つメッセージが Kafka パーティションに存在するかどうかを確認します。存在しない場合、次の2つの理由が考えられます:

      • 指定されたコンシューマオフセットが未来の時点に設定されている。

      • インポートジョブがメッセージを消費する前に、ログクリーンアップポリシーによってメッセージが Kafka パーティションから削除された。インポートジョブの取り込みレートに基づいて、log.retention.hours や log.retention.bytes などの適切な Kafka ログクリーンアップポリシーとパラメーターを設定します。

  • エラーメッセージ:インポートジョブは PAUSED です。

    • 原因:インポートタスクのエラー行数がエラー行のしきい値 max_error_number を超えた可能性があります。

    • 解決策:ReasonOfStateChanged のメッセージと ErrorLogUrls で提供される URL のログを確認して問題を調査します。

      • データソースにデータ形式の問題がある場合は、データを修正します。その後、RESUME ROUTINE LOAD コマンドを実行して、PAUSED 状態のインポートジョブを再開します。

      • StarRocks がデータソースからデータを解析できない場合は、エラー行のしきい値 max_error_number を調整します。

        1. SHOW ROUTINE LOAD コマンドを実行して、現在の max_error_number の値を確認します。

        2. ALTER ROUTINE LOAD コマンドを実行して、max_error_number の値を増やします。

        3. RESUME ROUTINE LOAD コマンドを実行して、PAUSED 状態のインポートジョブを再開します。

  • エラーメッセージ:インポートジョブは CANCELLED です。

    • 原因:インポートタスク中に例外が発生した可能性があります。例えば、宛先テーブルが削除された場合などです。

    • 解決策:ReasonOfStateChanged のメッセージまたは ErrorLogUrls で提供される URL のログを確認して、問題をトラブルシューティングし、修正します。ただし、インポートジョブが CANCELLED になると、問題が解決された後でも再開することはできません。

Routine Load と 1 回限りのセマンティクス

はい、Routine Load は 1 回限りのセマンティクスを保証します。

各インポートタスクは単一のトランザクションとして実行されます。インポートタスクが失敗した場合、トランザクションは中止され、FE は関連するパーティションの消費進捗を更新しません。FE がタスク実行キューから次のインポートタスクをスケジュールする際、パーティションの最後に保存されたコンシューマオフセットから消費リクエストを開始します。このプロセスにより、1 回限りのセマンティクスが保証されます。

「Broker: Offset out of range」エラー

SHOW ROUTINE LOAD コマンドを実行して最新のオフセットを表示します。次に、Kafka クライアントを使用して、そのオフセットにデータが存在するかどうかを確認します。考えられる原因は次のとおりです:

  • インポート中に未来のオフセットが指定されている。

  • インポートジョブが処理する前に、Kafka が指定されたオフセットのデータを削除してしまう。StarRocks のインポート速度に合わせて、log.retention.hours や log.retention.bytes などの適切なログ保持パラメーターを設定する必要があります。

FINISHED 状態の Broker Load ジョブの再実行

いいえ。FINISHED 状態のインポートジョブを再実行することはできません。1 回限りのセマンティクスを保証するため、成功したインポートジョブのラベルを再利用することはできません。SHOW LOAD ステートメントを使用してインポート履歴を表示し、再実行したいジョブを見つけ、その設定をコピーし、新しいラベルを割り当てて、新しいインポートジョブを作成して実行することができます。

Broker Load での日付フィールドの8時間オフセット

  • 原因

    これはタイムゾーンの不一致が原因で発生します。StarRocks テーブルと Broker Load インポートジョブは中国標準時 (UTC+8) を使用していますが、サーバーは UTC を使用しています。この違いにより、インポートプロセスで日付フィールドに8時間のオフセットが追加されます。

  • 解決策

    テーブルを作成する際に timezone パラメーターを削除してください。

ORC データの Broker Load 中の「ErrorMsg: type:ETL_RUN_FAIL; msg:Cannot cast '<slot 6>' from VARCHAR to ARRAY<VARCHAR(30)>」エラー

  • 原因

    このエラーは、ソースデータファイルの列名と宛先の StarRocks テーブルの列名が一致しないことが原因です。この不一致により SET ステートメントがトリガーされ、キャスト関数内でデータ型の変換に失敗します。

  • 解決策

    ソースファイルの列名が StarRocks テーブルの列名と一致することを確認してください。これにより、SET ステートメントとデータ型変換が不要になり、インポートが成功します。

Broker Load 後にデータが見つからない

Broker Load は非同期のインポート方法です。インポートジョブの送信が成功したからといって、インポートが成功したわけではありません。SHOW LOAD ステートメントを実行して、インポートジョブの最終ステータスと errmsg フィールドのエラーメッセージを確認できます。ジョブが失敗した場合は、そのパラメーターを修正して再試行してください。

エラー:「failed to send batch」または「TabletWriter add batch with unknown id」

このエラーは、データ書き込みのタイムアウトを示します。これを解決するには、システム変数 query_timeout と BE パラメーター streaming_load_rpc_max_alive_time_sec を変更してください。BE パラメーターの詳細については、「パラメーター設定」をご参照ください。

「LOAD-RUN-FAIL; msg:OrcScannerAdapter::init_include_columns. col name = xxx not found」エラー

Parquet または ORC ファイルからデータをインポートする場合、ファイルヘッダーの列名が StarRocks テーブルの列名と一致することを確認してください。

次の例では、SET 句を使用して、Parquet または ORC ファイルの列 tmp_c1 と tmp_c2 を StarRocks テーブルの name 列と id 列にマッピングします。SET 句がない場合、StarRocks は column_list パラメーターで指定された列に位置でマッピングします。

(tmp_c1,tmp_c2)
SET
(
   id=tmp_c2,
   name=tmp_c1
)

Apache Hive によって生成された ORC ファイルをインポートすると、そのテーブルヘッダーが (_col0, _col1, _col2, ...) の場合、「Invalid Column Name」エラーが発生することがあります。この場合、SET 句を使用して列マッピングルールを定義する必要があります。

長時間実行されるインポートジョブのトラブルシューティング

FE の fe.log ファイルで、ラベルを使用してインポートジョブ ID を見つけます。次に、BE の be.INFO ファイルで、この ID を使用して関連するログエントリを見つけ、原因を特定します。

HDFS Federation 用の ViewFs の設定

設定ファイル core-site.xml と hdfs-site.xml を broker/conf ディレクトリにコピーします。

カスタムファイルシステムを使用する場合は、対応する .jar ファイルも broker/lib ディレクトリにコピーしてください。

「Can't get Kerberos realm」エラー

  1. ブローカーが実行されているすべてのノードで /etc/krb5.conf ファイルが設定されていることを確認してください。

  2. エラーが解決しない場合は、ブローカーの起動スクリプトの JAVA_OPTS 変数に -Djava.security.krb5.conf:/etc/krb5.conf を追加してください。

単一レコード挿入のパフォーマンス低下

INSERT INTO statement は batch write 用に設計されています。single write は batch write と同じくらいの時間がかかります。したがって、OLAP scenario では、single write に INSERT INTO statement を使用しないでください。

「index channel has intolerable failure」エラー

このエラーは、Stream Load の RPC タイムアウトが原因で発生します。これを解決するには、設定ファイルで RPC タイムアウトパラメーターを調整してください。

BE 設定ファイル be.conf で次の2つのシステムパラメーターを変更し、変更を有効にするためにクラスターを再起動します。

  • streaming_load_rpc_max_alive_time_sec:Stream Load の RPC タイムアウト。デフォルト:1200秒。

  • tablet_writer_rpc_timeout_sec:TabletWriter のタイムアウト。デフォルト:600秒。

INSERT INTO SELECT が execute timeout で失敗する

このエラーはクエリのタイムアウトが原因です。セッション変数 query_timeout を調整することでこの問題を解決できます。このパラメーターのデフォルト値は 600 秒です。

例:

set query_timeout =xx;

Flink ジョブエラー:必須オプションがありません

  • 原因

    このエラーは、StarRocks-migrate-tools (SMT) の設定ファイル config_prod.conf 内にある、[table-rule.1] や [table-rule.2] などの複数のルールに、必須の設定情報が欠落していることが原因です。

  • 解決策

    [table-rule.1] や [table-rule.2] などの各ルールに、データベース、テーブル、Flink Connector の情報が設定されていることを確認してください。

失敗したタスクの自動再起動

Flink は、チェックポイントメカニズムと再起動ポリシーを使用して、失敗したタスクを自動的に再起動します。

例えば、チェックポイントメカニズムを有効にし、デフォルトの再起動ポリシー (固定遅延再起動ポリシー) を使用するには、flink-conf.yaml ファイルに次の設定を追加します:

# unit: ms
execution.checkpointing.interval: 300000
state.backend: filesystem
state.checkpoints.dir: file:///tmp/flink-checkpoints-directory

パラメーター:

  • execution.checkpointing.interval:チェックポイント間の基本間隔 (ミリ秒)。チェックポイントメカニズムを有効にするには、このパラメーターを 0 より大きい値に設定します。

  • state.backend:チェックポイントが有効な場合、Flink は各チェックポイントでアプリケーションの状態を永続化し、回復中のデータ損失を防ぎ、一貫性を確保します。選択された状態バックエンドは、状態のストレージ形式、永続化方法、および場所を決定します。詳細については、「状態バックエンド」をご参照ください。

  • state.checkpoints.dir:チェックポイントデータを保存するディレクトリ。

Flink ジョブの停止と復元

Flink ジョブを停止する際、手動でセーブポイントをトリガーできます。セーブポイントは、ストリーミングジョブの実行状態の一貫したスナップショットであり、チェックポイントメカニズムによって作成されます。後でセーブポイントからジョブを復元できます。

セーブポイントでジョブを停止するには、Flink はまずジョブのセーブポイントをトリガーし、その後ジョブを停止します。セーブポイントを保存するターゲットディレクトリを指定することもできます。

Flink ジョブを停止してセーブポイントを作成するには、次のコマンドを実行します:

bin/flink stop --type [native/canonical] --savepointPath [:targetDirectory] :jobId

パラメーター:

  • jobId:Flink ジョブ ID は、Flink WebUI で確認するか、flink list -running コマンドを実行して確認できます。

  • targetDirectory:セーブポイントを保存するディレクトリ。flink-conf.yml の state.savepoints.dir パラメーターを設定して、デフォルトのディレクトリを構成することもできます。デフォルトのディレクトリが設定されている場合、このパラメーターはオプションです。

    state.savepoints.dir: [file://or hdfs://]/home/user/savepoints_dir

セーブポイントからジョブを復元するには、ジョブを再送信する際にセーブポイントのパスを指定します:

./flink run -c com.starrocks.connector.flink.tools.ExecuteSQL -s savepoints_dir/savepoints-xxxxxxxx flink-connector-starrocks-xxxx.jar -f flink-create.all.sql

1回限りのセマンティクスでのデータインポートの失敗

  • 説明:システムは次のエラーを報告します。

    com.starrocks.data.load.stream.exception.StreamLoadFailException: {
        "TxnId": 3382****,
        "Label": "502c2770-cd48-423d-b6b7-9d8f9a59****",
        "Status": "Fail",
        "Message": "timeout by txn manager",-- Error message
        "NumberTotalRows": 1637,
        "NumberLoadedRows": 1637,
        "NumberFilteredRows": 0,
        "NumberUnselectedRows": 0,
        "LoadBytes": 4284214,
        "LoadTimeMs": 120294,
        "BeginTxnTimeMs": 0,
        "StreamLoadPlanTimeMs": 7,
        "ReadDataTimeMs": 9,
        "WriteDataTimeMs": 120278,
        "CommitAndPublishTimeMs": 0
    }
  • 原因:sink.properties.timeout の値が Flink のチェックポイント間隔より短いため、トランザクションがタイムアウトします。

  • 解決策:このパラメーターを Flink のチェックポイント間隔より大きい値に設定してください。

flink-connector-jdbc_2.11 sink から StarRocks へのタイムラグ

  • 問題の説明:Flink の localtimestamp 関数で生成された時刻は正しいですが、StarRocks に書き込まれた後 8 時間遅れます。Flink と StarRocks の両サーバーは Asia/Shanghai タイムゾーン (UTC+8) に設定されています。Flink のバージョンは 1.12 で、ドライバーは flink-connector-jdbc_2.11 です。

  • 解決策:この問題を解決するには、Flink の sink テーブルでタイムゾーンを設定します。パラメーター 'server-time-zone' = 'Asia/Shanghai' を設定し、url パラメーターに &serverTimezone=Asia/Shanghai を追加します。次の例にこの設定を示します。

    CREATE TABLE sk (
        sid int,
        local_dtm TIMESTAMP,
        curr_dtm TIMESTAMP
    )
    WITH (
        'connector' = 'jdbc',
        'url' = 'jdbc:mysql://192.168.**.**:9030/sys_device?characterEncoding=utf-8&serverTimezone=Asia/Shanghai',
        'table-name' = 'sink',
        'driver' = 'com.mysql.jdbc.Driver',
        'username' = 'sr',
        'password' = 'sr123',
        'server-time-zone' = 'Asia/Shanghai'
    );

外部 Kafka クラスターからのインポートができない

  • 説明:インポートは次のエラーメッセージで失敗します:

    failed to query wartermark offset, err: Local: Bad message format
  • 原因:StarRocks ノードが Kafka ブローカーのホスト名を解決できません。

  • 解決策:各 StarRocks ノードの /etc/hosts ファイルに Kafka ブローカーのホスト名と IP アドレスを追加してください。

アイドル時の BE のメモリと CPU 使用率が高い

BE ノードは定期的に統計情報を収集するため、持続的な高い使用率ではなく、一時的に CPU 使用率が急上昇します。さらに、BE ノードは使用済みのメモリを最大 10 GiB まで保持し、内部で管理し、オペレーティングシステムに解放しません。このメモリ保持のしきい値は tc_use_memory_min パラメーターで設定できます。

tc_use_memory_min は、TCmalloc が予約する最小メモリを指定します。デフォルト値は 10,737,418,240 (10 GiB) です。StarRocks は、使用済みメモリがこの値を超えた場合にのみ、アイドル状態のメモリをオペレーティングシステムに返します。このパラメーターは、EMR コンソールの StarRocks サービスのConfigureタブの be.conf ファイルで設定できます。BE ノードのパラメーターの詳細については、「パラメーター設定」をご参照ください。

BE がメモリを解放しない理由

これは期待される動作です。データベースはオペレーティングシステムから大きなメモリブロックを割り当て、多くの場合、すぐに必要とされる量よりも多くを事前に割り当て、このメモリを再利用のために保持します。この戦略により、頻繁でコストのかかるメモリの再割り当てのパフォーマンスオーバーヘッドを回避できます。この動作を確認するには、テスト環境で長期間にわたってメモリ使用量を監視し、メモリが最終的に解放されるかどうかを確認してください。

Flink Connector の依存関係を解決できない

  • 原因:Flink Connector の依存関係は Alibaba Cloud ミラーから取得する必要があります。このエラーは、/etc/maven/settings.xml ファイルのミラーセクションが、すべてのリポジトリリクエストをこのミラーにリダイレクトするように設定されていないために発生します。

  • 解決策:/etc/maven/settings.xml で、ミラーセクションを Alibaba Cloud パブリックリポジトリを使用するように設定します:https://maven.aliyun.com/repository/public。

sink.buffer-flush.interval-ms パラメーターの有効性

  • 問題の説明:sink.buffer-flush.interval-ms が 15s に設定され、checkpoint interval=5mins の場合、sink.buffer-flush.interval-ms はまだ有効ですか?

    +----------------------+--------------------------------------------------------------+
    |         Option       | Required |  Default   | Type   |       Description           |
    +-------------------------------------------------------------------------------------+
    |  sink.buffer-flush.  |  NO      |   300000   | String | the flushing time interval, |
    |  interval-ms         |          |            |        | range: [1000ms, 3600000ms]  |
    +----------------------+--------------------------------------------------------------+
  • 解決策:次の3つのしきい値のうち、最初に満たされたときにフラッシュがトリガーされます。この動作は checkpoint interval とは無関係です。checkpoint interval は 1 回限りのセマンティクス専用ですが、sink.buffer-flush.interval-ms は at-least-once セマンティクス用です。

    sink.buffer-flush.max-rows
    sink.buffer-flush.max-bytes
    sink.buffer-flush.interval-ms

DataX でのデータ更新

DataX は、プライマリキーモデルのデータ更新をサポートするようになりました。これを有効にするには、JSON 設定ファイルの reader セクションに _op フィールドを追加します。

フィールド名におけるキーワードの扱い

フィールド名をバッククォート (`) で囲みます。

HADOOP-CONF-DIR または YARN-CONF-DIR を設定する必要があります

このエラーは、Spark Load に必要な HADOOP-CONF-DIR 環境変数が、spark クライアントの spark-env.sh ファイルに設定されていないことを示します。

spark-submit コマンドが「No such file or directory」エラーで失敗する

このエラーは、Spark Load を使用しているときに、spark_home_default_dir パラメーターが指定されていないか、誤った Spark クライアントのルートディレクトリに設定されている場合に発生します。

「File xxx/jars/spark-2x.zip does not exist」エラー

Spark Load を使用している場合、このエラーは spark-resource-path パラメーターがパッケージ化された ZIP ファイルを指していないことを示します。ファイルパスとファイル名を確認してください。

「Yarn client does not exist」エラー

このエラーは、yarn-client-path パラメーターが YARN 実行可能ファイルへのパスを指定していないことを示します。