1. 程式人生 > >大資料Web日誌分析 用Hadoop統計KPI指標例項

大資料Web日誌分析 用Hadoop統計KPI指標例項

可以帶著下面問題來閱讀文章
問題:
1.MapReduce在日誌分析的作用

思考:
該如何架構kpi系統,需要考慮什麼問題。

kpi:關鍵績效指標法,即KPI績效考核,是企業績效考核的方法之一,其特點是考核指標圍繞關鍵成果領域進行選取,均對關鍵績效指標考核法的應用及其特點有所介紹。 前言
Web日誌包含著網站最重要的資訊,通過日誌分析,我們可以知道網站的訪問量,哪個網頁訪問人數最多,哪個網頁最有價值等。一般中型的網站(10W的PV以上),每天會產生1G以上Web日誌檔案。大型或超大型的網站,可能每小時就會產生10G的資料量。
對於日誌的這種規模的資料,用Hadoop進行日誌分析,是最適合不過的了。

目錄
  • Web日誌分析概述
  • 需求分析:KPI指標設計
  • 演算法模型:Hadoop並行演算法
  • 架構設計:日誌KPI系統架構
  • 程式開發1:用Maven構建Hadoop專案
  • 程式開發2:MapReduce程式實現
1. Web日誌分析概述Web日誌由Web伺服器產生,可能是Nginx, Apache, Tomcat等。從Web日誌中,我們可以獲取網站每類頁面的PV值(PageView,頁面訪問量)、獨立IP數;稍微複雜一些的,可以計算得出使用者所檢索的關鍵詞排行榜、使用者停留時間最高的頁面等;更復雜的,構建廣告點選模型、分析使用者行為特徵等等。
在Web日誌中,每條日誌通常代表著使用者的一次訪問行為,例如下面就是一條nginx日誌:
  1. 222.68.172.190 - - [18/Sep/2013:06:49:57 +0000] "GET /images/my.jpg HTTP/1.1" 200 19939
  2. "http://www.angularjs.cn/A00n" "Mozilla/5.0 (Windows NT 6.1)
  3. 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_user_agent: 記錄客戶瀏覽器的相關資訊, “Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36″
注:要更多的資訊,則要用其它手段去獲取,通過js程式碼單獨傳送請求,使用cookies記錄使用者的訪問資訊。
利用這些日誌資訊,我們可以深入挖掘網站的祕密了。
少量資料的情況
少量資料的情況(10Mb,100Mb,10G),在單機處理尚能忍受的時候,我可以直接利用各種Unix/Linux工具,awk、grep、sort、join等都是日誌分析的利器,再配合perl, python,正則表達工,基本就可以解決所有的問題。
例如,我們想從上面提到的nginx日誌中得到訪問量最高前10個IP,實現很簡單:
  1. ~ cat access.log.10 | awk '{a[$1]++} END {for(b in a) print b"\t"a[b]}' | sort -k2 -r | head -n 10
  2. 163.177.71.12   972
  3. 101.226.68.137  972
  4. 183.195.232.138 971
  5. 50.116.27.194   97
  6. 14.17.29.86     96
  7. 61.135.216.104  94
  8. 61.135.216.105  91
  9. 61.186.190.41   9
  10. 59.39.192.108   9
  11. 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)}
IP: 頁面獨立IP的訪問量統計
  • Map: {key:$request,value:$remote_addr}
  • Reduce: {key:$request,value:去重再求和(sum(unique))}
Time: 使用者每小時PV的統計
  • Map: {key:$time_local,value:1}
  • Reduce: {key:$time_local,value:求和(sum)}
Source: 使用者來源域名的統計
  • Map: {key:$http_referer,value:1}
  • Reduce: {key:$http_referer,value:求和(sum)}
Browser: 使用者的訪問裝置統計
  • Map: {key:$http_user_agent,value:1}
  • Reduce: {key:$http_user_agent,value:求和(sum)}
4.架構設計:日誌KPI系統架構   
上圖中,左邊是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/目錄,參考下面的命令操作
  1. ~ hadoop fs -mkdir /user/hdfs/log_kpi
  2. ~ hadoop fs -copyFromLocal /home/conan/datafiles/access.log.10 /user/hdfs/log_kpi/
複製程式碼 我已經把整個MapReduce的實現都放到了github上面:
  1. https://github.com/bsspirit/maven_hadoop_template/releases/tag/kpi_v1
複製程式碼 6.程式開發2:MapReduce程式實現開發流程:
  • 對日誌行的解析
  • Map函式實現
  • Reduce函式實現
  • 啟動程式實現
1). 對日誌行的解析
新建檔案:org.conan.myhadoop.mr.kpi.KPI.java
  1. package org.conan.myhadoop.mr.kpi;
  2. import java.text.ParseException;
  3. import java.text.SimpleDateFormat;
  4. import java.util.Date;
  5. import java.util.Locale;
  6. /*
  7. * KPI Object
  8. */
  9. public class KPI {
  10.     private String remote_addr;// 記錄客戶端的ip地址
  11.     private String remote_user;// 記錄客戶端使用者名稱稱,忽略屬性"-"
  12.     private String time_local;// 記錄訪問時間與時區
  13.     private String request;// 記錄請求的url與http協議
  14.     private String status;// 記錄請求狀態;成功是200
  15.     private String body_bytes_sent;// 記錄傳送給客戶端檔案主體內容大小
  16.     private String http_referer;// 用來記錄從那個頁面連結訪問過來的
  17.     private String http_user_agent;// 記錄客戶瀏覽器的相關資訊
  18.     private boolean valid = true;// 判斷資料是否合法
  19.     @Override
  20.     public String toString() {
  21.         StringBuilder sb = new StringBuilder();
  22.         sb.append("valid:" + this.valid);
  23.         sb.append("\nremote_addr:" + this.remote_addr);
  24.         sb.append("\nremote_user:" + this.remote_user);
  25.         sb.append("\ntime_local:" + this.time_local);
  26.         sb.append("\nrequest:" + this.request);
  27.         sb.append("\nstatus:" + this.status);
  28.         sb.append("\nbody_bytes_sent:" + this.body_bytes_sent);
  29.         sb.append("\nhttp_referer:" + this.http_referer);
  30.         sb.append("\nhttp_user_agent:" + this.http_user_agent);
  31.         return sb.toString();
  32.     }
  33.     public String getRemote_addr() {
  34.         return remote_addr;
  35.     }
  36.     public void setRemote_addr(String remote_addr) {
  37.         this.remote_addr = remote_addr;
  38.     }
  39.     public String getRemote_user() {
  40.         return remote_user;
  41.     }
  42.     public void setRemote_user(String remote_user) {
  43.         this.remote_user = remote_user;
  44.     }
  45.     public String getTime_local() {
  46.         return time_local;
  47.     }
  48.     public Date getTime_local_Date() throws ParseException {
  49.         SimpleDateFormat df = new SimpleDateFormat("dd/MMM/yyyy:HH:mm:ss", Locale.US);
  50.         return df.parse(this.time_local);
  51.     }
  52.     public String getTime_local_Date_hour() throws ParseException{
  53.         SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHH");
  54.         return df.format(this.getTime_local_Date());
  55.     }
  56.     public void setTime_local(String time_local) {
  57.         this.time_local = time_local;
  58.     }
  59.     public String getRequest() {
  60.         return request;
  61.     }
  62.     public void setRequest(String request) {
  63.         this.request = request;
  64.     }
  65.     public String getStatus() {
  66.         return status;
  67.     }
  68.     public void setStatus(String status) {
  69.         this.status = status;
  70.     }
  71.     public String getBody_bytes_sent() {
  72.         return body_bytes_sent;
  73.     }
  74.     public void setBody_bytes_sent(String body_bytes_sent) {
  75.         this.body_bytes_sent = body_bytes_sent;
  76.     }
  77.     public String getHttp_referer() {
  78.         return http_referer;
  79.     }
  80.     public String getHttp_referer_domain(){
  81.         if(http_referer.length()<8){ 
  82.             return http_referer;
  83.         }
  84.         String str=this.http_referer.replace("\"", "").replace("http://", "").replace("https://", "");
  85.         return str.indexOf("/")>0?str.substring(0, str.indexOf("/")):str;
  86.     }
  87.     public void setHttp_referer(String http_referer) {
  88.         this.http_referer = http_referer;
  89.     }
  90.     public String getHttp_user_agent() {
  91.         return http_user_agent;
  92.     }
  93.     public void setHttp_user_agent(String http_user_agent) {
  94.         this.http_user_agent = http_user_agent;
  95.     }
  96.     public boolean isValid() {
  97.         return valid;
  98.     }
  99.     public void setValid(boolean valid) {
  100.         this.valid = valid;
  101. 相關推薦

    資料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 個實用的資料視覺化分析工具

    俗話說的好:工欲善其事,必先利其器!一款好的工具可以讓你事半功倍,尤其是在大資料時代,更需要強有力的工具通過使資料有意義的方式實現資料視覺化,還有資料的可互動性;我們還需要跨學科的團隊,而不是單個數據科學家、設計師或資料分析員;我們更需要重新思考我們所知道的資料視覺化,圖表和圖形還只能在一個或兩個維

最近訪問

代做工资流水公司郑州公司银行流水图片肇庆查薪资银行流水郑州离职证明报价揭阳自存银行流水公司成都车贷工资流水 代做曲靖签证银行流水 代开常州流水账单公司南通做日常消费流水三亚车贷流水打印台州入职银行流水办理潮州办银行流水修改芜湖对公账户流水公司揭阳公司银行流水铜陵代做入职银行流水石家庄打印工资证明开封银行流水开具遵义代做车贷银行流水衡阳代做房贷工资流水汕头代办签证银行流水宜春工资代付流水代开郑州制作入职工资流水苏州打个人工资流水潍坊流水账单代办合肥银行流水PS打印大庆办企业对私流水岳阳薪资银行流水费用铜陵工资流水账单费用菏泽代做工资证明开封企业流水打印多少钱孝感做企业对公流水香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

代做工资流水公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化