背景
良品數(shù)據(jù)分析系統(tǒng)是為了滿足運營實時監(jiān)控用戶瀏覽行為陵叽、點擊行為狞尔、以及觀測用戶端日活的一套數(shù)據(jù)分析系統(tǒng)。這是他的前期的功能定位巩掺,后期會擴展他的監(jiān)控范圍偏序,比如自營外賣的用戶加購行為,用戶的下單行為胖替,用戶的支付行為研儒,以及整個外賣系統(tǒng)銷售實時統(tǒng)計監(jiān)控。隨著系統(tǒng)的穩(wěn)定后期可以承擔(dān)商品精準推薦刊殉,精準營銷殉摔,以及良品app的用戶行為分析以及配套的各種營銷手段,讓良品的多套C端系統(tǒng)從此有了自己的對外了解用戶记焊,感知用戶逸月,發(fā)現(xiàn)用戶,吸引用戶的大腦和眼睛遍膜。
數(shù)據(jù)采集系統(tǒng):是良品外賣團隊經(jīng)過2個月的技術(shù)沉淀碗硬,孵化出來的數(shù)據(jù)分析系統(tǒng)。從2018年12月底至2019年2月25日瓢颅,外賣團隊從對大數(shù)據(jù)一無所知恩尾,到后來初步實現(xiàn),經(jīng)歷了學(xué)習(xí)挽懦,探索翰意,研究,搭建幾個重要的階段信柿,每一個階段雖然走的很艱難冀偶,但總有階段性的成果出現(xiàn),從而不斷激勵我們一直向前渔嚷。經(jīng)過多套方案的預(yù)演最終確定了一套比較適合良品業(yè)務(wù)發(fā)展的數(shù)據(jù)分析系統(tǒng)进鸠。雖然良品內(nèi)部已經(jīng)有BI團隊做大數(shù)據(jù)統(tǒng)計的部分,但是他們更多的是做離線非實時的銷售報表的提供層面上形病,并不能提供實時的分析服務(wù)客年。而我們這套數(shù)據(jù)分析系統(tǒng),與此最大的差別就是實時的計算結(jié)果展示漠吻,讓運營能夠根據(jù)監(jiān)控到的結(jié)果及時做出反映量瓜,從而提升營運效率,及時抓住稍縱即逝的營銷時機途乃,讓營銷效果最大化榔至。
該系統(tǒng)分為多個模塊組成,數(shù)據(jù)采集欺劳、數(shù)據(jù)存儲唧取、數(shù)據(jù)清洗、分析計算划提、結(jié)果數(shù)據(jù)存儲枫弟、數(shù)據(jù)可視化。
接下來我們就一個一個模塊來介紹:
一鹏往、架構(gòu)
第一淡诗、數(shù)據(jù)采集、存儲
數(shù)據(jù)采集我們用了take-out-daq服務(wù)來做用戶瀏覽行為的日志記錄伊履,需要前端配合做用戶瀏覽行為和點擊行為的動作監(jiān)控韩容,并且把用戶的每一個動作都以固定的接口字段,上送到daq這個服務(wù)中唐瀑。daq的日志按照一定時間間隔來不斷歸檔數(shù)據(jù)到一個被flume監(jiān)控的文件夾里群凶。我們把這個文件夾定義為/usr/logs/flume。該文件夾下如果有新文件產(chǎn)生哄辣,就會被flume監(jiān)控到请梢,并且會把該文件數(shù)據(jù)實時收集到按照一定的日期格式沉淀到hdfs中。
這一個過程中力穗,我們牽涉到兩塊功能毅弧,第一是daq的日志歸檔功能,使用的logback.xml特性当窗。另外一個就是flume够坐,是apache開源的一套頂級項目,是專門做日志收集穩(wěn)定的開源框架崖面。
我們這里選擇flume的日志收集策略是兩個agent相互配合元咙,第一個agent負責(zé)監(jiān)控flume的日志歸檔目錄/usr/logs/flume,并把數(shù)據(jù)包裝成為一個遠程的事件avrosink嘶朱。第二個agent負責(zé)監(jiān)控第一個遠程的avrosink傳遞過來的事件蛾坯,并且用avrosource來接受此事件,并且通過memroychannel來整合疏遏,最后通過hdfsSink下沉到hdfs中脉课。(關(guān)于flume的知識可參看:flume.apache.org官網(wǎng))
對應(yīng)的flume部署框架圖:
第二、數(shù)據(jù)清洗财异、計算分析
這里選擇的是spark sql作為分布式計算框架倘零,資源調(diào)度使用的yarn,這些服務(wù)都是跑在HDFS之上的戳寸。真正的計算邏輯是我們使用spark sql的語法來編寫的一套計算組件呈驶,以jar包的形式spark-submit到運行在yarn之上的spark服務(wù)上的。運算時疫鹊,會從hdfs中獲取響應(yīng)的數(shù)據(jù)袖瞻,然后把計算結(jié)果沉淀到關(guān)系性數(shù)據(jù)庫中司致。
第三步:數(shù)據(jù)可視化
數(shù)據(jù)可視化顧名思義就是把大數(shù)據(jù)計算完的結(jié)果,結(jié)合業(yè)務(wù)關(guān)注數(shù)據(jù)維度聋迎,以圖表的形式直觀地展示數(shù)據(jù)的一種方式脂矫,也是大數(shù)據(jù)分析的最后一個步驟。目前流行的可視化框架有很多霉晕,有阿里開源的dataV也有百度開源的Echarts庭再,我們目前使用的Echarts。它的學(xué)習(xí)和開發(fā)成本很低牺堰,具體文檔可以參看https://echarts.baidu.com/
數(shù)據(jù)可視化的功能放在了take-out-control中來實現(xiàn)拄轻,目前使用Echarts來做數(shù)據(jù)圖表展示,使用heatmap來做頁面點擊熱力圖伟葫。
服務(wù)環(huán)境部署
服務(wù)器列表及部署目錄
測試環(huán)境hdfs瀏覽目錄:http://10.101.x.x:50070/
服務(wù)關(guān)系ip部署目錄服務(wù)名所屬業(yè)務(wù)影響環(huán)境對應(yīng)配置文件及目錄
test-flume-存儲端10.101.x.x/usr/apache-flume-1.6.0-cdh5.7.0-bin
啟動腳本:
nohup ./flume-ng agent --conf $FLUME_HOME/conf --conf-file $FLUME_HOME/conf/test-avro-memory-hdfs.conf --name test-avro-memory-hdfs -Dflume.root.logger=INFO,console &
flume日志接受并寫向3的hdfs恨搓,開放端口是44444測試環(huán)境/usr/apache-flume-1.6.0-cdh5.7.0-bin/conf/test-avro-memory-hdfs.conf
10.101.x.x/usr/hadoop-2.6.0-cdh5.7.0hadoop、yarn數(shù)據(jù)存儲測試環(huán)境/usr/hadoop-2.6.0-cdh5.7.0/etc/hadoop/spark-env.sh
10.101.x.x/usr/spark-2.1.1-bin-hadoop2.6spark數(shù)據(jù)計算測試環(huán)境/usr/spark-2.1.1-bin-hadoop2.6/conf/
test-flume-收集端10.101.x.x2/usr/local/apache-flume-1.6.0-cdh5.7.0-bin
啟動腳本:
nohup ./flume-ng agent --conf $FLUME_HOME/conf --conf-file $FLUME_HOME/conf/spooldir-memory-avro.conf --name?spooldir-memory-avro-Dflume.root.logger=INFO,console &
flume日志收集并寫向129的flume扒俯,目標端口44444測試環(huán)境/usr/local/apache-flume-1.6.0-cdh5.7.0-bin/conf/spooldir-memory-avro.conf
prod-flume-收集端172.16.x.x/home/app/apache-flume-1.6.0-cdh5.7.0-bin
啟動腳本:
nohup ./flume-ng agent --conf $FLUME_HOME/conf --conf-file $FLUME_HOME/conf/spooldir-memory-avro.conf --name?spooldir-memory-avro-Dflume.root.logger=INFO,console &
環(huán)境變量:/home/app/base_profile (里面指定了jdk的安裝目錄和flume的安裝目錄)
注意:
該flume監(jiān)控的目錄是/usr/local/daq.xxx.com/logs/flumes/奶卓,這個目錄是利用logback的歸檔功能,自動把日志歸集到這個目錄撼玄。一旦文件被歸集進來夺姑,此時flume就會立刻監(jiān)控到,并且立即傳輸文件里的數(shù)據(jù)到目標flume的55555端口掌猛,當flume監(jiān)控的文件數(shù)據(jù)成功傳輸?shù)?5555端口并下沉到hdfs時盏浙,會自動清理掉/usr/local/daq.xxx.com/logs/flumes/目錄下的.COMPLETED后綴的文件
flume日志收集并寫向10.16.x.x的flume,目標端口55555生產(chǎn)環(huán)境/home/app/apache-flume-1.6.0-cdh5.7.0-bin/conf/spooldir-memory-avro.conf
prod-flume-存儲端10.16.x.x(大數(shù)據(jù)部門hdfs集群主節(jié)點)/home/hadoop/apache-flume-1.6.0-cdh5.7.0-bin
啟動腳本:
nohup ./flume-ng agent --conf $FLUME_HOME/conf --conf-file $FLUME_HOME/conf/prod-avro-memory-hdfs.conf --name prod-avro-memory-hdfs -Dflume.root.logger=INFO,console?&
啟動成功檢查:
用ps -ef|grep flume荔茬,并且觀察/usr/apache-flume-1.6.0-cdh5.7.0-bin/bin下的nohup.out的日志文件即可废膘。
flume日志接受并寫向(10.16.6.x至10.16.6.x7)的hdfs集群,開放端口是55555生產(chǎn)環(huán)境/home/hadoop/apache-flume-1.6.0-cdh5.7.0-bin/conf/prod-avro-memory-hdfs.conf
數(shù)據(jù)清洗服務(wù)10.16.x.x2(使用jdk1.8環(huán)境)計算服務(wù)的實現(xiàn)程序慕蔚,這是jar包是我們開發(fā)人員編寫丐黄,編譯、打包上傳到上面去的
/home/hadoop/waimai/selfjars/execData-1.1-SNAPSHOT.jar
spark on yarn(集群模式)從(10.16.x.x至10.16.x.x7)對應(yīng)的hdfs數(shù)據(jù)倉庫中獲取埋點數(shù)據(jù)孔飒,并作計算灌闺,然后將計算結(jié)果插入到外賣生產(chǎn)庫的結(jié)果展示表里生產(chǎn)環(huán)境1、/home/hadoop/waimai/selfshells/sparkDataAutoOption.sh計算服務(wù)啟動腳本坏瞄,無參則計算當前小時的數(shù)據(jù)桂对。
2、/home/hadoop/waimai/selfshells/sparkDataAutoOption.sh 19-03-20 鸠匀,如果傳遞參數(shù)為19-03-20蕉斜,那么他就會計算19年3月20日全天的數(shù)據(jù)
二、服務(wù)
2.1 服務(wù)器:
10.101.3.x
生產(chǎn)HDFS集群:
10.16.x.x Bingo-0x-01 hamaster?(yarn master)
10.16.x.x1 Bingo-0x-02 hanode1 (ha2ndnamenode )
10.16.x.x2 Bingo-0x-03 hanode2?
10.16.x.x3 Bingo-0x-04 hanode3?
10.16.x.x4 Bingo-0x-05 hanode4
10.16.x.x5 Bingo-0x-06 hanode5?
10.16.x.x6 Bingo-0x-07 hanode6?
10.16.x.x7 Bingo-0x-08 hanode7
10.16.x.x8 Bingo-0x-09 hanode8
2.2 執(zhí)行數(shù)據(jù)清洗方法
1.按時刻進行執(zhí)行:在dev環(huán)境任意目錄執(zhí)行命令 sparkDataAutoOption.sh?清洗當前時刻的數(shù)據(jù)
2.自定義日期進行清洗,在dev任意目錄執(zhí)行命令?sparkDataAutoOption.sh 19-03-07 (日期格式:XX(年)-XX(月)-XX(日))?定點清洗
2.4 腳本環(huán)境:
測試環(huán)境/開發(fā)環(huán)境:腳本目錄:/usr/local/shell/bin/sparkDataAutoOption_test.sh :測試執(zhí)行腳本
測試環(huán)境/開發(fā)環(huán)境:項目路徑:/usr/bigdata/spark/test/execData-1.1-SNAPSHOT.jar
三、注意
3.1 生產(chǎn)環(huán)境
生產(chǎn)環(huán)境hdfs集群:hdfs://hamaster:9000該地址僅供程序之間數(shù)據(jù)傳輸使用宅此,不能直接訪問
hdfs數(shù)據(jù)查看地址:http://bingo-0x-x:50070該地址是供開發(fā)者机错,便捷的查看目前hdfs中的數(shù)據(jù)存儲情況和數(shù)據(jù)存儲效果,以及下載數(shù)據(jù)使用父腕。效果見下圖
3.2自動化
使用阿里開源的dataX來管理我們數(shù)據(jù)清洗腳本的任務(wù)調(diào)度毡熏,決定開啟或關(guān)閉,以及開啟的頻率侣诵,以及與其他清洗任務(wù)的關(guān)聯(lián)關(guān)系。
我們清洗pv數(shù)據(jù)的任務(wù)目前每小時執(zhí)行一次狱窘。
這里注意用spark_submit任務(wù)時需要制定num和queue
#####begin#####
DAY=$1
echo "=======執(zhí)行spark -submit 清洗${DAY}的用戶點擊熱門商品指標數(shù)據(jù)======="
spark-submit --class com.xxx.HotClickProdAnalysis --master yarn --driver-memory 2g --executor-memory 2g --executor-cores 1 --queue flinkqueue /home/hadoop/waimai/selfjars/execData-1.1-SNAPSHOT.jar ${DAY}
echo "=======執(zhí)行用戶點擊熱門商品數(shù)據(jù)清洗完成========"
#####end######
如果想查看任務(wù)執(zhí)行的過程日志杜顺,有兩種方式:第一、可以點擊"運行日志"按鈕即可查看蘸炸。第二躬络、可以在yarn集群上查看任務(wù)執(zhí)行的情況,地址:http://hamaster:8088/cluster
如圖: