網站日志分析項目案例(一)項目介紹: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中的分析結果表來開發關鍵指標查詢系統,供網站運營決策者進行查看和分析。