1.概要
到這一步,若是按照前面到文章一步走來,不出意外,我想hadoop平臺環境應該搭建OK了。下面我以自己工作中實際的案例來梳理一下整個流程。同時參考一些其他的文章來分析,由於很多網站的日誌KPI都大同小異,故有些指標直接在文中贅述了。
2.流程
- 背景
- 前言
- 目錄
- 日誌分析概述
- 需求分析
- 原始碼
2.1 背景
從2011年開始,中國進入大資料時代如火如荼,以Hadoop為代表的套件,佔據了大資料處理的廣闊地盤。開源界及廠商,所有資料軟體,紛紛向Hadoop靠攏。Hadoop也從小規模的試點和使用,變成了大資料開發的標準。在Hadoop原有技術基礎之上,出現了Hadoop家族產品,通過大資料概念的不斷創新,推進了Hadoop的發展速度。
如今,Hadoop2.x的出現,使很多企業紛紛主動去接受Hadoop這個平臺,因此,作為IT界的開發人員,瞭解並掌握Hadoop的技能,成為開發人員必備的一項技能。也是今後主流的一種趨勢。
注:Hadoop2.x的出現為何引起這麼大大反響,這裡不做贅述。
2.2 前言
Web日誌包含著網站最重要的資訊,通過日誌分析,我們可以知道網站的訪問量,哪個網頁訪問人數最多,哪個網頁最有價值等。一般中型的網站(10w的PV以上),每天會產生1G以上的Web日誌檔案。大型或超大型的網站,可能每小時就產生10G的資料量。
對於日誌的這種規模的資料,用Hadoop進行日誌分析,是最合適不過了。
2.3 目錄
- Web日誌分析概述
- 需求分析:KPI指標設計
- 演算法模型:Hadoop並行演算法
- 架構設計:日誌KPI系統架構
- 專案構建:Maven構建Hadoop專案
2.4 Web日誌分析概述
Web日誌由Web伺服器產生,可能是Nginx,Apache,Tomcat等。從Web日誌中,我們可以獲取網站每類頁面的PV值、獨立IP數;稍微複雜一些的,可以計算得出使用者所檢索的關鍵詞排行榜、使用者停留時間最高的頁面等;更復雜的,構建廣告點選模型、分析使用者行為特徵等等。
Web日誌中,每條日誌通常代表著使用者的一次訪問行為,例如下面就是一條Nginx日誌:
222.68.172.190 - - [18/Sep/2013:06:49:57 +0000] "GET /images/my.jpg HTTP/1.1" 200 19939 "http://www.angularjs.cn/A00n" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36"
我們可以從中獲取8個指標:
-
Remote_Addr:記錄客戶端的IP地址,222.68.172.190
-
Remote_User:記錄客戶端使用者名稱稱,-
-
Time_Local:記錄訪問時間與時區:[18/Sep/2013:06:49:57 +0000]
-
Request:記錄請求的URL和HTTP協議,"GET /images/my.jpg HTTP/1.1"
-
Status:記錄請求狀態,成功是200,200
-
Body_Bytes_Sent:記錄傳送給客戶端檔案主體內容大小,19939
-
Http_Referer:用來記錄從哪個頁面連結訪問過來的,http://www.angularjs.cn/A00n
-
Http_User_Agent:記錄客戶端瀏覽器的相關資訊,"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36"
注:要更多的資訊,則需要其它手段去獲取,通過javascript程式碼單獨傳送請求,使用cookies記錄使用者訪問資訊。利用這些日誌資訊,我們可以深入挖掘網站的祕密了。
少量資料的情況:
少量資料的情況(10M,100M,1G),在單機處理尚能接受的時候,我們可以直接利用各種Unix/Linux工具,awk、grep、sort、join等都是日誌分析的利器,再配合perl,python,正規表示式,基本就可以解決所有的問題。 例如,我們想從上面提到的Nginx日誌中得到訪問量最高前10個IP,實現很簡單:
~ cat access.log.10 | awk '{a[$1]++} END {for(b in a) print b"\t"a[b]}' | sort -k2 -r | head -n 10
結果如果下:
163.177.71.12 972 101.226.68.137 972 183.195.232.138 971 50.116.27.194 97 14.17.29.86 96 61.135.216.104 94 61.135.216.105 91 61.186.190.41 9 59.39.192.108 9 220.181.51.212 9
資料海量的情況:
當資料量每天以10G、100G增長的時候,單機處理能力已經不能滿足需求。我們就需要增加系統的複雜性,用計算機叢集,儲存陣列來解決。在Hadoop出現之前,海量資料儲存和海量日誌分析都是很困難的,只有少數公司,掌握著高效的平行計算,分散式計算,分散式儲存的核心技術。 Hadoop的出現,大幅度的降低了海量資料處理的門檻,讓小公司甚至是個人都能夠處理海量資料。並且,Hadoop非常適用於日誌分析系統。
2.5 KPI指標設計
下面我們將從一個公司案例出發來全面的詮釋,如何進行海量Web日誌分析,提前KPI資料。
2.5.1 案例介紹
某電商網站,線上團購業務。每日PV數100w,獨立IP數5w;使用者通常在工作日上午10:00-12:00和下午15:00-18:00訪問量最大;日間主要是通過PC端瀏覽器訪問,休息日及夜間通過移動裝置訪問最多。網站搜尋流量佔整個網站的80%,PC使用者不足1%的使用者會消費,移動使用者有5%會消費。
通過簡短的描述,我們可以粗略的看出這家電商網站的經營狀況,並認識到願意消費的使用者是從哪裡來,有哪些潛在的使用者可以挖掘,網站是否存在倒閉風險等。
2.5.2 KPI指標設計
- PV:頁面訪問量統計
- IP:頁面獨立IP訪問量統計
- Time:使用者每小時PV統計
- Source:使用者來源域名的統計
- Browser:使用者的訪問裝置統計
注:很遺憾,由於商業原因,無法提供電商網站的日誌。這裡我取的是某論壇的日誌分析,原理都是一樣的,指標也類似。
2.6 專案構建
這裡Hadoop的專案,我們採用Maven結構來構建專案,這樣能夠保證整個專案的清爽,對依賴包能夠統一的進行管理,在專案的打包和釋出上也是大有裨益。
注:如何建立Maven專案這裡不做贅述,可以自行查詢相應的資料。
3.實現
指標我們已經分析的很明確了,下面我們來考慮如何實現這些指標,以及實現這些指標需要用到那些技術,下面我畫了一個實現的流程圖:
由於是在Retina屏下擷取的,所以解析度會有點高,若網路有故障,估計圖會展示不了,因而,下面我也用文字描述一下整個流程。
首先我們需要獲取這些日誌檔案,獲取的方式有多種,這裡我們只列出了比較工作中使用的2種方式,少量的日誌可以直接使用指令碼上傳到HDFS,海量日誌可以使用Flume進行上傳到HDFS,然後我們將上傳在HDFS到日誌進行清洗(按指標清洗,去掉一些異常資料),將清洗後到資料重定向到新的HDFS目錄中,接下來我們可以按指標來進行統計結果,統計的方式,這裡我也列出了工作中使用的2種方式,一種是編寫MR任務進行統計,另一種是使用hive來統計,最後將統計的結果使用sqoop匯出到mysql或是oracle中儲存(明晰儲存在HBase中)。到這裡整理工作就算是結束,至於如何使用統計出來的資料,這裡不是我們所考慮的範圍。
4.原始碼
關於原始碼,目前有些部分程式碼要從原始碼中分離出來,到時候我會把這個日誌分析系統專案的程式碼放在Github上,整理完後連結到時候會放在這片博文的下面。另外有什麼問題可以加群諮詢,或發郵件給我,我會盡我所能給予幫助。與君共勉!