定時SQL
日志服務提供定時SQL功能,用于定時分析數據、存儲聚合數據、投影與過濾數據。本文介紹定時SQL功能的背景信息、功能簡介、基本概念、調度與執行場景、使用建議等信息。
背景信息
基于時間的數據(日志、指標)在日積月累后的數量是驚人的。例如每天產生1000萬條數據,則一年為36億條數據。一方面,長時間的數據存儲需要巨大的存儲空間,而通過減少存儲周期的方式減少存儲空間,雖然降低了存儲成本,但也丟失了有價值的數據。另一方面,大量的數據將造成分析上的性能壓力。
數據的存儲和分析具備以下特征:
大部分時序數據具有時效性特征。歷史數據可以為分鐘或小時級別的精度,而新產生的數據需要更高的精度。
數據使用者(例如數據運營人員、數據科學家)需要存儲全量的數據以備分析。
在數據分析階段,需同時兼顧全量數據和快速查詢響應。
針對上述特征,日志服務推出定時SQL功能,用于將高精度的歷史數據壓縮為低精度數據后,長期存儲。使用定時SQL功能后,您可以根據業務需求為源庫設置較低的存儲周期(例如15天),將目標庫的存儲周期設置為永久保存。實現長時間范圍數據的低延遲分析、低成本存儲。
功能簡介
定時SQL支持標準SQL92語法、日志服務查詢和分析語法,按照調度規則周期性執行,并將運行結果寫入到目標庫(Logstore或Metricstore)中。
定時分析數據:根據業務需求設置SQL語句或查詢分析語句,定時執行數據分析,并將分析結果存儲到目標庫中。
全局聚合:對全量、細粒度的數據進行聚合存儲,匯總為存儲大小、精度適合的數據,相當于一定程度的有損壓縮數據。例如:
按照秒級別對36億條數據進行聚合存儲,存儲結果為3150萬條數據,存儲大小為全量數據的0.875%。
按照分鐘級別對36億條數據進行聚合存儲,存儲結果為52.5萬條數據,存儲大小為全量數據的0.015%。
投影與過濾:對原始數據的字段進行篩選,按照一定條件過濾數據并存儲到目標Logstore中。
該功能還可以通過數據加工實現,數據加工的DSL語法比SQL語法具備更強的ETL表達能力。更多信息,請參見加工原理。
基本概念
任務:一個定時SQL任務配置包括計算配置、調度配置等信息。
實例:一個定時SQL任務按照調度配置按時生成實例。每一個實例對原始數據進行SQL計算并將計算結果寫入目標庫。
實例ID:實例的唯一標識。
創建時間:實例的創建時間。一般是按照您配置的調度規則生成,在補運行或追趕延遲時會立即生成實例。
執行時間:實例開始執行的時間。如果重試任務,則表示最后一次開始執行的時間。
結束時間:實例執行結束的時間。如果重試任務,則表示最后一次執行結束的時間。
調度時間:由調度規則決定,不會受到上一個實例執行超時、延遲、補運行等情況的影響。
大部分場景下,連續生成的實例的調度時間是連續的,可處理完整的數據集。
SQL時間窗口:定時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)。
延遲執行:定時SQL任務中的配置參數,表示在實例的調度時間點上,往后延遲N秒才真正開始執行實例。主要用于避免數據延遲等情況導致計算結果不精確問題。如果不需要使用延遲時間來保證結果正確性,您可以將延遲執行設置為0秒。
例如,您設置調度間隔為每小時、延遲執行為30秒,那么一天生成24個實例,其中某實例的調度時間為2021/4/6 12:00:00,執行時間為2021/4/6 12:00:30。
調度與執行場景
一個任務可生成多個實例,無論是正常被調度還是您觸發異常實例重試的情況,同時只有一個實例處于運行中,不存在多個實例并發執行的情況。主要的調度與執行場景如下:
場景一:實例延遲執行
無論實例是否延遲執行,實例的調度時間都是根據調度規則預先生成的。雖然前面的實例發生延遲時,可能導致后面的實例也延遲執行,但通過追趕執行進度,可逐漸減少延遲,直到恢復準時運行。
場景二:從某個歷史時間點開始執行定時SQL任務
在當前時間點創建定時SQL任務后,按照調度規則對歷史數據進行處理,從調度的開始時間創建補運行的實例,補運行的實例依次執行直到追上數據處理進度后,再按照預定計劃執行新實例。
場景三:固定時間內執行定時SQL任務
如果需要對指定時間段的日志做調度,則可設置調度的時間范圍。如果設置了調度的結束時間,則最后一個實例(調度時間小于調度結束時間)執行完成后,不再產生新的實例。
場景四:修改調度配置對生成實例的影響
修改調度配置后,下一個實例按照新配置生成。一般建議同步修改SQL時間窗口、調度頻率等配置,使得實例之間的SQL時間范圍可以連續。
場景五:重試失敗的實例
正常情況下,一個定時SQL任務按照調度時間的遞增順序生成執行實例。如果實例執行失敗(例如權限不足、源庫不存在、目標庫不存在、SQL語法不合法),系統支持自動重試,當重試次數超過您配置的最大重試次數或重試時間超過您配置的最大運行時間時,重試結束,該實例狀態被置為失敗,然后系統繼續執行下一個實例。
您可以對失敗的實例設置告警通知并進行手動重試。您可以對最近7天內創建的實例進行查看、重試操作。調度執行完成后,系統會根據實際執行情況變更實例狀態為成功或失敗。如何重試,請參見重試定時SQL任務實例。
使用建議
使用定時SQL時,建議根據業務情況,同時兼顧數據實時性和準確性。
考慮數據上傳日志服務存在延遲情況,您可以結合數據采集延遲以及業務能夠容忍的最大結果可見延遲,設置執行延遲和SQL時間窗口(結束時間往前一點),避免實例執行時SQL時間窗口內的數據未全部到達。
建議SQL時間窗口按分鐘對齊(例如整分鐘、整小時),以保證上傳局部亂序數據時的數據準確度。