完全正確モードでは、リソース制限に達した際にクエリを打ち切るのではなく、実行時間を延長して処理を継続できるため、正確で完全なクエリ結果を取得できます。
制限事項
完全正確モードは、次の機能ではサポートされていません:
仕組み
完全正確モードでは、I/O や CPU などのさまざまなリソース制約を、時間ベースの単一の制限に変換します。クエリがリソース制限に達した場合、システムはクエリを終了するのではなく、持続可能なレートにスロットリングして、完了するまで、またはタイムアウトに達するまで実行を継続します。このモードでは、分離されたリソースプールにおけるタスク割り当て、ユーザーベースのキュー優先順位付け、負荷分散を使用して、リソースを効率的にスケジューリングします。
標準クエリは標準のコンピューティングプールで実行され、リソース制限に達すると直ちに打ち切られるため、不正確な結果につながる可能性があります。完全正確モードを有効にすると、クエリは専用のコンピューティングプールで実行され、すべてのデータが読み込まれて計算が完了するまで、システムが持続可能なレートでタスクの実行を継続します。
前提条件
標準のLogstoreが作成されます。 詳細については、基本的な Logstore の作成をご参照ください。
-
ログが収集されていること。詳細については、「データ収集」をご参照ください。
-
インデックスが設定されていること。詳細については、「インデックスの設定」をご参照ください。
操作手順
特定の Logstore 内の個々のクエリおよび分析操作に対して、完全正確モードを有効にできます。
完全正確モードの最大タイムアウトは、コンソール、API、または SDK を使用して設定できます。分析文の最大タイムアウトは 55 秒です。
コンソール
Log Serviceコンソールにログインします。
[プロジェクト] セクションで、管理するプロジェクトをクリックします。
タブで、管理するログストアをクリックします。
-
をクリックします。
重要query_max_run_timeパラメータを設定して、タイムアウトを調整できます。たとえば、分析文が
* | select count(*) as pvの場合は、文にset session query_max_run_time=10s;を追加できます。分析文全体は* | set session query_max_run_time=10s; select count(*) as pvになります。
API
-
GetLogs (圧縮されていない結果を返す) - Logstore 内のログデータをクエリする
-
パラメータ:
queryたとえば、分析文は
* | select count(*) as pvです。-
完全正確モードを有効にする:分析文に
set session allow_incomplete=false;を追加します。たとえば、* | select count(*) as pvは* | set session allow_incomplete=false; select count(*) as pvになります。 -
クエリ分析のタイムアウトを設定する:分析文に
set session query_max_run_time=10s;を追加します。これにより、最大実行時間が10sに設定されます。分析文は* | set session query_max_run_time=10s; select count(*) as pvです。 -
完全正確モードを有効にし、タイムアウトも設定する:セッションコマンドを分析文に追加します。例:
* | set session allow_incomplete=false; set session query_max_run_time=10s; select count(*) as pv。
-
-
-
GetLogsV2 (圧縮された結果を返す) - Logstore 内のログデータをクエリする
-
パラメータ:
queryたとえば、分析文は
* | select count(*) as pvです。-
完全正確モードを有効にする:分析文に
set session allow_incomplete=false;を追加します。たとえば、* | select count(*) as pvは* | set session allow_incomplete=false; select count(*) as pvになります。 -
クエリ分析のタイムアウトを設定する:分析文に
set session query_max_run_time=10s;を追加します。これにより、最大実行時間が10sに設定されます。分析文は* | set session query_max_run_time=10s; select count(*) as pvです。 -
完全正確モードを有効にし、タイムアウトも設定する:セッションコマンドを分析文に追加します。例:
* | set session allow_incomplete=false; set session query_max_run_time=10s; select count(*) as pv。
-
-
SDK
このセクションでは、例として Simple Log Service SDK for Java を使用します。
前提条件
Simple Log Service SDK for Java をインストール済みであること。詳細については、「Install the Simple Log Service SDK for Java」をご参照ください。
-
GetLogs() メソッド
-
パラメータ:
queryたとえば、分析文は
* | select count(*) as pvです。-
完全正確モードを有効にする:分析文に
set session allow_incomplete=false;を追加します。たとえば、* | select count(*) as pvは* | set session allow_incomplete=false; select count(*) as pvになります。 -
クエリ分析のタイムアウトを設定する:分析文に
set session query_max_run_time=10s;を追加します。これにより、最大実行時間が10sに設定されます。分析文は* | set session query_max_run_time=10s; select count(*) as pvです。 -
完全正確モードを有効にし、タイムアウトも設定する:セッションコマンドを分析文に追加します。例:
* | set session allow_incomplete=false; set session query_max_run_time=10s; select count(*) as pv。
-
-
パラメータ:
session-
完全正確モードを有効にする:
request.SetSession("allow_incomplete=false");。 -
クエリのタイムアウトを設定する:
request.SetSession("query_max_run_time=10s");。 -
完全正確モードを有効にし、タイムアウトも設定する:
request.SetSession("allow_incomplete=false; query_max_run_time=10s")。
-
import com.aliyun.openservices.log.Client; import com.aliyun.openservices.log.exception.LogException; import com.aliyun.openservices.log.request.GetLogsRequest; import com.aliyun.openservices.log.response.GetLogsResponse; public class CreateLogStore { public static void main(String[] args) throws LogException { // この例では、環境変数から AccessKey ID と AccessKey Secret を取得します。 String accessId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"); String accessKey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"); // Simple Log Service のエンドポイントを設定します。この例では、中国 (北京) リージョンのエンドポイントを使用します。実際のエンドポイントに置き換えてください。 String host = "https://cn-beijing.log.aliyuncs.com"; // Simple Log Service クライアントを作成します。 Client client = new Client(host, accessId, accessKey); // Project 名を指定します。 String projectName = "aliyun-test-project"; // Logstore 名を指定します。 String logstore = "request_log"; String query = "* | SELECT count(0)"; int from = (int)(System.currentTimeMillis()/1000) - 60; int to = (int)(System.currentTimeMillis()/1000); GetLogsRequest request = new GetLogsRequest(projectName, logstore, from, to, "", query); request.SetSession("allow_incomplete=false;query_max_run_time=10s"); GetLogsResponse response = client.GetLogs(request); System.out.println(response.getCpuSec()); } } -
よくある質問
-
CPU 時間を確認する方法は?
クエリを実行した後、分析結果 にマウスポインターを合わせると、CPU 時間を表示できます。 右上の統計パネルにある [消費 CPU 時間] フィールドに、消費された CPU 時間が秒単位で表示されます。
-
専用 SQL クエリのコスト
コストはデータ量とクエリの複雑さによって異なります。次の表に例を示します。
クエリステートメント
データ量 (行)
1 回の実行あたりのコスト (USD)
* | select avg(double_0) from stress_s1_mil140 億
0.004435
* | select avg(double_0), sum(double_0), max(double_0), min(double_0), count(double_0) from stress_s1_mil140 億
0.006504
* | select avg(double_0), sum(double_1), max(double_2), min(double_3), count(double_4) from stress_s1_mil140 億
0.013600
* | select key_0 , avg(double_0) as pv from stress_s1_mil1 group by key_0 order by pv desc limit 100040 億
0.011826
* | select long_0, avg(double_0) as pv from stress_s1_mil1 group by long_0 order by pv desc limit 100040 億
0.011087
* | select long_0, long_1, avg(double_0) as pv from stress_s1_mil1 group by long_0,long_1 order by pv desc limit 10003 億
0.010791
* | select avg(double_0) from stress_s1_mil1 where key_0='key_987'40 億
0.00007
> [完全正確]