大資料Web日誌分析 用Hadoop統計KPI指標例項
問題:
1.MapReduce在日誌分析的作用
思考:
該如何架構kpi系統,需要考慮什麼問題。
kpi:關鍵績效指標法,即KPI績效考核,是企業績效考核的方法之一,其特點是考核指標圍繞關鍵成果領域進行選取,均對關鍵績效指標考核法的應用及其特點有所介紹。 前言
Web日誌包含著網站最重要的資訊,通過日誌分析,我們可以知道網站的訪問量,哪個網頁訪問人數最多,哪個網頁最有價值等。一般中型的網站(10W的PV以上),每天會產生1G以上Web日誌檔案。大型或超大型的網站,可能每小時就會產生10G的資料量。
對於日誌的這種規模的資料,用Hadoop進行日誌分析,是最適合不過的了。
目錄
- Web日誌分析概述
- 需求分析:KPI指標設計
- 演算法模型:Hadoop並行演算法
- 架構設計:日誌KPI系統架構
- 程式開發1:用Maven構建Hadoop專案
-
程式開發2:MapReduce程式實現
在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"
- 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_user_agent: 記錄客戶瀏覽器的相關資訊, “Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36″
利用這些日誌資訊,我們可以深入挖掘網站的祕密了。
少量資料的情況
少量資料的情況(10Mb,100Mb,10G),在單機處理尚能忍受的時候,我可以直接利用各種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.需求分析:KPI指標設計下面我們將從一個公司案例出發來全面的解釋,如何用進行海量Web日誌分析,提取KPI資料。
案例介紹
某電子商務網站,在線團購業務。每日PV數100w,獨立IP數5w。使用者通常在工作日上午10:00-12:00和下午15:00-18:00訪問量最大。日間主要是通過PC端瀏覽器訪問,休息日及夜間通過移動裝置訪問較多。網站搜尋瀏量佔整個網站的80%,PC使用者不足1%的使用者會消費,移動使用者有5%會消費。
通過簡短的描述,我們可以粗略地看出,這家電商網站的經營狀況,並認識到願意消費的使用者從哪裡來,有哪些潛在的使用者可以挖掘,網站是否存在倒閉風險等。
KPI指標設計
- PV(PageView): 頁面訪問量統計
- IP: 頁面獨立IP的訪問量統計
- Time: 使用者每小時PV的統計
- Source: 使用者來源域名的統計
-
Browser: 使用者的訪問裝置統計
3.演算法模型:Hadoop並行演算法基本統計指標:
使用者的訪問裝置統計指標:
從商業的角度,個人網站的特徵與電商網站不太一樣,沒有轉化率,同時跳出率也比較高。從技術的角度,同樣都關注KPI指標設計。
3.演算法模型:Hadoop並行演算法
並行演算法的設計:
注:找到第一節有定義的8個變數
PV(PageView): 頁面訪問量統計
- Map過程{key:$request,value:1}
-
Reduce過程{key:$request,value:求和(sum)}
- Map: {key:$request,value:$remote_addr}
-
Reduce: {key:$request,value:去重再求和(sum(unique))}
- Map: {key:$time_local,value:1}
-
Reduce: {key:$time_local,value:求和(sum)}
- Map: {key:$http_referer,value:1}
-
Reduce: {key:$http_referer,value:求和(sum)}
- Map: {key:$http_user_agent,value:1}
-
Reduce: {key:$http_user_agent,value:求和(sum)}
上圖中,左邊是Application業務系統,右邊是Hadoop的HDFS, MapReduce。
- 日誌是由業務系統產生的,我們可以設定web伺服器每天產生一個新的目錄,目錄下面會產生多個日誌檔案,每個日誌檔案64M。
- 設定系統定時器CRON,夜間在0點後,向HDFS匯入昨天的日誌檔案。
- 完成匯入後,設定系統定時器,啟動MapReduce程式,提取並計算統計指標。
-
完成計算後,設定系統定時器,從HDFS匯出統計指標資料到資料庫,方便以後的即使查詢。
上面這幅圖,我們可以看得更清楚,資料是如何流動的。藍色背景的部分是在Hadoop中的,接下來我們的任務就是完成MapReduce的程式實現。
5.程式開發1:用Maven構建Hadoop專案請參考文章: 用Maven構建Hadoop專案
win7的開發環境 和 Hadoop的執行環境 ,在上面文章中已經介紹過了。
我們需要放日誌檔案,上傳的HDFS裡/user/hdfs/log_kpi/目錄,參考下面的命令操作
-
~ hadoop fs -mkdir /user/hdfs/log_kpi
- ~ hadoop fs -copyFromLocal /home/conan/datafiles/access.log.10 /user/hdfs/log_kpi/
-
https://github.com/bsspirit/maven_hadoop_template/releases/tag/kpi_v1
- 對日誌行的解析
- Map函式實現
- Reduce函式實現
-
啟動程式實現
新建檔案:org.conan.myhadoop.mr.kpi.KPI.java
-
package org.conan.myhadoop.mr.kpi;
-
import java.text.ParseException;
-
import java.text.SimpleDateFormat;
-
import java.util.Date;
-
import java.util.Locale;
-
/*
-
* KPI Object
-
*/
-
public class KPI {
-
private String remote_addr;// 記錄客戶端的ip地址
-
private String remote_user;// 記錄客戶端使用者名稱稱,忽略屬性"-"
-
private String time_local;// 記錄訪問時間與時區
-
private String request;// 記錄請求的url與http協議
-
private String status;// 記錄請求狀態;成功是200
-
private String body_bytes_sent;// 記錄傳送給客戶端檔案主體內容大小
-
private String http_referer;// 用來記錄從那個頁面連結訪問過來的
-
private String http_user_agent;// 記錄客戶瀏覽器的相關資訊
-
private boolean valid = true;// 判斷資料是否合法
-
@Override
-
public String toString() {
-
StringBuilder sb = new StringBuilder();
-
sb.append("valid:" + this.valid);
-
sb.append("\nremote_addr:" + this.remote_addr);
-
sb.append("\nremote_user:" + this.remote_user);
-
sb.append("\ntime_local:" + this.time_local);
-
sb.append("\nrequest:" + this.request);
-
sb.append("\nstatus:" + this.status);
-
sb.append("\nbody_bytes_sent:" + this.body_bytes_sent);
-
sb.append("\nhttp_referer:" + this.http_referer);
-
sb.append("\nhttp_user_agent:" + this.http_user_agent);
-
return sb.toString();
-
}
-
public String getRemote_addr() {
-
return remote_addr;
-
}
-
public void setRemote_addr(String remote_addr) {
-
this.remote_addr = remote_addr;
-
}
-
public String getRemote_user() {
-
return remote_user;
-
}
-
public void setRemote_user(String remote_user) {
-
this.remote_user = remote_user;
-
}
-
public String getTime_local() {
-
return time_local;
-
}
-
public Date getTime_local_Date() throws ParseException {
-
SimpleDateFormat df = new SimpleDateFormat("dd/MMM/yyyy:HH:mm:ss", Locale.US);
-
return df.parse(this.time_local);
-
}
-
public String getTime_local_Date_hour() throws ParseException{
-
SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHH");
-
return df.format(this.getTime_local_Date());
-
}
-
public void setTime_local(String time_local) {
-
this.time_local = time_local;
-
}
-
public String getRequest() {
-
return request;
-
}
-
public void setRequest(String request) {
-
this.request = request;
-
}
-
public String getStatus() {
-
return status;
-
}
-
public void setStatus(String status) {
-
this.status = status;
-
}
-
public String getBody_bytes_sent() {
-
return body_bytes_sent;
-
}
-
public void setBody_bytes_sent(String body_bytes_sent) {
-
this.body_bytes_sent = body_bytes_sent;
-
}
-
public String getHttp_referer() {
-
return http_referer;
-
}
-
public String getHttp_referer_domain(){
-
if(http_referer.length()<8){
-
return http_referer;
-
}
-
String str=this.http_referer.replace("\"", "").replace("http://", "").replace("https://", "");
-
return str.indexOf("/")>0?str.substring(0, str.indexOf("/")):str;
-
}
-
public void setHttp_referer(String http_referer) {
-
this.http_referer = http_referer;
-
}
-
public String getHttp_user_agent() {
-
return http_user_agent;
-
}
-
public void setHttp_user_agent(String http_user_agent) {
-
this.http_user_agent = http_user_agent;
-
}
-
public boolean isValid() {
-
return valid;
-
}
-
public void setValid(boolean valid) {
-
this.valid = valid;
-
相關推薦
大資料Web日誌分析 用Hadoop統計KPI指標例項
可以帶著下面問題來閱讀文章 問題: 1.MapReduce在日誌分析的作用 思考: 該如何架構kpi系統,需要考慮什麼問題。 kpi:關鍵績效指標法,即KPI績效考核,是企業績效考核的方法之一,其特點是考核指標圍繞關鍵成果領域進行選取,均對關鍵績效指
hadoop入門之海量Web日誌分析 用Hadoop提取KPI統計指標
轉載自:http://blog.fens.me/hadoop-mapreduce-log-kpi/ 今天學習了這一篇部落格,寫得十分好,照著這篇部落格敲了一遍。 發現幾個問題, 一是這篇部落格中採用的hadoop版本過低,如果在hadoop2.x上面跑的話,可能會出現結果檔案沒有寫入任何資料,為了解決這
大資料關鍵技術分析,Hadoop主要有哪幾個優點?
古代,人們用牛來拉重物,當一頭牛拉不動一根圓木時,他們不曾想過培育更大更壯的牛。同樣,在面對計算能力不足時,我們也應嘗試著結合使用更多的計算機系統。 Hadoop就是基於這樣的理念設計。Hadoop是一個由Apache基金會所開發的分散式系統基礎架構,計算分析處理所涉及的框架,允許多臺裝置一起工
大資料學習——日誌分析
有兩個海量日誌檔案儲存在hdfs上, 其中登陸日誌格式:user,ip,time,oper(列舉值:1為上線,2為下線); 訪問之日格式為:ip,time,url,假設登陸日誌中上下線資訊完整,切同一上下線時間段內是用的ip唯一, 計算訪問日誌中獨立user數量最多的前10個url,用MapReduc
大資料技術學習筆記之Hadoop框架基礎3-網站日誌分析及MapReduce過程詳解
一、回顧 -》Hadoop啟動方式 -》單個程序 sbin/h
大資料調錯系列之hadoop在開發工具控制檯上打印不出日誌的解決方法
(1)在windows環境上配置HADOOP_HOME環境變數 (2)在eclipse上執行程式 (3)注意:如果eclipse打印不出日誌,在控制檯上只顯示 1.log4j:WARN No appenders could be found 
大資料專案實戰之新聞話題統計分析
前言:本文是一個完整的大資料專案實戰,實時|離線統計分析使用者的搜尋話題,並用JavaEE工程前端介面展示出來。這些指標對網站的精準營銷、運營都有極大幫助。架構大致是按照企業標準來的,從日誌的採集、轉化處理、實時計算、JAVA後臺開發、WEB前端展示,一條完整流程線下來,甚至每個節點都用的高可用架構
大資料實戰:基於Spark SQL統計分析函式求分組TopN
做大資料分析時,經常遇到求分組TopN的問題,如:求每一學科成績前5的學生;求今日頭條各個領域指數Top 30%的頭條號等等。Spark SQL提供了四個排名相關的統計分析函式: dense_rank() 返回分割槽內每一行的排名,排名是連續的。 rank() 返回分割槽
Python+MySQL實現web日誌分析
日誌分析 性能分析 故障分析 python日誌分析 python+mongodb日誌分析 (本文已不再同步更新,最新代碼請見github)日誌分析在web系統中故障排查、性能分析方面有著非常重要的作用。目前,開源的ELK系統是成熟且功能強大的選擇。但是部署及學習成本亦然不低,這裏我實現了一
NAS日誌分析用戶指南
日誌配置 流量 關註 name 方便 結合 col 次數 計算 摘要: NAS“日誌分析”新功能,旨在幫助用戶更好地監控文件系統資源。通過該功能,用戶可以方便地跟蹤系統性能問題,記錄文件系統上的數據操作情況,審計文件刪除等相關操作,有效監控各區域內文件系統資源大盤和明細信息
使用Spark進行搜狗日誌分析實例——統計每個小時的搜索量
360安全衛士 返回 用戶 sogo user 順序 contex 讀取文件 key 1 package sogolog 2 3 import org.apache.spark.rdd.RDD 4 import org.apache.spark.{SparkCo
大資料就業前景怎麼樣?hadoop工程師、資料探勘、資料分析師薪資多少?
近幾年來,大資料這個詞突然變得很火,不僅納入阿里巴巴、谷歌等網際網路公司的戰略規劃中,同時也在我國國務院和其他國家的政府報告中多次提及,大資料無疑成為當今網際網路世界中的新寵兒。 《大資料人才報告》顯示,目前全國的大資料人才僅46萬,未來3-5年內大資料人才的缺口將高達150萬,越來越多
大資料學習之路91-Hadoop的高可用
我們之前一直沒有配置過hadoop的高可用,今天我們就來配置一下 之前我們的namenode只要一掛,則整個hdfs叢集就完蛋。雖然我們可以通過重啟的方式來恢復,可是我們重啟好之前,我們的hdfs叢集就不能提供服務了。所以它存在單點故障問題。 我們可以設定兩臺namenode ,一臺為a
大資料入門(14)hadoop+yarn+zookeeper叢集搭建
1、右鍵clone虛擬機器,進入圖形介面,修改虛擬機器ip即可,相關環境變數配置都存在 2、叢集規劃:(必須設定主機名,配置主機名和ip的對映關係,每個檔案都需要配置對映關係) 主機名 &
大資料之(4)Hadoop生態系統體系架構及基本概念
一、基本概念 機架:HDFS叢集,由分佈在多個機架上的大量DataNode組成,不同機架之間節點通過交換機通訊,HDFS通過機架感知策略,使NameNode能夠確定每個DataNode所屬的機架ID,使用副本存放策略,來改進資料的可靠性、可用性和網路頻寬的利用率。 資料塊(blo
大資料之(3)Hadoop環境MapReduce程式驗證及hdfs常用命令
一、MapReduce驗證 本地建立一個test.txt檔案 vim test.txt 輸入一些英文句子如下: Beijing is the capital of China I love Beijing I love China 上傳test.txt
5個常用的大資料視覺化分析工具,你知道嗎?
大資料及移動網際網路時代,每一個使用移動終端的人無時無刻不在生產資料,而作為網際網路服務提供的產品來說,也在持續不斷的積累資料。資料如同人工智慧一樣,往往能表現出更為客觀、理性的一面,資料可以讓人更加直觀、清晰的認識世界,資料也可以指導人更加理智的做出決策。 而在大資料時代的今天,最有價值的商品
大資料就業前景分析的太到位了,想學習大資料的可以看看
大資料廣泛應用於電網執行、經營管理及優質服務等各大領域,並正在改變著各行各業,也引領了大資料人才的變革。大資料專業就業前景怎麼樣?這對於在就業迷途中的我們是一個很重要的資訊。 隨著國家重視大資料,政府扶持大資料,大資料在企業中生根發芽,開花結果。未來三至五年,中國需要18
大資料的主要分析模式和分析技術
大資料的主要分析模式和分析技術 大資料時代所分析的資料的最主要特徵是“多源異構”,其分析過程是逐層抽象、降維、概括和解讀的過程。從資料採集的源頭進行劃分,可將大資料時代分析處理的資料物件劃分為以下幾個類別: (1)各網頁中使用者的瀏覽次數、點選率,各種社交網站、動態網站網頁內容
55 個實用的大資料視覺化分析工具
俗話說的好:工欲善其事,必先利其器!一款好的工具可以讓你事半功倍,尤其是在大資料時代,更需要強有力的工具通過使資料有意義的方式實現資料視覺化,還有資料的可互動性;我們還需要跨學科的團隊,而不是單個數據科學家、設計師或資料分析員;我們更需要重新思考我們所知道的資料視覺化,圖表和圖形還只能在一個或兩個維