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

Simple Log Service:スケジュール済み SQL に関する FAQ

最終更新日:Feb 18, 2025

このトピックでは、スケジュール済み SQL 機能に関するよくある質問への回答を提供します。

SQL 文を実行してデータを分析する場合、データの正確性を確保するにはどうすればよいですか?

データ分析結果は、次の理由により不正確になる可能性があります。データが Simple Log Service に書き込まれる際のレイテンシ、またはインスタンスのスケジューリング構成が無効です。

  • データが Simple Log Service に書き込まれる際に書き込みレイテンシが発生します。書き込みレイテンシが 5 分のシナリオでは、SQL タイムウィンドウが [12:02:00,12:03:00) のインスタンスが 12:03:00 に実行されると、Simple Log Service はそのタイムウィンドウのデータを取得できません。

  • データが Simple Log Service に書き込まれた後にクエリレイテンシが発生します。ほとんどの場合、レイテンシは 3 秒未満です。レイテンシが低い場合でも、一部のデータは取得できません。たとえば、SQL タイムウィンドウが [12:02:30,12:03:30) のインスタンスが 12:03:30 に実行されると、Simple Log Service はそのタイムウィンドウの 12:03:29 に Simple Log Service に書き込まれたログを取得できない場合があります。

  • 異なる時点で生成されたログが同じ分に Simple Log Service に書き込まれると、すべてのログは保存時刻に基づいて同じインデックスを持ちます。後のログは、以前のインデックスを持つことができます。たとえば、SQL タイムウィンドウが [12:02:30,12:03:30) のインスタンスが 12:03:30 に実行されるとします。12:02:20 と 12:02:50 に生成された 2 つのログが 12:02:50 に Simple Log Service に書き込まれると、両方のログは 12:02:20 を使用してインデックス化できます。この場合、Simple Log Service はタイムウィンドウ [12:02:30,12:03:30) のログを取得できません。

スケジュール済み SQL 機能を使用する場合は、ビジネス要件に基づいてデータの適時性と正確性のバランスをとることをお勧めします。

  • データが Simple Log Service にアップロードされると、レイテンシが発生する場合があります。この場合、インスタンスの実行時に、SQL タイムウィンドウのデータが Simple Log Service に完全にアップロードされていない可能性があります。この問題を防ぐために、[タスクの遅延] パラメーターと [SQL タイムウィンドウ] パラメーターを、データ収集レイテンシとビジネスで許容される最大結果表示レイテンシに基づいて構成することをお勧めします。インスタンスが期待どおりに実行されるように、理論値よりもわずかに早い値を指定することをお勧めします。

  • 順序付けられていないデータがアップロードされたときに処理結果の正確性を確保するために、インスタンスに 分単位または 時間単位の SQL タイムウィンドウを指定することをお勧めします。

レイテンシの問題を解決するにはどうすればよいですか?

方法 1

ログ時間の遅延を回避し、ログ時間が書き込み時間と一致するようにし、スケジュール済み SQL 計算でデータが欠落しないようにするには、取り込みプロセッサを使用してログストアに書き込む前にデータを処理します。

プロジェクトweb-project-test という名前の ログストアウェブサイト ログパブリック IP アドレスのログLogtail を使用してログが収集されますシンプルな Log Service SDK と という名前の ログストア が作成されているとします。 機能はログストアで有効になっています。 または を使用してログが収集されます。

  1. 取り込みプロセッサを作成します。

    1. Simple Log Service コンソール にログインします。 [プロジェクト] セクションで、web-project-test プロジェクトをクリックします。

    2. 左側のナビゲーションウィンドウで、[リソース] > [データプロセッサ] を選択します。

      image

    3. [データプロセッサ] > [取り込みプロセッサ] タブで、[作成] をクリックします。

      image

    4. [プロセッサの作成] パネルで、プロセッサ名と次の SPL 文を入力し、[OK] をクリックします。

      * | extend __time__=cast("__tag__:__receive_time__" as bigint)

  2. 取り込みプロセッサをログストアに関連付けます。

    1. 左側のナビゲーションウィンドウで、[ログストレージ] をクリックし、ポインターを website_log ログストアの上に移動し、[変更] を選択します。.

      image

    2. [ログストア属性] ページで、ページの右上隅にある [変更] をクリックします。編集モードで、[取り込みプロセッサ] からログストアに関連付ける取り込みプロセッサを選択します。

      ドロップダウン リストで、[保存] をクリックします。

      image

  3. 次の SQL 文を入力して、書き込み時間とログ時間の結果を確認します。

    * | SELECT 
        cast("__tag__:__receive_time__" as bigint) - cast(__time__ as bigint) as diff
    WHERE 
        cast("__tag__:__receive_time__" as bigint) - cast(__time__ as bigint) > 0

方法 2

ログストアは、レイテンシの問題を回避するために、サーバー時間を使用して時間を強制的に上書きすることをサポートしています。この機能を使用する場合は、チケットを送信 してください。

SQL 文を実行してデータを分析する場合、エラーを防ぐにはどうすればよいですか?

  • 有効な SQL 文を入力します。

  • 分析するフィールドに有効なインデックスを構成します。たとえば、クエリ文が * | select uid の場合、uid フィールドの分析を有効にする必要があります。詳細については、「インデックスの作成」をご参照ください。

  • アカウントに必要な権限が付与されていることを確認します。たとえば、アカウントには、SQL 文を実行してデータを分析する権限と、ログストアからデータを読み取る権限が付与されています。

  • 十分な計算リソースがあることを確認します。リソース制限の詳細については、「クエリと分析のリソース制限」をご参照ください。

  • 計算タイムアウトエラーを防ぐために、複雑な SQL 文を使用したり、長い SQL タイムウィンドウを構成したりしないことをお勧めします。Simple Log Service のタイムアウト期間は 10 分です。

スケジュール済み SQL ジョブの計算結果が宛先ログストアまたは Metricstore に書き込まれるとき、Simple Log Service はインデックスをチェックしますか?

いいえ、スケジュール済み SQL ジョブの計算結果が宛先ログストアまたは Metricstore に書き込まれるとき、Simple Log Service はインデックスをチェックしません。宛先ログストアまたは Metricstore のインデックスを構成していない場合、SQL 文を実行してデータを分析することはできません。ログの消費とクエリは影響を受けません。

スケジュール済み SQL ジョブを作成する前に、宛先ログストアまたは Metricstore のインデックスを構成することをお勧めします。宛先ログストアまたは Metricstore のインデックスを構成していない場合は、再インデックス機能を使用して既存データのインデックスを構成できます。詳細については、「ログストアのログを再インデックス化する」をご参照ください。

インスタンスのタイムアウトは後続の実行に影響しますか?

いいえ、インスタンスのタイムアウトは後続の実行に影響しません。後続のインスタンスのスケジュール時刻は、タイムアウトしたインスタンスのスケジュール時刻に従いますが、後続のインスタンスの作成と実行は遅延します。遅延は、インスタンスがスケジュールどおりに実行されるまで、後続のインスタンスをより高速で実行することで徐々に相殺できます。

遅延相殺シナリオでは、処理が必要なデータの量が固定されている場合、スケジューリング間隔が大きいほど相殺速度が速くなります。例:

  • 24 時間のデータを処理する必要があり、スケジューリング間隔が 1 分の場合、合計 1,440 個のインスタンスが生成され、各インスタンスは 20 秒間実行されます。

  • 24 時間のデータを処理する必要があり、スケジューリング間隔が 1 時間の場合、合計 24 個のインスタンスが生成され、各インスタンスは 2 分間実行されます。

    Simple Log Service は分散クエリと分析をサポートしており、処理が必要なデータが多い場合はより多くの計算リソースを割り当てます。

宛先ログストアまたは Metricstore に書き込まれたデータのソースを追跡するにはどうすればよいですか?

デフォルトでは、スケジュール済み SQL ジョブのデータが宛先ログストアまたは Metricstore に書き込まれるときに、次の __tag__ フィールドが追加されます。これらのフィールドを使用して、データのソースを追跡できます。

  • __tag__:__instance_id__:2b****06a: インスタンスの ID。

  • __tag__:__job__:from_now: ジョブの名前。

  • __tag__:__project__:ali-sls-etl-staging: ジョブが属するプロジェクト。

  • __tag__:__schedule_time__:1618474200: ジョブがスケジュールされている時点。値は UNIX タイムスタンプです。単位:秒。

  • __tag__:__trigger_time__:1618474259: ジョブが実行された時点。値は UNIX タイムスタンプです。単位:秒。

スケジュール済み SQL ジョブが宛先ログストアに書き込むログのカスタムログ時間を指定するにはどうすればよいですか?

ログ時間に基づいてログをクエリおよび分析し、デフォルトのログ時間を使用しない場合は、次のケースを参照してカスタムログ時間を指定できます。

説明
  • __time__ フィールドは、ログ時間を指定します。送信先のログストアでログ時間を表示できます。

    image

  • current_timestamp 関数は、現在の日付、時間、およびタイムゾーンを返します。詳細については、「current_timestamp 関数」をご参照ください。

スケジュール済み SQL ジョブが宛先ログストアに書き込むログのログ時間としてどの時間が使用されますか?

スケジュール済み SQL ジョブの SQL 文に __time__ フィールドが含まれていない場合、SQL タイムウィンドウの開始時刻がデフォルトのログ時間として使用されます。デフォルトでは、* | select * 文は __time__ フィールドをカバーします。

次の図では、SQL タイムウィンドウの開始時刻は 2024-09-14 15:46:00 です。Simple Log Service は、インスタンスの結果ログが宛先ログストアに書き込まれるログ時間として開始時刻を自動的に使用します。

image

ケース 1:ソースログストアのログ時間を、ログが宛先ログストアに書き込まれるログ時間として指定する

スケジュール済み SQL ジョブを作成するときは、指定する SQL 文に必要なフィールドとともに __time__ フィールドを追加する必要があります。 __time__ フィールドは、ソースログストアのログ時間を指定します。このようにして、ログがソースログストアから宛先ログストアに書き込まれると、Simple Log Service はクエリ文の結果から __time__ フィールドの値を取得し、その値をログが宛先ログストアに書き込まれるログ時間として使用します。

image

ケース 2:現在の時刻を、ログが宛先ログストアに書き込まれるログ時間として指定する

スケジュール済み SQL ジョブを作成する場合は、指定する SQL 文に必要なフィールドと共に、cast(to_unixtime(current_timestamp) as bigint) AS __time__ フィールドを追加する必要があります。 cast(to_unixtime(current_timestamp) AS __time__ フィールドは現在の時間を指定します。このようにして、Log Service は現在の時間を、ログが宛先ログストアに書き込まれるログ時間として使用します。 to_unixtime 関数の詳細については、「to_unixtime 関数」をご参照ください。 cast 関数の詳細については、「cast 関数」をご参照ください。

image

ケース 3:ソースログのタイムフィールドの値を、ログが宛先ログストアに書き込まれるログ時間として指定する

指定する SQL 文の start_time フィールドを、ソースログの実際のタイムフィールドに置き換える必要があります。フィールド値がタイムスタンプであることを確認してください。このようにして、Simple Log Service はクエリ文の結果の __time__ フィールドの値を、ログが宛先ログストアに書き込まれるログ時間として使用します。

image