網站日誌分析項目案例(一)項目介紹:http://www.cnblogs.com/edisonchou/p/4449082.htmlphp
網站日誌分析項目案例(二)數據清洗:http://www.cnblogs.com/edisonchou/p/4458219.htmlhtml
網站日誌分析項目案例(三)統計分析:當前頁面mysql
爲了可以藉助Hive進行統計分析,首先咱們須要將清洗後的數據存入Hive中,那麼咱們須要先創建一張表。這裏咱們選擇分區表,以日期做爲分區的指標,建表語句以下:(這裏關鍵之處就在於肯定映射的HDFS位置,我這裏是/project/techbbs/cleaned即清洗後的數據存放的位置)sql
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這一天的日誌進行分區)apache
hive>ALTER TABLE techbbs ADD PARTITION(logdate='2015_04_25') LOCATION '/project/techbbs/cleaned/2015_04_25'; 框架
有關分區表的詳細介紹此處再也不贅述,若有不明白之處能夠參考本筆記系列之17-Hive框架學習一文。oop
(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;
(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)
(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:查看導出結果
剛剛咱們已經藉助Hive進行了關鍵指標的統計分析,而且藉助Sqoop導出到了MySQL,後續能夠藉助JSP或者ASP.NET開發指標瀏覽界面供決策者進行瀏覽分析。可是剛剛這些操做都是咱們本身手工操做的,咱們須要實現自動化的統計分析並導出,因而咱們改寫前一篇中提到的定時任務腳本文件。
重寫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};"
(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數據庫中的彙總結果表進行瀏覽便可;
當一個網站已經生成了不少天的日誌,而咱們的日誌分析系統卻一直沒上線,一直等到了某天才上線。這時,咱們須要寫一個初始化腳本任務,來對以前的天天的日誌進行統計分析與導出結果。這裏,咱們新增一個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中的分析結果表來開發關鍵指標查詢系統,供網站運營決策者進行查看和分析。