引用鏈接地址https://www.aliyun.com/jiaocheng/19206.html?spm=5176.100033.2.5.535e1e7f5RJgf0
【Best Practice】基于阿里云數(shù)加·StreamCompute快速構(gòu)建網(wǎng)站日志實(shí)時(shí)分析大屏
摘要:前幾天在云棲社區(qū)上寫了一篇普惠性的文章,很粗偏向數(shù)據(jù)架構(gòu)層面。具體可以進(jìn)入:【數(shù)據(jù)架構(gòu)解讀】基于阿里云數(shù)加StreamCompute和MaxCompute構(gòu)建的訪問日志統(tǒng)計(jì)分析,但是在具體實(shí)操中肯定不會那么一帆風(fēng)順。為了避免大家走彎路特意先寫了一篇架構(gòu)篇,以免大家后續(xù)發(fā)現(xiàn)不適用而更改或優(yōu)化工作。本文偏向與實(shí)操層面的為大家介紹,如何基于阿里云數(shù)加StreamCompute、DataV快速構(gòu)建網(wǎng)站日志實(shí)時(shí)分析?!臼裁磮鼍斑m合用流計(jì)算】流計(jì)算提供了針對流式數(shù)據(jù)實(shí)時(shí)分析的一站式工具鏈
前幾天在云棲社區(qū)上寫了一篇普惠性的文章,很粗偏向數(shù)據(jù)架構(gòu)層面。具體可以進(jìn)入:【數(shù)據(jù)架構(gòu)解讀】基于阿里云數(shù)加StreamCompute和MaxCompute構(gòu)建的訪問日志統(tǒng)計(jì)分析,但是在具體實(shí)操中肯定不會那么一帆風(fēng)順。為了避免大家走彎路特意先寫了一篇架構(gòu)篇,以免大家后續(xù)發(fā)現(xiàn)不適用而更改或優(yōu)化工作。
本文偏向與實(shí)操層面的為大家介紹,如何基于阿里云數(shù)加StreamCompute、DataV快速構(gòu)建網(wǎng)站日志實(shí)時(shí)分析。
【什么場景適合用流計(jì)算】
流計(jì)算提供了針對流式數(shù)據(jù)實(shí)時(shí)分析的一站式工具鏈,對于大量流式數(shù)據(jù)存在實(shí)時(shí)分析、計(jì)算、處理的邏輯可以考慮通過流計(jì)算該任務(wù)。舉例如下:
1. 針對實(shí)時(shí)營銷活動(dòng),需要實(shí)時(shí)獲取活動(dòng)流量數(shù)據(jù)分析以了解活動(dòng)的營銷情況,此時(shí)可以上流計(jì)算。
2. 針對物聯(lián)網(wǎng)設(shè)備監(jiān)控,需要實(shí)時(shí)獲取設(shè)備數(shù)據(jù)進(jìn)行實(shí)時(shí)災(zāi)難監(jiān)控,此時(shí)可以上流計(jì)算。
3. 對于手機(jī)APP數(shù)據(jù)實(shí)時(shí)分析,需要實(shí)時(shí)了解手機(jī)設(shè)備的各類指標(biāo)情況,此時(shí)可以上流計(jì)算
【使用前須知】
為保障本教程的順利的進(jìn)行,須知曉如下使用前提:
具備阿里云賬號(淘寶及1688帳號可直接使用會員名登錄);?
下載并安裝Logstash的DataHub Output插件。?
開通DataHub/StreamCompute/AnalyticDB或RDS/DataV產(chǎn)品;
【實(shí)現(xiàn)的業(yè)務(wù)場景】
數(shù)據(jù)來源于某網(wǎng)站上的HTTP訪問日志數(shù)據(jù),基于這份網(wǎng)站日志來實(shí)現(xiàn)如下分析需求:
實(shí)時(shí)統(tǒng)計(jì)并展現(xiàn)網(wǎng)站的PV和UV,并能夠按照用戶的終端類型(如Android、iPad、iPhone、PC等)分別統(tǒng)計(jì)。?
實(shí)時(shí)統(tǒng)計(jì)并展現(xiàn)網(wǎng)站的流量來源。?
從IP中解析出region或者經(jīng)緯度在地圖上進(jìn)行展示。
【說明】瀏覽次數(shù)(PV)和獨(dú)立訪客(UV)是衡量網(wǎng)站流量的兩項(xiàng)最基本指標(biāo)。用戶每打開一個(gè)網(wǎng)站頁面,記錄一個(gè)PV,多次打開同一頁面PV 累計(jì)多次。獨(dú)立訪客是指一天內(nèi),訪問網(wǎng)站的不重復(fù)用戶數(shù),一天內(nèi)同一訪客多次訪問網(wǎng)站只計(jì)算1 次。Referer 可以分析網(wǎng)站訪問來源,它是網(wǎng)站廣告投放評估的重要指標(biāo),還可以用于分析用戶偏好等。
【操作流程概述】
如上圖所示,紅色箭線部分為流式數(shù)據(jù)處理部分,主要拆解如下:
l?配置Logstash,將網(wǎng)站產(chǎn)生的日志實(shí)時(shí)采集至DataHub。
l?申請開通DataHub,創(chuàng)建項(xiàng)目Project及Topic(DataHub服務(wù)訂閱和發(fā)布的最小單位)。
l?開通StreamCompute,創(chuàng)建項(xiàng)目Project及注冊數(shù)據(jù)輸入源(DataHub)和輸出源(RDS),并創(chuàng)建流任務(wù)(Stream SQL任務(wù))。
l?上一步驟中關(guān)于輸出源RDS的配置,需要事先購買RDS for Mysql資源。
l?申請開通DataV,新建RDS數(shù)據(jù)源并創(chuàng)建DataV項(xiàng)目進(jìn)入大屏制作。
【數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)】
DataHub Topic: 分別創(chuàng)建Topic為:coolshell_log_tracker、coolshell_log_detail、coolshell_log_fact。?
RDS:分別創(chuàng)建Table為:adm_refer_info、adm_user_measures、flyingline_coordinates?????
【網(wǎng)站日志實(shí)時(shí)解析】
Logstash安裝與配置?
配置前須知
阿里云流計(jì)算為了方便用戶將更多數(shù)據(jù)采集進(jìn)入DataHub,提供了針對Logstash的DataHub Output插件。
Logstash安裝要求JRE 7版本及以上,否則部分工具無法使用。
操作步驟
步驟1點(diǎn)擊下載Logstash 2.4.1,點(diǎn)擊下載。
步驟2通過如下命令解壓即可使用:
$ tar -xzvf logstash-2.4.1.tar.gz
$ cd logstash-2.4.1
步驟3下載DataHub Logstash Output插件并使用如下命令進(jìn)行安裝:
$ {LOG_STASH_HOME}/bin/plugin install --local logstash-output-datahub-1.0.0.gem
步驟4下載GeoIP解析IP數(shù)據(jù)庫到本地。
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
步驟5解壓到當(dāng)前路徑并移動(dòng)到Logstash具體路徑下。
gzip -d GeoLiteCity.dat.gz?
mv GeoLiteCity.dat /etc/logstash/.?
步驟6配置Logstash任務(wù).conf,示例如下:
input {?
file {?
path => "/Users/yangyi/logstash-2.4.1/sample/coolshell_log.log"?
start_position => "beginning"?
}?
}filter{?
grok {?
match => {?
"message" => "(??[^ ]*) - (??[- ]*) /[(??[^/])*]/] /"(??/S+)(?: +(??[^/"]*?)(?: +/S*)?)?(?: +(??[^/"]*))/" (??[^ ]*) (??[^ ]*) /"(??[^/"]*)/" /"(??[^/"]*)/""?
}?
}?
geoip {?
source => "ip"?
fields => ["city_name","latitude", "longitude"]?
target => "geoip"?
database => "/Users/yangyi/logstash-2.4.1/bin/GeoLiteCity.dat"?
add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]?
add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}"]?
}?
mutate {?
add_field=>{"region" => "%{[geoip][city_name]}"}?
add_field=>{"coordinates" => "%{[geoip][coordinates]}"}?
add_field=>{"x" => "%{[geoip][longitude]}"}?
add_field=>{"y" => "%{[geoip][latitude]}"}?
convert => [ "x", "float" ]?
convert => [ "y", "float" ]?
#convert => [ "coordinates", "float" ]?
}?
ruby{?
code => "?
md = event.get('accesstime')?
event.set('dt',DateTime.strptime(md,'%d/%b/%Y:%H:%M:%S').strftime('%Y%m%d'))?
"?
}?
}output {?
datahub {?
access_id => "輸入您的access_id"?
access_key => "輸入您的access_key"?
endpoint => "需要根據(jù)自己的網(wǎng)絡(luò)情況輸入對應(yīng)的endpoint"?
project_name => "輸入您的DataHub Project名稱"?
topic_name => "輸入您對應(yīng)的DataHub Topic"?
#shard_id => "0"?
#shard_keys => ["thread_id"]?
dirty_data_continue => true?
dirty_data_file => "/Users/yangyi/logstash-2.4.1/sample/dirty.data"?
dirty_data_file_max_size => 1000?
}?
}?
配置文件為coolshell_log.conf。具體DataHub Topic信息可詳見 數(shù)據(jù)存儲 章節(jié)。
步驟7啟動(dòng)任務(wù)示例如下:
bin/logstash -f sample/coolshell_log.conf
【數(shù)據(jù)表創(chuàng)建】
附RDS創(chuàng)建表DDL:
---創(chuàng)建adm_refer_info---?
CREATE TABLE IF NOT EXISTS adm_refer_info(referer VARCHAR(32) PRIMARY KEY, referer_count BIGINT);--創(chuàng)建adm_user_measures--?
CREATE TABLE IF NOT EXISTS adm_user_measures(device VARCHAR(32) PRIMARY KEY, pv BIGINT,uv BIGINT);--創(chuàng)建adm_region_measures --?
CREATE TABLE `adm_region_measures` (?
`region` varchar(32) NOT NULL,?
`region_cnt` bigint(20) DEFAULT NULL,?
PRIMARY KEY (`region`)?
)--創(chuàng)建adm_region_measures --?
CREATE TABLE `adm_region_measures` (?
`region` varchar(32) NOT NULL,?
`region_cnt` bigint(20) DEFAULT NULL,?
PRIMARY KEY (`region`)?
)--創(chuàng)建flyingline_coordinates --?
CREATE TABLE `flyingline_coordinates` (?
`city_name` varchar(32) DEFAULT NULL,?
`coordinates` varchar(50) DEFAULT NULL,?
`x` double DEFAULT NULL,?
`y` double DEFAULT NULL?
)
【流式數(shù)據(jù)處理】
注冊數(shù)據(jù)存儲包括DataHub和RDS:
按照數(shù)據(jù)鏈路圖中來編寫處理邏輯(附核心代碼):
【處理邏輯1】
INSERT INTO coolshell_log_detail SELECT?
ip,?
accesstime,?
method,?
url,?
protocol,?
status,?
byte_cnt,?
regexp_extract(referer, '^[^/]+://([^/]+){1}') as referer,?
agent,?
CASE?
WHEN TOLOWER(agent) RLIKE 'android' THEN 'android'?
WHEN TOLOWER(agent) RLIKE 'iphone' THEN 'iphone'?
WHEN TOLOWER(agent) RLIKE 'ipad' THEN 'ipad'?
WHEN TOLOWER(agent) RLIKE 'macintosh' THEN 'macintosh'?
WHEN TOLOWER(agent) RLIKE 'windows phone' THEN 'windows_phone'?
WHEN TOLOWER(agent) RLIKE 'windows' THEN 'windows_pc'?
ELSE 'unknown'?
END AS device,?
CASE?
WHEN TOLOWER(agent) RLIKE '(bot|spider|crawler|slurp)' THEN 'crawler'?
WHEN TOLOWER(agent) RLIKE 'feed'?
OR url RLIKE 'feed' THEN 'feed'?
WHEN TOLOWER(agent) NOT RLIKE '(bot|spider|crawler|feed|slurp)'?
AND agent RLIKE '^[Mozilla|Opera]'?
AND url NOT RLIKE 'feed' THEN 'user'?
ELSE 'unknown'?
END AS identity?
FROM coolshell_log_tracker?
WHERE url NOT LIKE '^[/]+wp-';?
【處理邏輯2】
INSERT INTO coolshell_log_fact select?
md5(concat(ip, device, protocol, identity, agent)),--根據(jù)ip、device、protocol、identity和agent字段可以唯一確定uid?
ip,?
accesstime,?
method,?
url,?
protocol,?
status,?
byte_cnt,?
referer,?
agent,?
device,?
identity?
FROM coolshell_log_detail;?
【處理邏輯3、4、5、6】
---adm_refer_info中的處理邏輯---?
REPLACE INTO adm_refer_info SELECT?
referer,?
COUNT(referer) as referer_count?
FROM coolshell_log_fact?
WHERE LENGTHqi(referer) > 1?
GROUP BY referer;?
--adm_user_measures中的處理邏輯---?
REPLACE INTO adm_user_measures SELECT?
device,?
COUNT(uid) as pv,?
COUNT(distinct uid) as uv?
FROM coolshell_log_fact?
GROUP BY device;附錄:adm_region_measures和flyingline_coordinates處理邏輯?
REPLACE INTO adm_region_measures SELECT?
CASE?
WHEN region='%{[geoip][city_name]}' THEN 'unknown'?
WHEN region!='%{[geoip][city_name]}' THEN region?
END AS region,?
count(region) FROM coolshell_log_tracker_bak?
GROUP BY region;INSERT INTO flyingline_coordinates?
SELECT CASE?
WHEN region='%{[geoip][city_name]}' THEN 'unknown'?
WHEN region!='%{[geoip][city_name]}' THEN region?
END AS region,?
coordinates,x,y FROM coolshell_log_tracker_bak where coordinates is NOT NULL;
【上線Stream SQL】
上線任務(wù)后需要對任務(wù)進(jìn)行啟動(dòng):
【創(chuàng)建大屏】
現(xiàn)在DataV中創(chuàng)建RDS數(shù)據(jù)源:
然后根據(jù)如下拖拽如組件配置簡單的sql:
本文主要講述了實(shí)時(shí)場景的鏈路,后續(xù)也會將日志歸檔到MaxCompute然后通過Quick BI進(jìn)行報(bào)表分析。敬請期待!
最后給大家推薦一個(gè)在線的正則debug工具:http://grokdebug.herokuapp.com/
以上是【Best Practice】基于阿里云數(shù)加·StreamCompute快速構(gòu)建網(wǎng)站日志實(shí)時(shí)分析大屏的內(nèi)容,