引用鏈接地址https://www.aliyun.com/jiaocheng/19206.html?spm=5176.100033.2.5.535e1e7f5RJgf0
【Best Practice】基于阿里云數(shù)加·StreamCompute快速構(gòu)建網(wǎng)站日志實時分析大屏
摘要:前幾天在云棲社區(qū)上寫了一篇普惠性的文章,很粗偏向數(shù)據(jù)架構(gòu)層面煮甥。具體可以進(jìn)入:【數(shù)據(jù)架構(gòu)解讀】基于阿里云數(shù)加StreamCompute和MaxCompute構(gòu)建的訪問日志統(tǒng)計分析,但是在具體實操中肯定不會那么一帆風(fēng)順畸冲。為了避免大家走彎路特意先寫了一篇架構(gòu)篇,以免大家后續(xù)發(fā)現(xiàn)不適用而更改或優(yōu)化工作茉贡。本文偏向與實操層面的為大家介紹,如何基于阿里云數(shù)加StreamCompute、DataV快速構(gòu)建網(wǎng)站日志實時分析场晶÷羌冢【什么場景適合用流計算】流計算提供了針對流式數(shù)據(jù)實時分析的一站式工具鏈
前幾天在云棲社區(qū)上寫了一篇普惠性的文章,很粗偏向數(shù)據(jù)架構(gòu)層面式撼。具體可以進(jìn)入:【數(shù)據(jù)架構(gòu)解讀】基于阿里云數(shù)加StreamCompute和MaxCompute構(gòu)建的訪問日志統(tǒng)計分析,但是在具體實操中肯定不會那么一帆風(fēng)順。為了避免大家走彎路特意先寫了一篇架構(gòu)篇,以免大家后續(xù)發(fā)現(xiàn)不適用而更改或優(yōu)化工作溯警。
本文偏向與實操層面的為大家介紹,如何基于阿里云數(shù)加StreamCompute、DataV快速構(gòu)建網(wǎng)站日志實時分析狡相。
【什么場景適合用流計算】
流計算提供了針對流式數(shù)據(jù)實時分析的一站式工具鏈,對于大量流式數(shù)據(jù)存在實時分析梯轻、計算、處理的邏輯可以考慮通過流計算該任務(wù)谣光。舉例如下:
1. 針對實時營銷活動,需要實時獲取活動流量數(shù)據(jù)分析以了解活動的營銷情況,此時可以上流計算檩淋。
2. 針對物聯(lián)網(wǎng)設(shè)備監(jiān)控,需要實時獲取設(shè)備數(shù)據(jù)進(jìn)行實時災(zāi)難監(jiān)控,此時可以上流計算。
3. 對于手機(jī)APP數(shù)據(jù)實時分析,需要實時了解手機(jī)設(shè)備的各類指標(biāo)情況,此時可以上流計算
【使用前須知】
為保障本教程的順利的進(jìn)行,須知曉如下使用前提:
具備阿里云賬號(淘寶及1688帳號可直接使用會員名登錄);?
下載并安裝Logstash的DataHub Output插件萄金。?
開通DataHub/StreamCompute/AnalyticDB或RDS/DataV產(chǎn)品;
【實現(xiàn)的業(yè)務(wù)場景】
數(shù)據(jù)來源于某網(wǎng)站上的HTTP訪問日志數(shù)據(jù),基于這份網(wǎng)站日志來實現(xiàn)如下分析需求:
實時統(tǒng)計并展現(xiàn)網(wǎng)站的PV和UV,并能夠按照用戶的終端類型(如Android蟀悦、iPad、iPhone氧敢、PC等)分別統(tǒng)計日戈。?
實時統(tǒng)計并展現(xiàn)網(wǎng)站的流量來源。?
從IP中解析出region或者經(jīng)緯度在地圖上進(jìn)行展示孙乖。
【說明】瀏覽次數(shù)(PV)和獨立訪客(UV)是衡量網(wǎng)站流量的兩項最基本指標(biāo)浙炼。用戶每打開一個網(wǎng)站頁面,記錄一個PV,多次打開同一頁面PV 累計多次份氧。獨立訪客是指一天內(nèi),訪問網(wǎng)站的不重復(fù)用戶數(shù),一天內(nèi)同一訪客多次訪問網(wǎng)站只計算1 次。Referer 可以分析網(wǎng)站訪問來源,它是網(wǎng)站廣告投放評估的重要指標(biāo),還可以用于分析用戶偏好等弯屈。
【操作流程概述】
如上圖所示,紅色箭線部分為流式數(shù)據(jù)處理部分,主要拆解如下:
l?配置Logstash,將網(wǎng)站產(chǎn)生的日志實時采集至DataHub蜗帜。
l?申請開通DataHub,創(chuàng)建項目Project及Topic(DataHub服務(wù)訂閱和發(fā)布的最小單位)。
l?開通StreamCompute,創(chuà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項目進(jìn)入大屏制作。
【數(shù)據(jù)結(jié)構(gòu)設(shè)計】
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)站日志實時解析】
Logstash安裝與配置?
配置前須知
阿里云流計算為了方便用戶將更多數(shù)據(jù)采集進(jìn)入DataHub,提供了針對Logstash的DataHub Output插件。
Logstash安裝要求JRE 7版本及以上,否則部分工具無法使用娩践。
操作步驟
步驟1點擊下載Logstash 2.4.1,點擊下載活翩。
步驟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)前路徑并移動到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啟動任務(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)行啟動:
【創(chuàng)建大屏】
現(xiàn)在DataV中創(chuàng)建RDS數(shù)據(jù)源:
然后根據(jù)如下拖拽如組件配置簡單的sql:
本文主要講述了實時場景的鏈路,后續(xù)也會將日志歸檔到MaxCompute然后通過Quick BI進(jìn)行報表分析络它。敬請期待!
最后給大家推薦一個在線的正則debug工具:http://grokdebug.herokuapp.com/
以上是【Best Practice】基于阿里云數(shù)加·StreamCompute快速構(gòu)建網(wǎng)站日志實時分析大屏的內(nèi)容族檬,