elasticsearch相信有不少朋友都了解,即使沒有了解過它那相信對elk也有所認識e即是elasticsearch。elasticsearch最開始更多用於檢索,作為一搜尋的集群產品簡單易用絕對是乙個非常不錯的選擇,其實本人早在elasticsearch v0.2的時候就使用,一轉眼數年過去現在都7.x了。
其實elasticsearch除了提供強大的集群化搜尋服務外,它提供乙個aggregation功能會再一次讓你受到它的強大,aggregation是乙個資料統計彙總功能,表面上這功能在關聯式資料庫上也可以做,但結合分詞建維度就更能體現出它的靈活之處。
關聯式資料庫問題
拿產品訂單為例,它有產品分類,不同的規格,銷售人,客戶和地區等;然而這些資訊在設計上都是歸納到不同的表中,如果要針對這些不同的資訊來統計訂單銷售情況那相信是一件非常繁瑣和效率極其低下的工作(先不說資料數千萬了上億或更大規模,就算幾十上百萬資料這個關係資料的sql查詢也夠受了)。即便可以把資料抽取並歸納起來做統計,但隨著新的資料維度增加新的維度字段重新呼叫。
無維度字段?
在資料統計每個維度都對乙個資訊列來儲存,這樣加入維度必須就需要新增資訊列。如果用乙個字段儲存所有維度資訊呢?顯然這種想法在傳統關聯式資料庫中也不可能的,因為無法做表的關聯和維度區分,其實不要說傳統資料庫很多資料庫都無法在乙個字元中拆分出不同的維度出來,除非加入程式來切分,但這種法在資料規模大的情況必然是不可取的!
如果用乙個欄位就能儲存所有維度,那就意味著以後加入新的維度資料也無須調整結構和程式就實現新維護度資料的統計處理。這看上去多麼美好,似乎也很難實現,但elasticsearch能解決這一問題。
試驗
首先elasticsearch是乙個搜尋引擎,它最擅長的工作是對內容進行分詞並構建索引;在這機制下可以對乙個欄位的資訊進行拆分並儲存到索引上。通過這一特性同樣可以把乙個欄位的資訊切分成n個維度的資訊,然後儲存到索引;只要有了單一的維度索引那接下來針對不同維護的匯**計就簡單了。
在單節點的elasticsearch上建立了5千萬條產品銷售資料;然後tag欄位儲存對應的維度資訊,每個維度通過/來區分,分別有:customer,employee,country和category.有了這些資訊,接下來的工作是嘗試使用aggr功能來完成相應的彙總
var query =db.index.createquery();**並不複雜,查詢tag標籤存在customer的資料,並對它們進行乙個分組,最後再彙總出對應的quantity和total資訊;最後獲取排在最前面的5條資料。query.prefix(
"tag
", "客戶"
);var aggs = db.index.createaggs("
customer_group",
elasticsearch.search.aggstype.terms,
"tag");
aggs.subaggs(
"sum_quantity
", elasticsearch.search.aggstype.sum, "
quantity");
aggs.subaggs(
"sum_total
", elasticsearch.search.aggstype.sum, "
total");
aggs.size(5);
aggs.query =query;
var items = await aggs.execute();
效率
elasticsearch做這方面的效率怎樣呢?部署在乙個節點上,分別彙總了客戶,國家和員工。
5千萬條(單機單節點)
5千萬條(單機雙節點)
這個時間是在不停更新索引下同時做統計的結果,當在索引不更新的情況其二次處理效率會高上幾倍。
靜態歷史資料
上面紹了elasticsearch對大資料乙個聚合效率做了乙個測試,那測試是基於動態資料測試,即在聚合測試的過程中同時大量更新索引資料;接下來做的測試則是針對固定的歷史資料,在聚合測試過程中不進行資料更新。
測試資料環境
5千萬條件產品銷售資料,分布在2000-2020間,所有資料部署在單機雙節點的服務中。
測試過程
分別彙總每一年的員工,國家和分類資料,並顯示最前面的3條記錄。
int top = 3測試結果;for (int i = 2000; i < 2020; i++)
use ms");
console.writeline($
"|-|");
foreach (summaryitem item in
result.items)
result = await db.aggstag("
分類", top, start, end, null
); console.writeline($
"| use ms");
console.writeline($
"|-|");
foreach (summaryitem item in
result.items)
result = await db.aggstag("
員工", top, start, end, null
); console.writeline($
"| use ms");
console.writeline($
"|-|");
foreach (summaryitem item in
result.items)
}
從測試結果來看效率非常出色,每個年分類聚合統計所損耗的時候大概在0.1秒。
boost graph lib 小試牛刀
最近要做社會網路的社群發現,發現用bgl能減少不少 量。經過一番調研發現bgl封裝的很牛叉,dijkstra等演算法統統具備,奈何自己對泛型程式設計不太熟,遇到問題還是很糾結。primer泛型程式設計 演算法部分和stl原始碼分析接下來有時間一定要讀下。下面僅以鄰接鍊錶和自定義節點為例 typede...
Anti Debug 小試牛刀
本文整理了日常生活中遇到的一些anti debug技術,除非特殊說明,均適用於mac ios開發 作為第一篇正式博文,會不定期更新,謝謝大家.123 4567 89 define pt deny attach 31 include intmain 程式正常執行,會輸出hello 但是程式載入到gdb...
tsung小試牛刀
linux環境 centos5.5 1 tsung安裝 tar zxvf tsung 1.4.2.tar.gz configure make sudo make install 安裝後執行 which tsung,如果顯示 usr bin tsung 表明安裝成功 2 設定 如果沒有 tsung 目...