您好,登錄后才能下訂單哦!
??降采樣(或在信號處理中,抽取)是降低數(shù)據(jù)采樣率或分辨率的處理過程。例如,假設(shè)溫度傳感器每秒鐘都向OpenTSDB系統(tǒng)發(fā)送數(shù)據(jù)。如果用戶在一小時(shí)內(nèi)查詢數(shù)據(jù),他們將獲得3,600個(gè)數(shù)據(jù)點(diǎn),這些數(shù)據(jù)點(diǎn)可以相當(dāng)容易地繪制出來。但是現(xiàn)在,如果用戶要求整整一周的數(shù)據(jù),他們將獲得604,800個(gè)數(shù)據(jù)點(diǎn),并且突然間圖形可能變得非常混亂。使用降采樣器,單個(gè)時(shí)間序列在一個(gè)時(shí)間范圍內(nèi)的多個(gè)數(shù)據(jù)點(diǎn)在一個(gè)對齊的時(shí)間戳中與數(shù)學(xué)函數(shù)一起聚合成單個(gè)值。這樣我們可以將數(shù)量從604,800減少到168。
??降采樣器至少需要兩個(gè)組件:
??舉例說明:如下時(shí)間序列A和B。數(shù)據(jù)點(diǎn)覆蓋70秒的時(shí)間范圍,每10秒一個(gè)值。假設(shè)我們希望縮減到30秒,因?yàn)橛脩粽诓榭锤鼘挄r(shí)間跨度范圍的圖。此外,我們使用sum聚合器將這兩個(gè)序列分組為一個(gè)。我們可以指定一個(gè)降采樣器30s-sum,它將創(chuàng)建30秒的桶并累計(jì)每個(gè)桶中的所有數(shù)據(jù)點(diǎn)。這將為我們提供每個(gè)序列的三個(gè)數(shù)據(jù)點(diǎn):
時(shí)間序列 | T0 | T0+10s | T0+20s | T0+30s | T0+40s | T0+50s | T0+60s |
---|---|---|---|---|---|---|---|
A | 5 | 5 | 10 | 15 | 20 | 5 | 1 |
A sum降采樣 | 5+5+10=20 | ? | ? | 15+20+5=40 | ? | ? | 1 |
B | 10 | 5 | 20 | 15 | 10 | 0 | 5 |
B sum降采樣 | 10+5+20=35 | ? | ? | 15+10+0=25 | ? | ? | 5 |
sum聚合結(jié)果 | 55 | ? | ? | 65 | ? | ? | 6 |
??正如你所看到的,對于每一個(gè)時(shí)間序列,我們會生成標(biāo)準(zhǔn)化的間隔邊界(每30秒),這樣我們就必須在時(shí)間戳t0,t0+30s和t0+60s合并序列的值。每個(gè)間隔或存儲桶將包含包含存儲桶時(shí)間戳(start)的數(shù)據(jù)點(diǎn),并且不包括以下存儲桶的時(shí)間戳(end),即[start, end)半開半閉區(qū)間。在這種情況下,第一個(gè)桶將從 t0延伸到t0+29.9999s,使用提供的聚合器,將所有值合并為一個(gè)新值。例如,對于序列A,我們對t0,t0+10s并t0+20s的值求和得到新的值20在t0。最后,查詢使用sum進(jìn)行分組,以便我們累加兩個(gè)合成的時(shí)間序列。此時(shí),OpenTSDB總是在降采樣執(zhí)行后再執(zhí)行分組聚合。
注意:
??對于早期版本的OpenTSDB,新數(shù)據(jù)點(diǎn)的實(shí)際時(shí)間戳將是時(shí)間間隔范圍中每個(gè)數(shù)據(jù)點(diǎn)的時(shí)間戳的平均值。從2.1和更高版本開始,每個(gè)點(diǎn)的時(shí)間戳與基于當(dāng)前時(shí)間的模和降采樣間隔的時(shí)間桶的開始對齊。
??降采樣時(shí)間戳基于原始數(shù)據(jù)點(diǎn)時(shí)間戳的剩余部分(差值)除以下采樣間隔(以毫秒為單位,即模數(shù))進(jìn)行歸一化。在Java中代碼是:timestamp - (timestamp % interval_ms)。例如,給定時(shí)間戳1388550980000或1/1/2014 04:36:20 UTC,1小時(shí)間隔(相當(dāng)于3600000毫秒),結(jié)果時(shí)間戳將舍入為1388548800000。在4至5 UTC之間的所有數(shù)據(jù)點(diǎn)將在4 AM桶中收尾。如果以1小時(shí)的間隔查詢一天的數(shù)據(jù)降采樣,則將會收到24個(gè)數(shù)據(jù)點(diǎn)(假設(shè)所有24小時(shí)都有數(shù)據(jù))。
??使用“0all-”間隔時(shí),查詢的開始時(shí)間將成為結(jié)果的時(shí)間戳。
??歸一化(標(biāo)準(zhǔn)化)對于常見查詢非常有效,例如將一天的數(shù)據(jù)降采樣到1分鐘或1小時(shí)。但是,如果嘗試以奇數(shù)間隔(如36分鐘)降采樣,則由于模數(shù)計(jì)算的性質(zhì),時(shí)間戳可能看起來有點(diǎn)奇怪。給定36分鐘的時(shí)間間隔以及我們上面的示例,時(shí)間間隔為2160000毫秒,結(jié)果為時(shí)間戳1388549520或04:12:00 UTC。所有在04:12與04:48之間的數(shù)據(jù)點(diǎn)將收尾在一個(gè)桶中。
??從OpenTSDB 2.3開始,用戶可以指定基于日歷的降采樣而不是快速取模的方法。這對于報(bào)告目的更為有用,例如查看與人類可讀時(shí)間相關(guān)的值,例如數(shù)月,數(shù)周或數(shù)天。此外,降采樣可以考慮時(shí)區(qū),并納入夏時(shí)制時(shí)間偏移和時(shí)區(qū)偏移。
??要使用日歷邊界,請查看正在查詢的接口文檔。例如,V2版本的 URI接口具有指定要使用的特定時(shí)區(qū)的參數(shù),例如&timezone=Asia/Kabul,基于日歷的降采樣可通過將附加c到間隔時(shí)間單位中來啟用如&m=sum:1dc-sum:my.metric。對于JSON查詢,在頂層使用單獨(dú)的字段timezone以及useCalendar布爾標(biāo)識。如果未提供時(shí)區(qū),則日歷將使用UTC時(shí)間。
??通過日歷降采樣,第一個(gè)時(shí)間間隔在指定時(shí)區(qū)的查詢年份捕捉到1月1日的00:00:00。從那里開始計(jì)算間隔桶直到查詢的結(jié)束時(shí)間。每個(gè)存儲桶都標(biāo)有存儲桶開始的時(shí)間戳(包含,閉區(qū)間),并包括所有的值,直到下一個(gè)存儲桶開始為止。
??降采樣通常用于對齊(調(diào)整)時(shí)間戳,以避免在執(zhí)行分組時(shí)進(jìn)行插值。由于OpenTSDB不會對時(shí)間對齊或值存在時(shí)施加約束,因此必須在查詢時(shí)指定這些約束。使用降采樣執(zhí)行分組聚合時(shí),如果所有序列都缺少預(yù)期間隔的值,則不會發(fā)出任何數(shù)據(jù)。例如,如果一個(gè)序列的以間隔每分鐘從t0到t0+6m寫入數(shù)據(jù),但由于某種原因源在t0+3m未能寫入數(shù)據(jù),只有5個(gè)值將被序列化時(shí),用戶可能希望有6個(gè)值。在2.2及更高版本的填充策略中,您現(xiàn)在可以選擇任意值在t0+3m發(fā)出,用戶(或應(yīng)用程序)將看到的值特定時(shí)間戳缺少的值,而不必找出缺少哪個(gè)時(shí)間戳。只要降采樣桶為空,填充策略就會簡單地發(fā)出預(yù)定義的值。
??可用的策略包括:
時(shí)間序列 | T0 | T0+10s | T0+20s | T0+30s | T0+40s | T0+50s | T0+60s |
---|---|---|---|---|---|---|---|
A | 15 | 5 | ? | ||||
B | 10 | 20 | 15 | 20 | |||
A sum 降采樣 | NaN | NaN | NaN | 15 | NaN | 5 | NaN |
B sum 降采樣 | 10 | NaN | 20 | 15 | NaN | NaN | 20 |
sum 聚合結(jié)果 | 10 | NaN? | ?20 | 15 | NaN | ?5 | 20 |
??如果我們在沒有填充策略的情況下要求輸出,則在t0+20s或t0+40s將會沒有值或時(shí)間戳被發(fā)出。另外,B序列中在t0+30s和t0+50s的值將被線性插值,以填充要與序列A相加的值。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。