網站日誌分析專案案例(一)專案介紹:http://www.cnblogs.com/edisonchou/p/4449082.html
網站日誌分析專案案例(二)資料清洗:http://www.cnblogs.com/edisonchou/p/4458219.html
網站日誌分析專案案例(三)統計分析:當前頁面
一、藉助Hive進行統計
1.1 準備工作:建立分割槽表
為了能夠藉助Hive進行統計分析,首先我們需要將清洗後的資料存入Hive中,那麼我們需要先建立一張表。這裡我們選擇分割槽表,以日期作為分割槽的指標,建表語句如下:(這裡關鍵之處就在於確定對映的HDFS位置,我這裡是/project/techbbs/cleaned即清洗後的資料存放的位置)
hive>CREATE EXTERNAL TABLE techbbs(ip string, atime string, url string) PARTITIONED BY (logdate string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LOCATION '/project/techbbs/cleaned';
建立了分割槽表之後,就需要增加一個分割槽,增加分割槽的語句如下:(這裡主要針對20150425這一天的日誌進行分割槽)
hive>ALTER TABLE techbbs ADD PARTITION(logdate='2015_04_25') LOCATION '/project/techbbs/cleaned/2015_04_25';
有關分割槽表的詳細介紹此處不再贅述,如有不明白之處可以參考本筆記系列之17-Hive框架學習一文。
1.2 使用HQL統計關鍵指標
(1)關鍵指標之一:PV量
頁面瀏覽量即為PV(Page View),是指所有使用者瀏覽頁面的總和,一個獨立使用者每開啟一個頁面就被記錄1 次。這裡,我們只需要統計日誌中的記錄個數即可,HQL程式碼如下:
hive>CREATE TABLE techbbs_pv_2015_04_25 AS SELECT COUNT(1) AS PV FROM techbbs WHERE logdate='2015_04_25';
(2)關鍵指標之二:註冊使用者數
該論壇的使用者註冊頁面為member.php,而當使用者點選註冊時請求的又是member.php?mod=register的url。因此,這裡我們只需要統計出日誌中訪問的URL是member.php?mod=register的即可,HQL程式碼如下:
hive>CREATE TABLE techbbs_reguser_2015_04_25 AS SELECT COUNT(1) AS REGUSER FROM techbbs WHERE logdate='2015_04_25' AND INSTR(url,'member.php?mod=register')>0;
(3)關鍵指標之三:獨立IP數
一天之內,訪問網站的不同獨立 IP 個數加和。其中同一IP無論訪問了幾個頁面,獨立IP 數均為1。因此,這裡我們只需要統計日誌中處理的獨立IP數即可,在SQL中我們可以通過DISTINCT關鍵字,在HQL中也是通過這個關鍵字:
hive>CREATE TABLE techbbs_ip_2015_04_25 AS SELECT COUNT(DISTINCT ip) AS IP FROM techbbs WHERE logdate='2015_04_25';
(4)關鍵指標之四:跳出使用者數
只瀏覽了一個頁面便離開了網站的訪問次數,即只瀏覽了一個頁面便不再訪問的訪問次數。這裡,我們可以通過使用者的IP進行分組,如果分組後的記錄數只有一條,那麼即為跳出使用者。將這些使用者的數量相加,就得出了跳出使用者數,HQL程式碼如下:
hive>CREATE TABLE techbbs_jumper_2015_04_25 AS SELECT COUNT(1) AS jumper FROM (SELECT COUNT(ip) AS times FROM techbbs WHERE logdate='2015_04_25' GROUP BY ip HAVING times=1) e;
PS:跳出率是指只瀏覽了一個頁面便離開了網站的訪問次數佔總的訪問次數的百分比,即只瀏覽了一個頁面的訪問次數 / 全部的訪問次數彙總。這裡,我們可以將這裡得出的跳出使用者數/PV數即可得到跳出率。
(5)將所有關鍵指標放入一張彙總表中以便於通過Sqoop匯出到MySQL
為了方便通過Sqoop統一匯出到MySQL,這裡我們藉助一張彙總表將剛剛統計到的結果整合起來,通過表連線結合,HQL程式碼如下:
hive>CREATE TABLE techbbs_2015_04_25 AS SELECT '2015_04_25', a.pv, b.reguser, c.ip, d.jumper FROM techbbs_pv_2015_04_25 a JOIN techbbs_reguser_2015_04_25 b ON 1=1 JOIN techbbs_ip_2015_04_25 c ON 1=1 JOIN techbbs_jumper_2015_04_25 d ON 1=1;
二、使用Sqoop匯入到MySQL
2.1 準備工作:在MySQL中建立結果彙總表
(1)Step1:建立一個新資料庫:techbbs
mysql> create database techbbs;
Query OK, 1 row affected (0.00 sec)
(2)Step2:建立一張新資料表:techbbs_logs_stat
mysql> create table techbbs_logs_stat(
-> logdate varchar(10) primary key,
-> pv int,
-> reguser int,
-> ip int,
-> jumper int);
Query OK, 0 rows affected (0.01 sec)
2.2 匯入操作:通過export命令
(1)Step1:編寫匯出命令
sqoop export --connect jdbc:mysql://hadoop-master:3306/techbbs --username root --password admin --table techbbs_logs_stat --fields-terminated-by '\001' --export-dir '/hive/techbbs_2015_04_25'
這裡的--export-dir是指定的hive目錄下的彙總表所在位置,我這裡是/hive/techbbs_2015_04_25。
(2)Step2:檢視匯出結果
三、改寫Linux定時任務
剛剛我們已經藉助Hive進行了關鍵指標的統計分析,並且藉助Sqoop匯出到了MySQL,後續可以藉助JSP或者ASP.NET開發指標瀏覽介面供決策者進行瀏覽分析。但是剛剛這些操作都是我們自己手工操作的,我們需要實現自動化的統計分析並匯出,於是我們改寫前一篇中提到的定時任務指令碼檔案。
3.1 加入分割槽、統計與匯出操作
重寫techbbs_core.sh檔案,內容如下,step4~step8為新增內容:
#!/bin/sh ...... #step4.alter hive table and then add partition hive -e "ALTER TABLE techbbs ADD PARTITION(logdate='${yesterday}') LOCATION '/project/techbbs/cleaned/${yesterday}';" #step5.create hive table everyday hive -e "CREATE TABLE hmbbs_pv_${yesterday} AS SELECT COUNT(1) AS PV FROM hmbbs WHERE logdate='${yesterday}';" hive -e "CREATE TABLE hmbbs_reguser_${yesterday} AS SELECT COUNT(1) AS REGUSER FROM hmbbs WHERE logdate='${yesterday}' AND INSTR(url,'member.php?mod=register')>0;" hive -e "CREATE TABLE hmbbs_ip_${yesterday} AS SELECT COUNT(DISTINCT ip) AS IP FROM hmbbs WHERE logdate='${yesterday}';" hive -e "CREATE TABLE hmbbs_jumper_${yesterday} AS SELECT COUNT(1) AS jumper FROM (SELECT COUNT(ip) AS times FROM hmbbs WHERE logdate='${yesterday}' GROUP BY ip HAVING times=1) e;" hive -e "CREATE TABLE hmbbs_${yesterday} AS SELECT '${yesterday}', a.pv, b.reguser, c.ip, d.jumper FROM hmbbs_pv_${yesterday} a JOIN hmbbs_reguser_${yesterday} b ON 1=1 JOIN hmbbs_ip_${yesterday} c ON 1=1 JOIN hmbbs_jumper_${yesterday} d ON 1=1;" #step6.delete hive tables hive -e "drop table hmbbs_pv_${yesterday};" hive -e "drop table hmbbs_reguser_${yesterday};" hive -e "drop table hmbbs_ip_${yesterday};" hive -e "drop table hmbbs_jumper_${yesterday};" #step7.export to mysql sqoop export --connect jdbc:mysql://hadoop-master:3306/techbbs --username root --password admin --table techbbs_logs_stat --fields-terminated-by '\001' --export-dir '/hive/hmbbs_${yesterday}' #step8.delete hive table hive -e "drop table techbbs_${yesterday};"
3.2 分離日期獲取操作
(1)改寫techbbs_core.sh指令碼檔案:
#!/bin/sh #step1.get yesterday format string #yesterday=`date --date='1 days ago' +%Y_%m_%d` yesterday=$1
這裡將日期字串作為引數傳入,將該步驟轉移到了其他指令碼檔案中;
(2)新增techbbs_daily.sh指令碼檔案:
#!/bin/sh yesterday=`date --date='1 days ago' +%Y_%m_%d` hmbbs_core.sh $yesterday
這裡獲取日期並作為引數傳遞給techbbs_core.sh檔案;
(3)改寫crontab定時任務配置:crontab -e
* 1 * * * /usr/local/files/apache_logs/techbbs_daily.sh
這裡每天凌晨1點自動執行的就變為techbbs_daily.sh指令碼檔案了;從此,我們只需定期檢視mysql資料庫中的彙總結果表進行瀏覽即可;
3.3 初始化任務操作
當一個網站已經生成了很多天的日誌,而我們的日誌分析系統卻一直沒上線,一直等到了某天才上線。這時,我們需要寫一個初始化指令碼任務,來對之前的每天的日誌進行統計分析與匯出結果。這裡,我們新增一個techbbs_init.sh指令碼檔案,內容如下:
#!/bin/sh #step1.create external table in hive hive -e "CREATE EXTERNAL TABLE techbbs(ip string, atime string, url string) PARTITIONED BY (logdate string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LOCATION '/project/techbbs/cleaned';" #step2.compute the days between start date and end date s1=`date --date="$1" +%s` s2=`date +%s` s3=$((($s2-$s1)/3600/24)) #step3.excute techbbs_core.sh $3 times for ((i=$s3; i>0; i--)) do logdate=`date --date="$i days ago" +%Y_%m_%d` techbbs_core.sh $logdate done
四、小結
通過三部分的介紹,該網站的日誌分析工作基本完成,當然還有很多沒有完成的東西,但是大體上的思路已經明瞭,後續的工作只需要在此基礎上稍加分析即可完成。當然,我們還可以通過JSP或ASP.NET讀取MySQL或HBase中的分析結果表來開發關鍵指標查詢系統,供網站運營決策者進行檢視和分析。