調用CreateScheduledSQL介面建立定時SQL任務。
前提條件
您已完成以下操作:
背景資訊
Log Service提供定時SQL功能,用於定時分析資料、儲存彙總資料、投影與過濾資料。定時SQL支援標準SQL92文法、Log Service查詢和分析文法,按照調度規則周期性執行,並將運行結果寫入到目標庫(Logstore或Metricstore)中。
Log Service控制台提供可視化的建立定時SQL任務。具體操作,請參見建立定時SQL任務。
除此之外,Log Service提供ScheduledSQL、JobSchedule和ScheduledSQLConfiguration類,協助您更簡單的通過Java SDK建立定時SQL任務。
ScheduledSQL:建立一個定時SQL任務。
JobSchedule:建立定時SQL的調度任務。
ScheduledSQLConfiguration:建立定時SQL任務的基本配置。
參數說明
請求參數
名稱 | 類型 | 是否必填 | 描述 | 樣本值 |
project | String | 是 | Project名稱。 | ali-test-project |
scheduledSql | Object | 是 | 定時 SQL 任務配置 | - |
ScheduledSQL
參數說明如下表所示。
參數名稱 | 類型 | 是否必填 | 說明 | 樣本 |
name | String | 是 | 定時SQL任務名稱。其命名規則如下:
| export-123-456 |
displayName | String | 是 | 定時SQL任務的顯示名稱。在Log Service控制台,選擇,可以查看定時SQL顯示名稱列表。 | my-scheduled-sql-job |
description | String | 否 | 定時SQL任務描述。 | this is a scheduled sql job. |
configuration | Object | 是 | 定時SQL配置資訊。 | - |
schedule | Object | 是 | 任務調度配置。 | - |
JobSchedule
調用JobSchedule jobSchedule = new JobSchedule();建立定時SQL任務的調度任務。各個參數說明如下表所示。
參數名稱 | 類型 | 是否必填 | 說明 | 樣本 |
type | String | 是 | 調度定時SQL任務的頻率,每調度一次定時SQL任務產生一個執行執行個體。調度間隔決定每個執行執行個體的調度時間。
| FixedRate |
interval | String | 否 | 當type取值為FixedRate時,配置固定間隔。
| 50m |
cronExpression | String | 否 | 當type取值為Cron時,配置Cron運算式。 Cron運算式的最小精度為分鐘,24小時制,例如 當您需要配置時區時,需選擇Cron模式。常見的時區列表請參見時區列表。 | 無 |
runImmediately | boolean | 否 | 定時任務是否立即執行。 | False |
timeZone | String | 否 | Cron 運算式所在時區,預設為空白,表示東八區。 | +0800 |
delay | int | 否 | 調度時間點往後順延強制的時間。取整範圍:0~120,單位:秒。 當資料寫入Logstore存在延遲等情況時,可通過順延強制來保證資料的完整性。 | 10 |
ScheduledSQLConfiguration
調用ScheduledSQLConfiguration scheduledSQLConfiguration = generateConfig();建立定時SQL任務的配置資訊任務。各個參數說明如下表所示。
參數名稱 | 類型 | 是否必填 | 描述 | 樣本 |
script | String | 是 | 輸入的查詢和分析語句。 | *|select count(1) |
sqlType | String | 是 | SQL類型,固定取值為searchQuery。 | searchQuery |
resourcePool | String | 是 | 資源集區類型,固定取值為enhanced。Log Service提供增強型資源集區用於資料分析。 | enhanced |
roleArn | String | 是 | 讀取源Logstore資料的RAM角色標識。如何擷取ARN,請參見授予自訂RAM角色分析源Logstore的許可權。 |
|
destRoleArn | String | 是 | 寫入目標Logstore資料的RAM角色標識。如何擷取ARN,請參見如下說明:
|
|
sourceLogstore | String | 是 | 源Logstore名稱。 | source-logstore |
destEndpoint | String | 是 | 待寫入Logstore對應的服務入口。 說明
更多資訊,請參見服務入口。 |
|
destProject | String | 是 | 待寫入資料的目標Project名稱。 | my-project |
destLogstore | String | 是 | 待寫入資料的目標Logstore名稱。 | my-logstore |
dataFormat | String | 是 | 寫入模式。
| log2log |
fromTimeExpr | String | 是 | SQL時間視窗開始運算式。更多資訊,請參見時間運算式文法。 | @m - 12s |
toTimeExpr | String | 是 | SQL時間視窗結束運算式。更多資訊,請參見時間運算式文法。 | @m |
maxRetries | Long | 是 | 執行SQL分析操作失敗時自動重試的閾值。當重試次數超過最大次數時,該執行執行個體結束,狀態為失敗。 | 10 |
maxRunTimeInSeconds | Long | 是 | 執行SQL分析操作失敗時自動重試的閾值。當重試時間超過指定的最大時間時,該執行執行個體結束,狀態為失敗。 | 60 |
fromTime | Long | 是 | 調度開始時間。 重要 執行個體的調度時間必須在該範圍內,超出該範圍時,定時SQL任務不再產生新執行個體。 | 1653965045 |
toTime | Long | 是 | 調度結束時間,0表示不結束。 | 1653968045 |
parameters | Object | 是 | 當dataFormat取值為log2metric或metric2metric時,配置SQL配置參數。具體配置項請參見 | |
parameters
配置從Logstore到MetricStore的定時SQL任務時,還需要配置以下額外的參數:
表 1. Log2MetricParameters
參數名稱
樣本
說明
metricKeys
"[\"a\", \"b\", \"c\"]"指標列,對應控制台介面SQL配置的指標列。
Log Service會根據您輸入的查詢和分析語句彙總資料,您可以選取查詢和分析結果中列值為數實值型別的一列或多列作為指標列。更多資訊,請參見時序資料(Metric)。
labelKeys
"[\"d\", \"e\", \"f\"]"標籤列,對應控制台介面SQL配置的Labels。
Log Service會根據您輸入的查詢和分析語句彙總資料,您可以選取查詢和分析結果中的一列或多列作為Label資料。更多資訊,請參見時序資料(Metric)。
hashLabels
"[\"d\", \"f\"]"對應控制台介面SQL配置的Rehash。
開啟Rehash開關後,您可以配置雜湊列,用於將同一列值的資料寫入到一個Shard中,增強資料局部性,提升查詢效率。
雜湊列的取值取決於查詢和分析結果。您可以選取查詢和分析結果中的一列或多列作為雜湊列。例如您配置雜湊列為status,則status欄位值相同的資料將被寫入到同一個Shard中。
addLabels
"[\"m\":\"h\", \"n\":\"i\"]"對應控制台介面SQL配置的附加Labels。
添加靜態標籤,索引值對形式,可用於標識指標的相關屬性。
例如配置label_key為app,配置label_value為ingress-nginx。
timeKey
time
對應控制台介面SQL配置的時間列。
如果您選取查詢和分析結果中的時間列(列值為Unixtime時間戳記,例如
atime:1627025331),則系統將以該時間列作為時序資料的時間。如果您選擇空,則系統將以查詢和分析時間範圍中的開始時間作為時序資料的時間。

配置從MetricStore到MetricStore的定時SQL任務時,還需要配置以下額外的參數:
表 2. Metric2MetricParameters
參數名稱
樣本
說明
metricName
my-metric
如果您要修改您所分析的指標名,您可以輸入修改後的指標名。更多資訊,請參見時序資料(Metric)。
重要建議分析的對象為單個指標時,修改指標名,實現重新命名。
如果分析對象為多個指標,則修改指標名後,會將所有的指標名修改為同一個相同的指標名。
hashLabels
"{\"m\":\"h\", \"n\":\"i\"}"對應控制台介面SQL配置的Rehash。
開啟Rehash開關後,您可以配置雜湊列,用於將同一Label值的資料寫入到一個Shard中,增強資料局部性,提升查詢效率。
雜湊列的取值取決於時序資料已有的Label資訊。例如時序資料已有的Label資訊為
{"alert_id":"alert-1608815762-545495","alert_name":"警示恢複關閉","status":"inactive"},則雜湊列的可選值為alert_id、alert_name、status。如果您配置雜湊列為status,則status欄位值相同的資料將被寫入到同一個Shard中。addLabels
"{\"m\":\"h\", \"n\":\"i\"}"對應控制台介面SQL配置的附加Labels。
添加靜態標籤,索引值對形式,可用於標識指標的相關屬性。
例如配置label_key為app,配置label_value為ingress-nginx。

返回參數
返回參數說明,請參見CreateScheduledSQL - 建立定時SQL任務。
範例程式碼
本樣本中,建立一個App.java檔案,將源Logstore的定時分析結果儲存到目標Logstore。樣本如下:
import com.aliyun.openservices.log.Client;
import com.aliyun.openservices.log.common.*;
import com.aliyun.openservices.log.exception.LogException;
import com.aliyun.openservices.log.request.CreateScheduledSQLRequest;
public class App {
// 本樣本從環境變數中擷取AccessKey ID和AccessKey Secret。
static String accessId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
static String accessKey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
// 設定Project名稱和Logstore名稱。
static String sourceProject="aliyun-test-sourceProject";
static String destProject="aliyun-test-destProject";
static String sourceLogstore = "logstore-name";
static String destLogstore = "project-name";
static String roleArn = "acs:ram::11111111:role/aliyunlogetlrole";
// 設定Log Service的服務存取點。此處以杭州為例,其它地區請根據實際情況填寫。
static String endpoint = "http://cn-hangzhou.log.aliyuncs.com";
static String destEndpoint = "http://cn-hangzhou-intranet.log.aliyuncs.com";
static long fromTime = 1648105200; //2022-03-23 15:00:00
private static String script = "* | select a,b,c from log";
private static ScheduledSQLBaseParameters generateParams(String dataFormat) {
if (dataFormat.equalsIgnoreCase("log2log")) {
return null;
} else if (dataFormat.equalsIgnoreCase("log2metric")) {
Log2MetricParameters params = new Log2MetricParameters();
params.setMetricKeys("[\"a\", \"b\", \"c\"]");
params.setLabelKeys("[\"d\", \"e\", \"f\"]");
params.setHashLabels("[\"d\", \"f\"]");
params.setAddLabels("{\"m\":\"h\", \"n\":\"i\"}");
params.setTimeKey("time");
return params;
} else if (dataFormat.equalsIgnoreCase("metric2metric")) {
Metric2MetricParameters params = new Metric2MetricParameters();
params.setMetricName("name");
params.setHashLabels("[\"d\", \"f\"]");
params.setAddLabels("{\"m\":\"h\", \"n\":\"i\"}");
return params;
}
return null;
}
private static ScheduledSQLConfiguration generateConfig() {
ScheduledSQLConfiguration scheduledSQLConfiguration = new ScheduledSQLConfiguration();
scheduledSQLConfiguration.setScript(script);
scheduledSQLConfiguration.setSqlType("searchQuery");
scheduledSQLConfiguration.setResourcePool("enhanced");
scheduledSQLConfiguration.setRoleArn(roleArn);
scheduledSQLConfiguration.setDestRoleArn(roleArn);
scheduledSQLConfiguration.setSourceLogstore(sourceLogstore);
scheduledSQLConfiguration.setDestEndpoint(destEndpoint);
scheduledSQLConfiguration.setDestProject(destProject);
scheduledSQLConfiguration.setDestLogstore(destLogstore);
scheduledSQLConfiguration.setDataFormat("log2log");
scheduledSQLConfiguration.setFromTimeExpr("@m-1m");
scheduledSQLConfiguration.setToTimeExpr("@m");
scheduledSQLConfiguration.setMaxRetries(20);
scheduledSQLConfiguration.setMaxRunTimeInSeconds(600);
scheduledSQLConfiguration.setFromTime(fromTime);
scheduledSQLConfiguration.setToTime(0L);
ScheduledSQLBaseParameters params = generateParams(scheduledSQLConfiguration.getDataFormat());
scheduledSQLConfiguration.setParameters(params);
return scheduledSQLConfiguration;
}
private static ScheduledSQL generateScheduledSQL() {
ScheduledSQL scheduledSQLStructure = new ScheduledSQL();
scheduledSQLStructure.setName("job-name");
scheduledSQLStructure.setDisplayName("display-name");
scheduledSQLStructure.setDescription("desc-name");
ScheduledSQLConfiguration scheduledSQLConfiguration = generateConfig();
scheduledSQLStructure.setConfiguration(scheduledSQLConfiguration);
JobSchedule jobSchedule = new JobSchedule();
jobSchedule.setType(JobScheduleType.FIXED_RATE);
jobSchedule.setInterval("1m");
jobSchedule.setDelay(10);
jobSchedule.setRunImmediately(false);
scheduledSQLStructure.setSchedule(jobSchedule);
return scheduledSQLStructure;
}
public static void main(String[] args) {
Client client = new Client(endpoint, accessId, accessKey);
ScheduledSQL scheduledSQL = generateScheduledSQL();
CreateScheduledSQLRequest request = new CreateScheduledSQLRequest(sourceProject, scheduledSQL);
try {
client.createScheduledSQL(request);
} catch (LogException e) {
e.printStackTrace();
}
}
} 