1. 程式人生 > >【翻譯】OpenTSDB 2.3 文件--聚合

【翻譯】OpenTSDB 2.3 文件--聚合

聚合

OpenTSDB旨在通過查詢有效地組合多個不同的時間序列。這樣做的原因是,當用戶檢視他們的資料時,他們通常會從較高的級別開始詢問諸如“資料中心的總吞吐量是多少?”之類的問題。或“按地區劃分的當前用電量是多少?”。在檢視這些高級別值之後,可能會出現一個或多個值,因此使用者可以深入研究更詳細的資料集,例如“我的LAX資料中心主機的吞吐量是多少?”。我們希望能夠輕鬆回答這些高階問題,但仍然可以深入瞭解更多細節。

但是,如何將多個單獨的時間序列合併為一個系列的資料呢?聚合函式提供了以數學方式將不同時間序列合併為一個的方法。過濾器用於按標籤對結果進行分組,然後將聚合應用於每個組(先進行分組,再進行聚合)

。聚合類似於SQL的GROUP BY子句,使用者選擇預定義的聚合函式以將多個記錄合併為單個結果。但是在TSD中,通過時間戳和組將聚合出一組記錄。

每個聚合器都有兩個元件:

  • Function - 應用的數學計算,例如對所有值求和,計算平均值或選擇最高值。
  • Interpolation - 一種處理缺失值的方法,例如當時間序列A的值為T1但時間序列B沒有值時,需要進行插值。

本文件重點介紹如何在一個組中按上下文使用聚合器,即將多個時間序列合併為一個。此外,聚合器可用於下采樣時間序列(即返回較低解析度的結果集)。有關更多資訊,請參閱下取樣

聚合

在將多組時間序列聚合或分組成為為一個時,每個組的時間序列中的時間戳都是對齊的。然後,對於每個時間戳,將所有時間序列中的值聚合為新的數值。也就是說,聚合將工作跨越時間序列的每個時間戳。將原始資料視為矩陣或表格,如以下示例所示,該示例說明sum聚合器在兩個時間序列中的作用,A並B生成新的時間序列Output。


對於時間戳t0,對A和B的資料點進行求和,即5 + 10 = 15。接下來,將t1的兩個值相加得到10,以此類推。在SQL中,這看起來像是SELECT SUM(value) FROM ts_table GROUP BY timestamp。

插值

在上面的例子中,時間序列A和B每個時間戳都有資料點,它們排列整齊。然而,當兩個系列沒有對齊時會發生什麼?同步所有資料來源以在同一時間寫入資料可能是困難的,有時是不切實際的。例如,如果我們有10,000臺伺服器每5分鐘傳送100個系統指標,那麼這將是一秒鐘內的10M資料點突發。我們需要一個非常強大的網路和叢集來適應這種流量。更不用說系統將閒置4分59秒。相反,隨著時間的推移顯示寫入更有意義,因此我們平均每秒有3,333次寫入,以減少我們的硬體和網路要求。

缺失資料
“缺失”只是意味著時間序列在給定的時間戳上沒有資料點。通常,資料只是在請求的時間戳之前或之後進行時間移位,但如果源或TSD遇到錯誤並且未記錄資料,則實際上可能會丟失資料。某些時序資料庫DB可以允許在某個時間戳處儲存NaN,以表示不可記錄的值,但是OpenTSDB還不支援這樣。

如何累加或找平均一個不存在的值?第一直覺就是返回有效的資料點並用這些資料來完成工作。但是,如果你像上面那樣處理數千個數據點根本不對齊的資料來源呢?例如,下圖顯示了未對齊寫入的時間序列,導致鋸齒狀線條難以讀取:
在這裡插入圖片描述

或者,您可以簡單地忽略任何時間序列在時間戳上有丟失的資料點。但是如果你有兩個時間序列並且它們只是未對齊,那麼即使儲存中有良好的資料,你的查詢也會返回一個空的資料集,所以這不一定非常有用。

另一種選擇是定義一個標量值(例如0或者Long的最大值)來代替丟失的資料。OpenTSDB 2.0及更高版本提供了一些聚合方法,用於替換缺失資料點的標量值,實際上,上圖是使用zimsum聚合器生成的,該聚合器將未對齊值替換為零。這種替換有時候很有用,有時候卻不一定有用。

OpenTSDB提供的一個答案是使用定義良好的插值數值分析方法來猜測該時間點的值。插值使用現有資料點作為時間序列,以在請求的時間戳處計算最佳猜測值。使用OpenTSDB的線性插值,我們可以平滑我們的未對齊圖形,以獲得:
在這裡插入圖片描述
對於數值示例,請檢視這兩個時間序列,其中源每20秒發出一次值,資料只是偏移10秒:
在這裡插入圖片描述

當OpenTSDB計算聚合時,它會從任何序列找到的第一個資料點開始,在這種情況下,在B中的資料是t0時刻的資料。我們請求A在t0時刻的值,t0但那裡沒有任何資料。我們知道A在t0+10s時有資料,但由於我們沒有t0之前的資料,我們無法猜測A在t0時它會是什麼。因此,我們只返回值B在t0的值。

接下來,我們訪問A在時間t0+10s的資料,這個資料是存在的。但是我們取t0+10s時間序列的值,B但沒有一個。但是B知道t0有一個值,t0+20s有一個值,所以我們現在可以猜測計算t0+10s的值。對於線性插值的公式是其中,公式就不列了,線性插值,結果是15.

迭代在每個時間戳上繼續,對於作為查詢的一部分返回的每個系列,找到資料點。使用sum聚合器生成的系列將如下所示:
在這裡插入圖片描述

更多示例: 對於圖示,我們有以下示例。名為的虛擬度量標準m記錄在OpenTSDB中。查詢語句為start=1h-ago&m=sum:m。它由紅線host=foo和綠線host=bar的和構成藍線:
在這裡插入圖片描述

(說白的,上面那張圖是按上面那種插值方式求和)從上圖中可以直觀地看出,如果你“疊加”紅線和綠線,你就會得到藍線。在任何離散時間點,藍線的值等於紅線的值與此時綠線的值之和。如果沒有插值,你會得到一些非常不直觀的東西,這些東西更難以理解,而且它也沒那麼有意義和有用(說白的下面那張圖是不進行插值,沒有就設為0得到的):
在這裡插入圖片描述

目前,OpenTSDB主要支援線性插值(有時縮短為“lerp”)以及一些簡單地替換零或最大值或最小值的聚合器。對於想要新增其他插值方法的人,歡迎使用補丁。

只會在查詢時執行插值。許多系統在寫入時進行插值,因此會記錄非原始值。OpenTSDB儲存您的原始值,並允許您隨時檢索它(即OpenTSDB的插值不會被落庫)。

以下是來自郵件列表的另一個稍微複雜的示例,描述瞭如何按平均值聚合多個時間序列:
在這裡插入圖片描述

帶有三角形的粗藍線是根據查詢具有多個時間序列函式值聚合而成的,而聚合的方式是對與丟失的值視為0,從而得到藍色所在的圖(好像沒啥意義)

注意:聚合函式根據輸入資料點的型別決定返回整數還是double 值。如果兩個源值都是儲存中的整數,則生成的計算將為整數。這意味著計算產生的任何小數值都將被刪除,不會發生舍入。如果任一資料點是浮點值,則結果將是浮點。但是,如果啟用了下采樣或速率,則結果將始終為浮點數。