一、使用場景
今天給大家介紹幾個好用的時序相似性分析函數,具體涉及到的函數包含:時序的聚類,相似性計算等。主要解決的場景如下:
- 當您有N台機器的監控名額資料時,想快速知道在某一段時間機器的CPU形态的大緻呈現哪些形态,便于使用者更好的了解目前系統的狀态;
- 當您指定某一台機器的某名額曲線時,您想知道哪些機器的相同名額與目前指定的曲線更加相似;
-
當您人工輸入一條時序曲線(網站整體的通路延遲曲線),您想知道是哪個服務的通路延時的變化規律同目前指定的曲線十分相似,便于縮小問題的排查;
上述場景問題均可以歸納成,時序聚類(按照形态、按照數值),時序相似性判别這兩個問題。
二、函數介紹
SLS平台提供了兩個函數供大家使用,具體的文檔位址可以參考下:
https://help.aliyun.com/document_detail/93235.htmlts_density_cluster
ts_hierarchical_cluster
其中第一個函數主要是針對曲線的形态進為标準進行聚類,其底層的核心聚類算法是DBSCAN密度聚類;第二個函數主要針對針對原始曲線的相似性進行聚類,更多的會考慮曲線之間的歐式距離等因素,其底層的核心聚類算法是層次聚類;具體的原理介紹可以參考之前的文章,大家也可以去網上查閱相關資料自行閱讀。接下來主要給大家介紹下在SLS中該怎麼使用這些函數。
三、案例實戰
3.1 資料探索
- query-01
* | select DISTINCT index_name, machine, region from log
- query-02
* | select count(1) as num from (select DISTINCT index_name, machine, region from log)
- query-03
* and index_name : load |
select
__time__,
value,
concat(
region, '#', machine, '#', index_name
) as ins
from log order by __time__
limit 10000
- query-04
*
and index_name : load |
select
date_trunc('minute', __time__) as time,
region,
avg(value) as value
from log group by time, region order by time limit 1000
通過query01我們可以得到對應的如下資訊,這裡表明我們我們目前的logstore中含有多少不同的曲線,每個曲線的辨別是什麼,為了更好的觀察這1300多條線,我們可以使用流圖來觀察,一次性在一個圖表中繪制出來對浏覽器資源消耗也比較大,及時能繪制出來,也很難從這裡得到有效的資訊。我們使用query04來看下在少數曲線的情況下的可視化情況。在來對比下query03可視化的效果。

3.2 聚類實戰
通過上述的觀察,我們能否将若幹條曲線進行聚類呢,将較為相似的曲線劃分到一類中,在進行可視化分析,進而打到降維分析的目的。使用如下SQL可以将N條線快速的聚類,在這裡我們選擇的名額是機器的負載(load)還是比較關注不同機器的水位的變化情況,是以我們可以選擇ts_hierarchical_cluster這個函數,我們得到一張分面圖,為了更加直覺的可視化這個圖表,您可以将其存儲在Dashboard中更加直覺。
*
and index_name : load |
select
ts_hierarchical_cluster(time, value, ins)
from
(
select
__time__ as time,
value,
concat(
region, '#', machine, '#', index_name
) as ins
from
log
)
3.2 相似性查找
通過如下SQL,我們可以獲得到跟 aysls-pub-cn-beijing-k8s#192.168.7.254:9100#load 這條名額曲線相似的機器的清單,并通過如下的流圖進行可視化,觀察我們的結果。在相似性函數中含有一些相似性判别的方法供大家選擇:shape、manhattan、euclidean
*
and index_name : load |
select
cast(
cast(ts_value as double) as bigint
) as ts_value,
cast(ds_value as double) as ds_value,
name
from
(
select
tt[1][1] as name,
tt[2] as ts,
tt[3] as ds
from
(
select
ts_similar_instance(
time, value, ins, 'aysls-pub-cn-beijing-k8s#192.168.7.254:9100#load',
10,
'euclidean'
) as res
from
(
select
__time__ as time,
value,
concat(
region, '#', machine, '#', index_name
) as ins
from
log
)
),
unnest(res) as t(tt)
),
unnest(ts) as t(ts_value),
unnest(ds) as t(ds_value)
order by
ts_value
limit
10000