一次有趣的Elasticsearch+矩陣變換聚合實踐

2021-01-08 一諾大咖

01序言

Elasticsearch聚合功能非常豐富,性能也相當不錯,特別適合實時聚合分析場景,但在二次聚合上也有明顯短板,不支持。

項目是一個基於日期維度做預處理的技術方案,以下是結合Elasticsearch優缺點揚長避短的一次嘗試性實戰,非常有意思,希望可以帶來一些參考,同時歡迎各種討論。

02背景需求

公司所屬行業是物流速運,面向企業服務(簡稱ToB模式),提供多種物流運輸方案產品,客戶分布遍布全國,客戶數量在百萬級以上,日均產生物流運輸需求在幾十萬票以上,對於客戶訂單的聚合統計分析查詢需求強烈,且需要一定的實時性。

用戶需求

用戶要求在地圖上展示客戶的聚合分布聚合分布維度按照全國、省、市、區縣、鄉鎮 劃分。

展示示意圖,非實際效果圖

篩選條件

用戶基於多個篩選條件過濾聚合,多條件任意組合,如下:

行政區域按照國家4級行政區域:省、市、區、鎮等數量在5000+以上

企業組織架構企業內部多層級組織架構:大區、小區等數量超過3000+以上

客戶企業類型客戶企業類型劃分:2B、2C等數量在10+以上

客戶行業類型客戶企業行業所屬類型劃分,如家具、服裝、電子、3C等數量在100+以上

企業業務類型企業物流業務類型,如寄件、派件、未寄件派件等

日期範圍日期範圍篩選限制在1個月,即日期的滑動窗口在1~31天(這個限定範圍是與業務部門多次討論得來,否則後面實現的代價會更大,原有是多個月的窗口期)

篩選條件示意說明

業務模型

原始數據模型說明:

客戶下單一次,業務系統記錄一條數據客戶下單多次,業務系統記錄多條數據業務需求數據模型說明:

單個客戶即使單天下單多次,單天聚合統計也只能算1個客戶。單個客戶連續多天都有下單,多天聚合統計也只能算1個客戶。業務類型有寄件/派件,按照其中一種處理,邏輯比較計算。

業務數據模型轉換示意圖

聚合模型

聚合數據模型說明

基於前面的原始業務模型數據聚合,按照區域+其它部分條件聚合,統計組合後條件下的分組客戶數量

聚合後的數據模型示意圖

03技術探索

業務需求是一個很典型的聚合統計,多數大數據產品或者傳統關係資料庫都支持,相反Elasticsearch聚合支持的不怎麼好,不能滿足需求。

技術抽象

業務需求的技術本質實際上是一個去重然後分組聚合的過程。

去重合併按照客戶維度去重,合併符合過濾條件的客戶數據,相同多條客戶數據合併為單條數據聚合分組按照聚合維度分組,並計算出分組後的客戶數量

技術抽象過程

技術嘗試

在實現業務需求過程中嘗試過多種技術產品,遇到不少問題。

Mysql當數據達到一定數量級,運行超時嚴重,甚至直接運行不起來Prestodb定位是秒級分析型產品,單任務啟動就需要消耗好幾秒的時間,且受資源限制,並發度與響應度不能滿足要求。優點可與Hive很好結合MPPGreenplum/Vertica/Infobright,與Prestodb其實本質差不多,都不能滿足性能要求。窮舉法探討過將所有的組合條件全部計算存儲起來,業務系統只要去定位去查詢,比如Kylin產品,查詢複雜度確實低了,但計算量與存儲量實在是太大,根本不現實

窮舉法計算複雜度

Elasticsearch雖然提供了聚合能力,但不支持在一次聚合過程中完成去重與分組統計,也就是二次聚合,這是ES局限,也是ES定位。

04矩陣轉換

嘗試過幾次不同的技術產品之後得出結論,單一的數據產品已有能力是無法滿足要求的,正可謂魚與熊掌不可兼得。所以必須改變思維,設計了一種矩陣變換的算法機制,結合Hive+ES實現,以下介紹這種技術實現方式。

可轉換性分析

分析原有業務需求,發現只有日期這個條件組合特別多,動態變化範圍很大,如果按照單月最長31天計算組合數就有31的階乘;其餘的條件變化小,也沒有動態的組合條件,所以重點解決日期組合這個條件。

可變數分析

數據行轉列

原有業務數據是按照行存儲,聚合日期最小粒度是天, 單個客戶下單信息除了下單日期、業務類型,其餘的是相同的。將單個客戶單月31天的下單數據31條轉換成1條數據31列存儲,31列分表代表從下單日期往後疊加的日期,列存儲的值代表當天是否有下單以及業務類型。

數據模型行轉列示意圖

本次行轉列基於Hive實現,數倉ODS數據都存儲在Hive上,方便做下一步數據清洗轉換計算。首先在Hive上 按照【客戶+日期】維度將客戶下單數據去重,並按照業務類型簡單的邏輯計算,合併單日多次下單的業務類型。客戶數據按照日期排序,從歷史日期到當下昨天日期,計算任務默認T+1其次在Hive上 將去重後的客戶數據,按照行轉列模型將1~31天行數據轉換到31列的數據,並填充原始行的業務類型值。列合併邏輯計算

業務需求是按照日期範圍聚合,在一個日期範圍內,客戶訂單業務類型要做一些邏輯計算(業務類型:0/1/2),按照最大,所以需要計算單個客戶單條數據之後31天的業務類型。

列合併邏輯計算示意圖

列合併邏輯計算示意圖

本次列合併邏輯計算基於Hive實現。合併完整的數據之後按照月的維度分開存儲,當計算任務下次T+1運行時,只要更新最近31天的數據,最多跨度2個月。數據同步到Elasticsearch中,一個月一個索引,也只要更新最近的2個索引。Elasticsearch更新索引也很方便,採用別名切換方式,可在毫秒間完成,ES這個優點有效的避免了業務系統查詢停頓空白問題。業務查詢

選擇Elasticsearch做為查詢引擎是非常正確的,得益於Elasticsearch高效的查詢機制以及高效的聚合能力。

依據 起始日期 定位 到該日期的月度索引,並鎖定對於下單日期所有數據。Elasticsearch支持動態索引搜索,支持高效的過濾filter掃描。依據結束日期與起始日期差值,定位到指定的 數據列最後只要一次聚合即可返回數據,性能很好。Elasticsearch支持高效的聚合特性agg案例:查詢2019-03-01~2019-03-05之間的聚合數據

查詢過程示意圖

05結語

技術

本次需求的技術實現比較曲折,在探討大數據分析方面做了一次很重要的探索實踐,沒有一種通用的數據系統即可滿足性能與功能,所以在面對實際業務問題要去探討多種技術的混合實踐。本次項目中的Hive+ES結合就是一次很有趣的混合。學會培養一些算法思維,用微觀的眼光分析問題解決問題。本次項目中採用矩陣轉換,有效避免了諸多技術產品的不足,滿足了性能與功能。項目

項目案例是在2019年3月完成,此時任職 跨越速運大數據中心。項目方案依賴大數據平臺實現大量的預計算,矩陣變換是由服務端工程師想出來的,典型的前後端配合完成內容來源

本次內容源於 2019-04-20深圳Elastics-meetup分享大會《大會分享活動: Elasticsearch 實時高效聚合計算應用實踐》重新整理。PPT回顧下載:ES社區 ,elasticsearch.cn

06關於作者

Elastic-stack產品深度用戶,ES認證工程師。2012/2013年接觸Elasticsearch,對Elastic-Stack開發、架構、運維等方面有深入體驗,實踐過多種Elasticsearch項目,最暴力的大數據分析應用,最複雜的業務系統應用。業餘為企業提供Elastic-stack諮詢培訓以及調優實施。

相關焦點

  • ElasticSearch 中的中文分詞器該怎麼玩?
    內置分詞器:4.2 中文分詞器在 Es 中,使用較多的中文分詞器是 elasticsearch-analysis-ik,這個是 es 的一個第三方插件,代碼託管在 GitHub 上:https://github.com/medcl/elasticsearch-analysis-ik4.2.1
  • ElasticSearch新版功能驚人
    日前Elastic發布了Elasticsearch 7.10.0後又持續更新了7.10.1。該版本基於Apache Lucene 8.7.0開發,支持在Elasticsearch 在線彈性雲和自建實例使用。現在就快速瀏覽下7.10的驚人特性。
  • FlinkSQL結合Kafka、Elasticsearch、Kibana實時分析電商用戶行為
    使用Flink SQL結合Kafka、Elasticsearch、Kibana實時分析電商用戶行為 (Use flink sql to combine kafka, elasticsearch and kibana, real-time analysis of e-commerce user behavior.)
  • Elasticsearch 7.10.0發布,基於Apache Lucene 8.7.0
    它保持與熱層(warm tier)和熱層相同的可靠性和冗餘級別,並完全支持從Elasticsearch獲得的自動恢復。通過EQL增強Elasticsearch的安全性在7.9版中,Elasticsearch事件查詢語言(EQL),一種新的實驗性查詢語言。
  • 機器學習筆記三初等列變換和常用矩陣
    3.初等列變換和常用矩陣3.1矩陣的初等列變換1. 互換A的第i列和第j列2. A的第i列乘以非零常數h3. A的第i列乘以k加到第j列3.2初等矩陣1. 定義:對n階單位矩陣In做一次初等變換得到的矩陣稱為n階初等矩陣;2.
  • 仿射變換和透視變換
    ,但是他們的本質還是通過某個矩陣,將圖像每個像素點的坐標變換到另一個新的位置。這種通過某個矩陣將圖像進行變換的方法通常稱為線性變換,也就是說利用了向量加法和標量乘法。【注】本文的變換僅僅針對二維矩陣,非針對三維矩陣的變換。
  • ElasticSearch 中的中文分詞器以及索引基本操作詳解
    內置分詞器:1.2 中文分詞器在 Es 中,使用較多的中文分詞器是 elasticsearch-analysis-ik,這個是 es 的一個第三方插件,代碼託管在 GitHub 上。
  • 矩陣的重要特性:特徵向量
    如果特徵值是負數,那說明了矩陣不但把向量拉長(縮短)了,而且讓向量指向了相反的方向。一個矩陣可能可以拉長(縮短)好幾個向量,所以它可能就有好多個特徵值。有趣的是,如果A是實對稱矩陣,那麼那些不同的特徵值對應的特徵向量肯定是互相正交的,原因是?我們也可以說,一個變換矩陣的所有特徵向量組成了這個變換矩陣的一組基。
  • 矩陣:特徵向量(Eigenvector)
    如果特徵值是負數,那說明了矩陣不但把向量拉長(縮短)了,而且讓向量指向了相反的方向。一個矩陣可能可以拉長(縮短)好幾個向量,所以它可能就有好多個特徵值。有趣的是,如果A是實對稱矩陣,那麼那些不同的特徵值對應的特徵向量肯定是互相正交的。我們也可以說,一個變換矩陣的所有特徵向量組成了這個變換矩陣的一組基。所謂基可以理解為坐標系的軸。
  • 線性變換(二)
    既然矩陣是我們研究線性變換的工具,我們自然希望替每個線性變換找到其形式最簡單的表示矩陣——當然,這實際上需要尋找對應的基。毫無疑問,對角化可以讓我們把一個線性變換看得清清楚楚。現在我們運用行列式的相關理論來說明:  定理2 線性變換在不同基下的表示矩陣的特徵多項式是相同的,即相似的矩陣具有相同的特徵多項式。
  • 《海報裡的英雄》發布舞美效果特輯 碑林矩陣可變換
    視頻中,除了環形舞美的設計外,如英雄碑般矗立於舞臺外側的碑林矩陣尤為矚目。據總導演介紹,矩陣柱子可以隨意組合,合在一起就是一面牆,也可以變換各種形狀,這一舞美創新是史無前例的。矩陣也可以與環形舞臺互動,三環中裡面兩環可以升降,用於搬演場景、製造戰場效果,或將整個舞臺連接起來,結合實時內容做更出加宏大的場景。
  • 視覺SLAM十四講實踐之Sophus下的位姿表示和更新優化
    李群SE(3)變換矩陣李代se(3) 六維向量 平移在前 旋轉在後旋轉矩陣的導數由旋轉向量指定,指導著如何在旋轉矩陣中進行微積分運算。;cout << "更新李群SO3的旋轉矩陣 = \n" << SO3_updated.matrix() << endl;用旋轉矩陣R,平移向量t構造Sophus表示的李群變換矩陣SE3Eigen::Vector3d t(1, 0, 0);Sophus::SE3d SE3_rotation_translation
  • 華為開發者大會HDC.Cloud技術探秘:雲搜索服務技術實踐
    日前,華為開發者大會HDC.Cloud DevRunLive開發者技術沙龍上,華為雲專家做了關於「雲搜索服務技術實踐」的技術演講。本文為大家介紹業界流行的搜索應用場景,開源Elasticsearch的應用,以及華為雲搜索服務在此基礎上的一些增強。一、什麼是搜索?
  • 高等代數之線性變換
    今天我們來看一下不變子空間與線性變換的矩陣化簡之間的一個關係。我們先回顧一下不變子空間的定義:接下來我們來看一下線性變換在不變子空間W的一組基擴充為整個線性空間的基之後,在這一組基之下的矩陣會變成什麼樣子的。
  • 文覽匯意|elastic、resilient、flexible、supple的區別與用法
    Elastic* elastic指能伸長、彎曲,並容易復原,即「有彈性的」。>elastic.This option is probably the most elastic way of working.這可能是最靈活的工作方式。
  • 小學數學「有趣的七巧板」教學設計與實踐
    【教學目標】1、通過操作、觀察、比較、交流等活動,可以進一步了解圖形的變換和相關平面圖形之間的關係,了解圖形的變換,感受七巧板的「巧」,培養學生的空間觀念。2、在一系列的活動中,我們可以積累對數學的興趣,培養與學生的合作意識。
  • 教程| 從特徵分解到協方差矩陣:詳細剖析和實現PCA算法
    數學上,線性變換的特徵向量是一個非簡併的向量,其方向在該變換下不變。該向量在此變換下縮放的比例稱為特徵值。一個線性變換通常可以由其特徵值和特徵向量完全描述。如果我們將矩陣看作物理運動,那麼最重要的就是運動方向(特徵向量)和速度(特徵值)。因為物理運動只需要方向和速度就可以描述,同理矩陣也可以僅使用特徵向量和特徵值描述。
  • Linux的分離聚合IO函數(scatter/gather)
    Linux的分離聚合IO,可以減少數據的複製和系統調用的次數。數據的複製,是影響系統效率的關鍵因素之一。這一點在之前「斯特拉森算法」的文章裡提到過,中間臨時矩陣的數據複製會極大地降低算法效率,讓它比普通矩陣乘法還慢。
  • 數學專業基礎課程高等代數之線性變換
    今天就先從高等代數的核心要點線性變換開始,線性空間系列也會在近期更新。首先我們要知道什麼叫線性變換。首先,我們給出如下的定義:有了線性變換的定義我們接著來討論下面的內容。而數域K上的全體n階方陣他們的維數是n的平方這樣我們就不用直接去求某一數域上的線性空間中的全體線性變換作成的線性空間的維數,而且也不是那麼容易計算出來的,從同構的角度來看這個問題就變得容易。