axure9數據統計插件_WMDA:大數據技術棧的綜合實踐

一、概述

WMDA是58自主開發的用戶行為分析產品,同時也是一款支持無埋點的數據采集產品,只需要在第一次使用的時候加載一段SDK代碼,即可采集全量、實時的PC、M、APP三端以及小程序的用戶行為數據。同時,為了滿足用戶個性化的數據采集需求,在無埋點之上,WMDA又提供了手動埋點的數據采集方式。

WMDA支持的統計、分析功能主要包括:

  • “概覽”和“實時”模塊用來監控網站的流量情況;
  • “圈選”定義重要的指標;
  • “單圖”和“看板”可以統計不同維度、時間下指標的頁面訪問量和用戶量等數據;
  • “漏斗”和“智能路徑”用于分析不同指標下的轉化率;
  • “留存”可以基于不同維度、分群來考察網站的用戶流失率,分析用戶的忠誠度;
  • “用戶細查”和“用戶分群”用于分析所關心條件下的用戶群體以及相關的用戶行為明細。

以上簡單的介紹了WMDA功能模塊,接下來側重于WMDA數據端的架構以及相關大數據技術棧的實踐。

二、架構設計

在架構上,WMDA遵循標準的數據分析模型,將整體的架構分成數據采集、數據傳輸、數據建模/存儲、數據統計/分析和數據可視化五個部分。架構如下圖所示:

75fb11e53cc359b2b557d64165852e74.png

數據采集:58的業務方覆蓋PC、M、APP三端以及小程序。WMDA在數據收集階段為PC、M、H5、提供SDK完成數據采集,在APP端提供IOS SDK和Android SDK完成數據采集,小程序也有相應的SDK來完成數據采集。

數據傳輸:主要包括數據收集服務完成前端上報數據的信息補全、臟數據過濾、設備標識等,最后將數據格式化之后落地存儲,通過Flume收集到Kafka中,完成實時總線和離線總線的拆分。

數據建模/存儲:后端收集上來的數據經過ETL的清洗,將上報的數據格式化之后保存在HDFS上,供后續分析使用。同時Kafka分發一份數據到Spark Streaming中,進行實時數據分析。

數據統計/分析:除了Spark Streaming的實時分析外,落地到HDFS上的數據在Kettle的調度下,由OLAP子系統、Bitmap子系統、分群計算子系統、智能路徑計算子系統完成單圖、漏斗、留存、分群、智能路徑的最終計算。

三、實時分析系統

實時分析系統用于解決用戶監控網站、APP實時流量需求,采用SparkStreaming+Druid來實現。實時ETL程序中設置5s為Spark Streaming處理批次間隔,同時將圈選配置信息在實時ETL程序中定義為廣播變量,完成指標id的實時匹配,最后將數據通過緩沖kafka攝入到Druid中。

d86260b242dbdd8ea4520fef2049cd46.png

四、離線分析系統

離線分析系統主要完成單圖、漏斗、留存、智能路徑、分群等數據分析工作,是WMDA的核心組成,也是數據建模/存儲,數據統計/分析的具體實踐。

基礎數倉:使用HDFS作為存儲系統,DW+DM+DA是標準的數據中臺角度的數倉分層,同時基于基礎事件模型(Event)搭建基礎數倉。

Hive:完成基礎數倉的核心ETL。

Spark+ETL:完成數據圈選規則匹配、臟數據的過濾和標準日志格式化。

離線計算集群:包括OLAP系統、Bitmap計算系統、分群計算系統、智能路徑計算系統,主要完成單圖、漏斗、留存、分群、智能路徑相關計算工作。

Kettle:負責離線計算集群的調度。

TaskServer:任務執行系統,負責執行由Kettle調度的Hive sql任務、MapReduce任務。

數據服務接口層+回溯接口層:供可視化服務獲取數據和指標變更回溯任務的觸發。

離線計算邏輯復雜,保證系統容錯性尤為關鍵,WMDA離線和實時數據系統都遵循Lambda架構,保證了系統較好的容錯特性。

b21f5f2cf2a27537d598ed7a4c6da2fe.png

4.1 基于Kettle的任務調度系統

Kettle是基于java開源的ETL工具集,可以在windows、Linux、Unix上運行,數據抽取高效穩定。通過可視化界面設計ETL流程,無需代碼去實現。在Kettle中,有兩種基本的腳本文件job和transformation,job是完成整個工作流的控制,transformation完成針對數據的基礎轉換。在job下的start模塊,有一個定時功能,可以每日、每周等方式實現對ETL任務的定時調度。

Kettle體系結構分為Kettle平臺、各類插件,其中Kettle平臺是整個系統的基礎,包括UI、插件管理、元數據管理和數據集成引擎。UI顯示Spoon這個核心組件的界面,通過xul實現菜單欄、工具欄的定制化,顯示插件界面接口元素。元數據管理引擎kjb、ktr以及一些元數據信息,插件通過該引擎獲取基本信息。插件管理引擎主要負責插件的注冊。數據集成引擎負責調用插件,并返回相應信息。

Kettle是眾多“可供插入的地方”(擴展點)和“可插入的東西”(擴展)共同組成的集合體。在Kettle中不管是以后的擴展還是系統集成的功能,本質上都是插件,管理的方式和運行機制是一致的。系統集成的功能也均是實現了對應的擴展接口,只是插接的方式略有不同。

Kettle的擴展點包括step插件、job entry插件、Database插件、Partioner插件、debugging插件等。

c7a90ba3392b8e8325324f3cd50a4516.png

在Kettle中一個job代表ETL控制流中的一項邏輯任務。Job會按照連線的方式順序執行,每個job產生一個執行結果,作為其他分支上job的條件。同時數據會從一個entry組件傳遞到另一個entry組件,并在entry組件中進行相應的處理。

d2bbac43e276da14445c03ca170dddc7.png

在Kettle負責調度各個子計算系統ETL任務的同時,TaskServer負責任務的執行,這樣使得任務的調度與任務的執行完全分離,方便任務的管理以及任務執行的靈活性。在Kettle中集成TaskSever相關的組件,需要關注Kettle中的兩個接口:JobEntryInterface和JobEntryDialogInterface。JobEntryInterface是Job Entry插件的主要實現接口,主要的功能如下:

  • 保存Job Entry設置

實現類使用私有變量保存設置的參數,通過get、set方法獲取和設置。Dialog實現類會通過這些方法設置界面上的參數。同時,需要提供一個深度拷貝的方法,在保存的參數被修改時進行調用。

  • 序列化插件
  • 輸出信息提供

一個Job Entry支持三種類型的輸出:true、false和無條件。這三種情況不是所有的Job Entry都會同時支持,例如dummy job entry僅支持true和false。通過JobEntryInterface接口的evaluates()方法可以設置一個Job Entry的輸出結果是否支持true和false,isUnconditional()方法則是設置是否支持無條件執行。

  • 執行任務

JobEntryDialogInterface接口負責構建和打開參數設置對話框。

4.2 基于TaskServer的任務執行系統

TaskServer是一個高可用的、可擴展性強的分布式任務執行系統。整體架構采用Master-Slave的設計模式,支持橫向擴展,兼備資源隔離、服務容災等功能,為線上任務的運行提供可靠的執行環境。WMDA各個子計算系統中的Hive sql和MapReduce都在TaskServer上執行,極大的確保WMDA離線任務的穩定性。

TaskServer主要包括三個部分:JobTracker集群、TaskTracker集群和Zookeeper集群。

  • JobTracker:負責任務接受、資源計算和任務分配。
  • TaskTracker:負責任務執行和保持心跳。
  • TaskQueue:任務隊列。
  • Zookeeper:協同調度。

在JobTracker中主要是資源的計算和任務分發,一個任務被提交之后會由JobTracker中的任務分發器(Dispatcher)發給對應的事件處理器(EventHadler),事件處理器完成之后會將任務相關的元數據信息寫入到Zookeeper中。TaskTracker監聽并拉取Zookeeper中新增的任務信息,抽象成TaskRunner放到線程池中運行,同時TaskTracker中任務調度器(TaskScheduler)跟JobTracker保持心跳用來更新機器信息。如果JobTracker監聽到某一個TaskTracker宕機會重新進行任務分配,由其他的TaskTracker來執行。資源的隔離方面,TaskTracker中采用硬性資源劃分機制和分時資源擴容機制。硬性資源是指資源被某種方式劃分之后,就只會接受這一類任務。在TaskServer中就為WMDA的任務劃分出來了WMDA Tier,只服務于WMDA提交的任務。分時資源擴容是指可以按照不同時間段來分擔其他Tier的任務。比如,在9點到10點是WMDA任務量的高峰,劃分的WMDA Tier不足以滿足當前任務所需要的計算資源,此時利用分時資源擴容機制從Share Tier中擴容一些Tier來滿足當前任務對計算資源的需求。

1ec0157f204ce67475aa2adada587afa.png

4.3 Druid在OLAP計算系統的實踐

WMDA中主要涉及OLAP場景模塊有概覽、單圖、即席圈選7日數據預覽、熱圖、維度閱覽以及用戶行為統計。OLAP引擎在選擇上嘗試過kylin和Druid。Kylin采用預計算,因為數據已經提前計算好,所以在前端查詢展示的時候相對較快。但是,因為WMDA支持多個維度任意組合,所以采用Kylin需要根據不同組合情況進行計算,這就使得隨著維度的增加,計算量增大。Druid則需要根據查詢條件即時計算,查詢相比Kylin慢,但是優化后基本在1秒以內。WMDA最終基于Druid實現OLAP模塊,其包括的角色有:

  • Real-Time Nodes:負責實時數據處理;
  • Historical Nodes:負責加載非實時窗口內滿足加載規則的所有歷史數據Segment;
  • Coordinator Nodes:負責Druid集群中Segment的管理與發布,包括加載新Segment,丟棄不符合規則的Segment,管理Segment副本以及Segment負載均衡;
  • Broker Nodes:整個集群的查詢入口,提供查詢路由和結果組裝;
  • Indexing Service:負責“生產”Segment的高可用、分布式、Master/Slave架構服務。
d2577dc844d9e0feccc3e113c79afb26.png

Druid將數據的索引節點劃分為HistoricalNodes和Real-Time Nodes,切割了歷史數據的加載與實時流數據處理,因為二者都需要占用大量內存與CPU;另一方面,劃分Coordinator Nodes和Broker Nodes,切割了查詢需求與數據如何在集群內分布的需求,確保用戶的查詢請求不會影響數據在集群內的分布情況。

在時間窗口內的數據會停留在Real-Time Nodes內存中,而時間窗口外的數據會組織成Segment存儲到Deep Storage中;批量數據經過Indexing Service也會被組織成Segment存儲到Deep Storage中,WMDA使用HDFS作為Druid的Deep Storage,同時Segment的元信息都會被注冊到元信息庫中,Coordinator Nodes會定期(默認為1分鐘)去同步元信息庫,感知新生成的Segment,并通知在線的Historical Node去加載Segment,Zookeeper也會更新整個集群內部數據分布拓撲圖。

當用戶需要查詢信息時,會將請求提交給Broker Nodes,BrokerNodes會請求Zookeeper獲取集群內數據分布拓撲圖,從而知曉請求應該發給哪些Historical Nodes以及Real-Time Nodes,匯總各節點的返回數據并將最終結果返回給用戶。

4.4 Bitmap計算系統在WMDA中的實踐

Bitmap是漏斗、留存和分群數據分析中,用來較快計算滿足某些條件下用戶數量的數據結構。Bitmap計算系統分為Bitmap計算模塊和Bitmap檢索模塊,Bitmap計算模塊通過MapReduce從基礎日志中計算出指標Bitmap、維度Bitmap和分群Bitmap,并提交至WTable中。Bitmap檢索模塊則是通過BitMapEngine查詢出符合查詢條件的用戶包。

2c749260f2d88604c20f5993cb347eb3.png

五、總結

本文主要闡述了WMDA數據端的架構設計,主要從數據采集、數據計算、數據應用、調度系統等方面逐一進行了介紹。當然,大數據處理相關的架構以及技術選型并不是本文介紹的這一個方向,好的架構應該是根據具體的業務來設計的,而且是隨著業務的拓展不斷演變的。


歡迎大家關注“58架構師”微信公眾號,定期分享云計算、AI、區塊鏈、大數據、搜索、推薦、存儲、中間件、移動、前端、運維等方面的前沿技術和實踐經驗。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/542466.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/542466.shtml
英文地址,請注明出處:http://en.pswp.cn/news/542466.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java Collections unmodifiableCollection()方法與示例

集合類unmodifiableCollection()方法 (Collections Class unmodifiableCollection() method) unmodifiableCollection() method is available in java.util package. unmodifiableCollection()方法在java.util包中可用。 unmodifiableCollection() method is used to get an un…

openfoam安裝中出現allmake error_如何更新OpenFOAM的版本?

這是協作翻譯的第四章,翻譯完感覺挺有意思的,分享給大家一起看看。4.更新OpenFOAM版本4.1 版本管理OpenFOAM以兩種不同的方式分發。一種方式是使用Git倉庫下載的倉庫版本。倉庫版本的版本號由附加的x標記,例如 OpenFOAM2.1.x。該版本會經常更…

java 根據類名示例化類_Java類類的requiredAssertionStatus()方法和示例

java 根據類名示例化類類的類requiredAssertionStatus()方法 (Class class desiredAssertionStatus() method) desiredAssertionStatus() method is available in java.lang package. requiredAssertionStatus()方法在java.lang包中可用。 desiredAssertionStatus() method is …

python中計算排列組合的函數_Python實現的排列組合計算操作示例

本文實例講述了Python實現的排列組合計算操作。分享給大家供大家參考,具體如下:1. 調用 scipy 計算排列組合的具體數值>> from scipy.special import comb, perm>> perm(3, 2)6.0>> comb(3, 2)3.02. 調用 itertools 獲取排列組合的全部…

java日歷類add方法_Java日歷setMinimalDaysInFirstWeek()方法與示例

java日歷類add方法日歷類setMinimalDaysInFirstWeek()方法 (Calendar Class setMinimalDaysInFirstWeek() method) setMinimalDaysInFirstWeek() method is available in java.util package. setMinimalDaysInFirstWeek()方法在java.util包中可用。 setMinimalDaysInFirstWeek(…

相同布局在不同手機上顯示不同_不懂響應式,不同尺寸屏幕下的頁面很難達到最佳效果...

讓用戶在不同設備和尺寸的屏幕下看的頁面顯示效果更佳,屏幕空間利用更高,操作體驗更統一,交互方式更符合習慣。本文主要圍繞什么是響應式,如何搭建響應系統,響應式網站解析 三個部分進行闡述,在項目中提前定…

Java ByteArrayInputStream markSupported()方法與示例

ByteArrayInputStream類markSupported()方法 (ByteArrayInputStream Class markSupported() method) markSupported() method is available in java.util package. markSupported()方法在java.util包中可用。 markSupported() method is used to check whether this ByteArrayI…

markdown 流程圖_測試了12款Markdown編輯器,推薦一個最好用的!

有很多喜歡寫博客的小伙伴問我,這個代碼筆記的格式怎么弄的簡潔又好看,雖然csdn里面有Markdown的書寫模式,但是我還是想推薦一款比較好用的寫筆記的編輯器 - Typora。相信很多小伙伴都在使用吧,這個一直是我最喜歡的 markdown 編輯…

小程序 || 語句_C ++條件語句| 查找輸出程序| 套裝2

小程序 || 語句Program 1: 程序1&#xff1a; #include <iostream>#include <stdio.h>using namespace std;int main(){int num 0;num printf("%d ", printf("%d ", printf("ABC")));if (num 2) {cout << "INDIA&quo…

python爬取天氣預報源代碼_python抓取天氣并分析 實例源碼

【實例簡介】Python代碼抓取獲取天氣預報信息源碼講解。這是一個用Python編寫抓取天氣預報的代碼示例&#xff0c;用python寫天氣查詢軟件程序很簡單。這段代碼可以獲取當地的天氣和、任意城市的天氣預報&#xff0c;原理是根據url找到網站截取相應的數據展現。python抓取廣州天…

Linux編譯程序源碼環境,Linux下對nodejs環境進行源碼編譯并部署云應用

Node 是一個讓 JavaScript 運行在服務端的開發平臺&#xff0c;它讓 JavaScript 成為與PHP、Python、Perl、Ruby 等服務端語言平起平坐的腳本語言。該環境安裝非常簡單&#xff0c;這里簡單記錄下linux(centos環境下)的源碼安裝&#xff0c;做個記錄。平臺&#xff1a;centos 6…

endswith方法_帶有示例JavaScript字符串endsWith()方法

endswith方法字符串endsWith()方法 (String endsWith() Method) endsWith() method is a string method in JavaScript, it is used to check whether a string ends with a specified substring or not. EndsWith()方法是JavaScript中的字符串方法&#xff0c;用于檢查字符串是…

mysql多行合并成一行_數據文件合并與拆分

在數據處理業務中&#xff0c;經常要把文件結構相同或近似相同的數據文件合并成一個文件&#xff0c;或者將一個比較大的數據文件拆分成小的數據文件。本文將介紹文本文件和 Excel 文件合并及拆分會遇到的幾種情況&#xff0c;并提供用 esProc SPL 編寫的代碼示例。esProc 是專…

日期setMinutes()方法以及JavaScript中的示例

JavaScript日期setMinutes()方法 (JavaScript Date setMinutes() method) setMinutes() method is a Date class method, it is used to set the minutes to the Date object with a valid minutes value (between 00 to 59). setMinutes()方法是Date類的方法&#xff0c;用于將…

suse linux增加新磁盤分區,Virtualbox中Linux添加新磁盤并創建分區

引言&#xff1a;我們常常在使用系統的時候突然發現&#xff0c;哎呦~~~我們的磁盤空間不夠用啦&#xff01;我遇到常見的就是數據庫數據暴增&#xff0c;預留的空間沒有啦&#xff0c;只好新添加磁盤&#xff0c;在VB虛擬機上就可以實現&#xff0c;往往苦于沒有圖文并茂的好資…

Java SecurityManager checkMemberAccess()方法與示例

SecurityManager類的checkMemberAccess()方法 (SecurityManager Class checkMemberAccess() method) checkMemberAccess() method is available in java.lang package. checkMemberAccess()方法在java.lang包中可用。 In checkMemberAccess() method we access public members …

arcgis字段計算器無法賦值_Arcgis空間連接工具的妙用

?Arcgis功能真的無比強大&#xff0c;讀書時一般只會用到一些常見的&#xff0c;工作后挖掘了很多新功能&#xff0c;數據處理效率大幅提升&#xff0c;個人覺得arcgis是最強大最好用的gis軟件&#xff01;本節給大家分享下空間連接功能的兩個妙用。空間連接功能很多giser應該…

linux重裝hal服務安裝,linux ubuntu 安裝微信客戶端

下載(我的系統是32 位的)rootmarhal:/opt# wget https://github.com/geeeeeeeeek/electronic-wechat/releases/download/V2.0/linux-ia32.tar.gz解壓rootmarhal:/opt# tar xvf linux-ia32.tar.gz下載微信圖標移動到解壓目錄rootmarhal:/home/marhal/下載# mv wechat.ico /opt/e…

currency abap_Java Currency getDefaultFractionDigits()方法及示例

currency abap貨幣類getDefaultFractionDigits()方法 (Currency Class getDefaultFractionDigits() method) getDefaultFractionDigits() method is available in java.util package. getDefaultFractionDigits()方法在java.util包中可用。 getDefaultFractionDigits() method …

python爬蟲自動更換ip_Python 爬蟲使用動態切換ip防止封殺

對于爬蟲被封禁 &#xff01; 爬蟲一般來說只要你的ip夠多&#xff0c;是不容易被封的。 一些中小網站要封殺你&#xff0c;他的技術成本也是很高的&#xff0c;因為大多數網站沒有vps&#xff0c;他們用的是虛擬空間或者是sae&#xff0c;bae這樣的paas云。 其實就算他們不考慮…