Log Serviceは、スケジュールされたSQL機能を提供します。 この機能を使用して、定期的にデータを自動的に分析し、データを集計して保存できます。 この機能を使用して、データをプロジェクトおよびフィルタリングすることもできます。 このトピックでは、Scheduled SQLの背景情報、機能、用語、スケジューリングと実行シナリオ、および使用法のメモについて説明します。
背景情報
ログやメトリックなどの時間関連データは、過度に大量に蓄積される可能性があります。 例えば、1日に1千万件のデータレコードが生成された場合、年間に合計約3.6億件のデータレコードが蓄積される。 長期的なデータ保持には大きなストレージが必要です。 必要なストレージを削減するためにデータ保持期間を短縮すると、ストレージコストを削減できます。 しかし、これは貴重なデータの損失をもたらす可能性がある。 さらに、大量のデータは、分析性能を低下させ得る。
データの保存と分析には、次の要件があります。
ほとんどのメトリックは時間に敏感です。 履歴データは分または時間の精度を持つことができますが、新しいデータはより高い精度が必要です。
データ運用スペシャリストやデータサイエンティストなどのデータユーザーは、分析のために完全なデータを保存する必要があります。
完全なデータの処理と迅速な応答時間は、データ分析中にバランスを取る必要があります。
上記の要件を満たすために、Simple Log ServiceはスケジュールされたSQL機能を提供します。 この機能を使用して、高精度の履歴データを低精度のデータに圧縮し、圧縮したデータを長期間保存できます。 スケジュールされたSQL機能を有効にすると、ビジネス要件に基づいて、ソースLogstoreまたはMetricstoreのデータ保持期間を15日などの小さな値に変更し、ターゲットLogstoreまたはMetricstoreのデータ保持期間を永続的なものに変更できます。 これにより、長寿命のデータを分析する際の待ち時間を短縮し、ストレージコストを削減できます。
特徴
Scheduled SQLは、SQL-92構文とSimple Log Serviceクエリステートメントの構文をサポートしています。 スケジュールされたSQLジョブは、スケジューリングルールに基づいて定期的に実行され、分析結果を宛先LogstoreまたはMetricstoreに書き込みます。
スケジュールされたデータ分析: ビジネス要件に基づいてSQL文またはクエリ文を作成し、スケジュールされたデータ分析を実行し、分析結果を宛先LogstoreまたはMetricstoreに保存できます。
グローバルアグリゲーション: ストレージ用に完全かつ詳細なデータを集約できます。 このプロセスは、データの非可逆圧縮を含む。 圧縮後のストレージサイズとデータ精度は要件を満たす必要があります。 例:
2番目の精度に基づいてストレージ用に3.6億のデータレコードを集計すると、合計31.5万のデータレコードが保存され、ストレージサイズはフルデータの0.875% になります。
分精度に基づいて3.6億のデータレコードをストレージに集計すると、合計525,000のデータレコードが保存され、ストレージサイズはフルデータの0.015% になります。
投影とフィルタリング: 特定の条件に基づいてフィールドごとに生データをフィルタリングし、取得したデータを宛先LogstoreまたはMetricstoreに保存できます。
ドメイン固有言語 (DSL) 構文を使用するデータ変換機能を使用して、データをプロジェクトおよびフィルタリングすることもできます。 DSL構文は、SQL構文よりも高い抽出、変換、および負荷 (ETL) 機能を提供します。 詳細については、「データ変換の基本」をご参照ください。
用語
ジョブ: スケジュールされたSQLジョブには、計算やスケジュール設定などの情報が含まれます。
インスタンス: スケジュールされたSQLジョブは、スケジュール設定に基づいてインスタンスを生成します。 各インスタンスは生データに対してSQL計算を実行し、計算結果を宛先のLogstoreまたはMetricstoreに書き込みます。
インスタンスID: インスタンスの一意の識別子。
作成時刻: インスタンスが作成された時刻。 ほとんどの場合、インスタンスは設定したスケジューリングルールに基づいて作成されます。 履歴データを処理する必要がある場合、またはレイテンシが存在し、オフセットする必要がある場合、インスタンスはすぐに作成されます。
開始時間: インスタンスの実行を開始する時間。 ジョブが再試行された場合、開始時刻はジョブの最後のインスタンスが実行を開始する時刻です。
End time: インスタンスの実行が停止した時刻。 ジョブが再試行された場合、終了時刻はジョブの最後のインスタンスが実行を停止した時刻です。
スケジュール時間: ジョブがスケジュールされる時間。 インスタンスのスケジュール時間は、以前のインスタンスがタイムアウトするか、遅延するか、履歴データを処理するために実行するかに関係なく、ジョブのスケジューリングルールに基づいて生成されます。
ほとんどの場合、連続して生成されるインスタンスのスケジュール時間は連続しており、連続するインスタンスは完全なデータセットを処理することができます。
SQLタイムウィンドウ: スケジュールされたSQLジョブの実行時に分析されるデータの時間範囲。 Simple Log Serviceは、ジョブの実行時に時間範囲を超えたデータを分析しません。 SQLタイムウィンドウは、インスタンスのスケジュールされた時間に基づいて計算される左クローズおよび右オープンの間隔です。 SQL時間ウィンドウは、インスタンスの作成時間と開始時間に依存しません。 たとえば、インスタンスのスケジュール時間が2021/01/01 10:00:00で、SQL時間ウィンドウの式が [@ m - 10m, @ m) の場合、インスタンスのSQL時間ウィンドウは [2021/01/01 09:50:00, 2021/01/01 10:00:00) になります。
ステータス: スケジュールされたSQLインスタンスのステータス。 インスタンスは、RUNNING、STARTING、SUCCEEDED、またはFAILED状態にすることができます。
Delayed running: スケジュールされたSQLジョブ用に設定できるパラメーター。 パラメーターをNに設定すると、インスタンスはスケジュールされた時刻からN秒後に実行を開始します。 これは、データレイテンシによって引き起こされる不正確な計算結果を防ぐのに役立ちます。 インスタンスの実行を遅延させる必要がない場合は、[遅延タスク] パラメーターを0秒に設定できます。
たとえば、[Scheduling Interval] パラメーターを [Hourly] に設定し、[Delay Task] パラメーターを30秒に設定した場合、1日あたり24個のインスタンスが生成されます。 インスタンスのスケジュール時間が2021/4/6 12:00:00の場合、インスタンスの開始時間は2021/4/6 12:00:30です。
スケジューリングと実行シナリオ
各ジョブは複数のインスタンスを生成できます。 ジョブが正常にスケジュールされているか、例外が原因でインスタンスが再試行されているかに関係なく、一度に実行状態にできるのはジョブのインスタンスが1つだけです。 複数のインスタンスを同時に実行することはできません。 次の例は、スケジューリングと実行の一般的なシナリオを示しています。
シナリオ1: インスタンスの実行を遅らせる
インスタンスのスケジュール時間は、インスタンスの実行が遅延しているかどうかに関係なく、ジョブのスケジューリングルールに基づいて事前に生成されます。 インスタンスが遅延した場合、後続のインスタンスも遅延する可能性があります。 ただし、インスタンスがスケジュールどおりに実行されるまで、後続のインスタンスを高速で実行することで、遅延を徐々に相殺できます。
シナリオ2: スケジュールされたSQLジョブを履歴時点からスケジュールする
スケジュールされたSQLジョブを作成するときに、ジョブが履歴データを処理できるようにスケジューリングルールを設定できます。 ジョブが開始履歴時点でスケジュールされると、履歴データを処理するインスタンスが生成されます。 その後、履歴データを処理するインスタンスがさらに生成されます。 インスタンスは、インスタンスがスケジュールどおりに実行されるまで、履歴データを処理するために順番に実行されます。
シナリオ3: 指定された期間内にスケジュールされたSQLジョブをスケジュールする
一定期間内にログを処理するようにジョブをスケジュールする場合は、スケジュールの期間を指定できます。 スケジューリングの終了時刻を指定した場合、ジョブは最後のインスタンスの実行後にインスタンスを生成しません。 最後のインスタンスのスケジュール時間は、スケジュールの終了時間と同じまたはそれ以降にすることはできません。
シナリオ4: スケジューリング設定の変更
ジョブのスケジューリング設定を変更すると、ジョブは新しい設定に基づいてインスタンスを生成します。 インスタンス間のSQLタイムウィンドウの連続性を確保する場合は、スケジューリング設定のSQLタイムウィンドウとスケジューリング頻度を変更できます。
シナリオ5: 失敗したインスタンスを再試行する
ほとんどの場合、スケジュールされたSQLジョブは、スケジュールされた時間に基づいて時系列でインスタンスを生成します。 権限不足、ソースLogstoreまたはMetricstoreが存在しない、宛先LogstoreまたはMetricstoreが存在しない、またはSQL構文が無効なためにインスタンスの実行に失敗した場合、システムはインスタンスが自動的に再試行できるようにします。 再試行の回数が指定した上限を超えた場合、または指定した最大時間を超えた期間にわたってインスタンスが再試行された場合、インスタンスは再試行を停止し、FAILED状態になります。 次のインスタンスの実行が開始されます。
失敗したインスタンスのアラートを設定し、インスタンスを手動で再試行できます。 過去7日以内に生成されたインスタンスを表示および再試行できます。 インスタンスの実行後、システムは再試行結果に基づいてインスタンスのステータスをSUCCEEDEDまたはFAILEDに変更します。 詳細については、「スケジュールされたSQLジョブのインスタンスの再試行」をご参照ください。
使用上の注意
スケジュールSQL機能を使用する場合は、ビジネス要件に基づいてデータの適時性と正確性のバランスを取ることをお勧めします。
データがSimple Log Serviceにアップロードされると、レイテンシが存在する可能性があります。 この場合、インスタンスの実行中にSQLタイムウィンドウのデータがSimple Log Serviceに完全にアップロードされない場合があります。 この問題を回避するには、データ収集の待ち時間とビジネスで許容される最大結果表示待ち時間に基づいて、[遅延タスク] および [SQL時間ウィンドウ] パラメーターを設定することを推奨します。 さらに、インスタンスを期待どおりに実行できるように、理論値より少し前の値を指定することを推奨します。
複数の順序付けられていないデータがアップロードされるシナリオでの処理結果の正確性を確保するために、ジョブの分レベルまたは時間レベルのSQLタイムウィンドウを指定することを推奨します。