日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

海量Web日志分析 用Hadoop提取KPI统计指标

發(fā)布時間:2025/7/14 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 海量Web日志分析 用Hadoop提取KPI统计指标 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

海量Web日志分析 用Hadoop提取KPI統(tǒng)計指標

Hadoop家族系列文章,主要介紹Hadoop家族產(chǎn)品,常用的項目包括Hadoop, Hive, Pig, HBase, Sqoop, Mahout, Zookeeper, Avro, Ambari, Chukwa,新增加的項目包括,YARN, Hcatalog, Oozie, Cassandra, Hama, Whirr, Flume, Bigtop, Crunch, Hue等。

從2011年開始,中國進入大數(shù)據(jù)風起云涌的時代,以Hadoop為代表的家族軟件,占據(jù)了大數(shù)據(jù)處理的廣闊地盤。開源界及廠商,所有數(shù)據(jù)軟件,無一不向Hadoop靠攏。Hadoop也從小眾的高富帥領(lǐng)域,變成了大數(shù)據(jù)開發(fā)的標準。在Hadoop原有技術(shù)基礎(chǔ)之上,出現(xiàn)了Hadoop家族產(chǎn)品,通過“大數(shù)據(jù)”概念不斷創(chuàng)新,推出科技進步。

作為IT界的開發(fā)人員,我們也要跟上節(jié)奏,抓住機遇,跟著Hadoop一起雄起!

關(guān)于作者:

  • 張丹(Conan), 程序員Java,R,PHP,Javascript
  • weibo:@Conan_Z
  • blog:?http://blog.fens.me
  • email: bsspirit@gmail.com

轉(zhuǎn)載請注明出處:
http://blog.fens.me/hadoop-mapreduce-log-kpi/

前言

Web日志包含著網(wǎng)站最重要的信息,通過日志分析,我們可以知道網(wǎng)站的訪問量,哪個網(wǎng)頁訪問人數(shù)最多,哪個網(wǎng)頁最有價值等。一般中型的網(wǎng)站(10W的PV以上),每天會產(chǎn)生1G以上Web日志文件。大型或超大型的網(wǎng)站,可能每小時就會產(chǎn)生10G的數(shù)據(jù)量。

對于日志的這種規(guī)模的數(shù)據(jù),用Hadoop進行日志分析,是最適合不過的了。

目錄

  • Web日志分析概述
  • 需求分析:KPI指標設(shè)計
  • 算法模型:Hadoop并行算法
  • 架構(gòu)設(shè)計:日志KPI系統(tǒng)架構(gòu)
  • 程序開發(fā)1:用Maven構(gòu)建Hadoop項目
  • 程序開發(fā)2:MapReduce程序?qū)崿F(xiàn)
  • 1. Web日志分析概述

    Web日志由Web服務器產(chǎn)生,可能是Nginx, Apache, Tomcat等。從Web日志中,我們可以獲取網(wǎng)站每類頁面的PV值(PageView,頁面訪問量)、獨立IP數(shù);稍微復雜一些的,可以計算得出用戶所檢索的關(guān)鍵詞排行榜、用戶停留時間最高的頁面等;更復雜的,構(gòu)建廣告點擊模型、分析用戶行為特征等等。

    在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: 記錄訪問時間與時區(qū), [18/Sep/2013:06:49:57 +0000]
    • request: 記錄請求的url與http協(xié)議, “GET /images/my.jpg HTTP/1.1″
    • status: 記錄請求狀態(tài),成功是200, 200
    • body_bytes_sent: 記錄發(fā)送給客戶端文件主體內(nèi)容大小, 19939
    • http_referer: 用來記錄從那個頁面鏈接訪問過來的, “http://www.angularjs.cn/A00n”
    • http_user_agent: 記錄客戶瀏覽器的相關(guān)信息, “Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36″

    注:要更多的信息,則要用其它手段去獲取,通過js代碼單獨發(fā)送請求,使用cookies記錄用戶的訪問信息。

    利用這些日志信息,我們可以深入挖掘網(wǎng)站的秘密了。

    少量數(shù)據(jù)的情況

    少量數(shù)據(jù)的情況(10Mb,100Mb,10G),在單機處理尚能忍受的時候,我可以直接利用各種Unix/Linux工具,awk、grep、sort、join等都是日志分析的利器,再配合perl, python,正則表達工,基本就可以解決所有的問題。

    例如,我們想從上面提到的nginx日志中得到訪問量最高前10個IP,實現(xiàn)很簡單:

    ~ 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

    海量數(shù)據(jù)的情況

    當數(shù)據(jù)量每天以10G、100G增長的時候,單機處理能力已經(jīng)不能滿足需求。我們就需要增加系統(tǒng)的復雜性,用計算機集群,存儲陣列來解決。在Hadoop出現(xiàn)之前,海量數(shù)據(jù)存儲,和海量日志分析都是非常困難的。只有少數(shù)一些公司,掌握著高效的并行計算,分步式計算,分步式存儲的核心技術(shù)。

    Hadoop的出現(xiàn),大幅度的降低了海量數(shù)據(jù)處理的門檻,讓小公司甚至是個人都能力,搞定海量數(shù)據(jù)。并且,Hadoop非常適用于日志分析系統(tǒng)。

    2.需求分析:KPI指標設(shè)計

    下面我們將從一個公司案例出發(fā)來全面的解釋,如何用進行海量Web日志分析,提取KPI數(shù)據(jù)

    案例介紹
    某電子商務網(wǎng)站,在線團購業(yè)務。每日PV數(shù)100w,獨立IP數(shù)5w。用戶通常在工作日上午10:00-12:00和下午15:00-18:00訪問量最大。日間主要是通過PC端瀏覽器訪問,休息日及夜間通過移動設(shè)備訪問較多。網(wǎng)站搜索瀏量占整個網(wǎng)站的80%,PC用戶不足1%的用戶會消費,移動用戶有5%會消費。

    通過簡短的描述,我們可以粗略地看出,這家電商網(wǎng)站的經(jīng)營狀況,并認識到愿意消費的用戶從哪里來,有哪些潛在的用戶可以挖掘,網(wǎng)站是否存在倒閉風險等。

    KPI指標設(shè)計

    • PV(PageView): 頁面訪問量統(tǒng)計
    • IP: 頁面獨立IP的訪問量統(tǒng)計
    • Time: 用戶每小時PV的統(tǒng)計
    • Source: 用戶來源域名的統(tǒng)計
    • Browser: 用戶的訪問設(shè)備統(tǒng)計

    注:商業(yè)保密限制,無法提供電商網(wǎng)站的日志。
    下面的內(nèi)容,將以我的個人網(wǎng)站為例提取數(shù)據(jù)進行分析。

    百度統(tǒng)計,對我個人網(wǎng)站做的統(tǒng)計!http://www.fens.me

    基本統(tǒng)計指標:

    用戶的訪問設(shè)備統(tǒng)計指標:

    從商業(yè)的角度,個人網(wǎng)站的特征與電商網(wǎng)站不太一樣,沒有轉(zhuǎn)化率,同時跳出率也比較高。從技術(shù)的角度,同樣都關(guān)注KPI指標設(shè)計。

    3.算法模型:Hadoop并行算法

    并行算法的設(shè)計:
    注:找到第一節(jié)有定義的8個變量

    PV(PageView): 頁面訪問量統(tǒng)計

    • Map過程{key:$request,value:1}
    • Reduce過程{key:$request,value:求和(sum)}

    IP: 頁面獨立IP的訪問量統(tǒng)計

    • Map: {key:$request,value:$remote_addr}
    • Reduce: {key:$request,value:去重再求和(sum(unique))}

    Time: 用戶每小時PV的統(tǒng)計

    • Map: {key:$time_local,value:1}
    • Reduce: {key:$time_local,value:求和(sum)}

    Source: 用戶來源域名的統(tǒng)計

    • Map: {key:$http_referer,value:1}
    • Reduce: {key:$http_referer,value:求和(sum)}

    Browser: 用戶的訪問設(shè)備統(tǒng)計

    • Map: {key:$http_user_agent,value:1}
    • Reduce: {key:$http_user_agent,value:求和(sum)}

    4.架構(gòu)設(shè)計:日志KPI系統(tǒng)架構(gòu)

    上圖中,左邊是Application業(yè)務系統(tǒng),右邊是Hadoop的HDFS, MapReduce。

  • 日志是由業(yè)務系統(tǒng)產(chǎn)生的,我們可以設(shè)置web服務器每天產(chǎn)生一個新的目錄,目錄下面會產(chǎn)生多個日志文件,每個日志文件64M。
  • 設(shè)置系統(tǒng)定時器CRON,夜間在0點后,向HDFS導入昨天的日志文件。
  • 完成導入后,設(shè)置系統(tǒng)定時器,啟動MapReduce程序,提取并計算統(tǒng)計指標。
  • 完成計算后,設(shè)置系統(tǒng)定時器,從HDFS導出統(tǒng)計指標數(shù)據(jù)到數(shù)據(jù)庫,方便以后的即使查詢。
  • 上面這幅圖,我們可以看得更清楚,數(shù)據(jù)是如何流動的。藍色背景的部分是在Hadoop中的,接下來我們的任務就是完成MapReduce的程序?qū)崿F(xiàn)。

    5.程序開發(fā)1:用Maven構(gòu)建Hadoop項目

    請參考文章:用Maven構(gòu)建Hadoop項目

    win7的開發(fā)環(huán)境 和 Hadoop的運行環(huán)境 ,在上面文章中已經(jīng)介紹過了。

    我們需要放日志文件,上傳的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/

    我已經(jīng)把整個MapReduce的實現(xiàn)都放到了github上面:

    https://github.com/bsspirit/maven_hadoop_template/releases/tag/kpi_v1

    6.程序開發(fā)2:MapReduce程序?qū)崿F(xiàn)

    開發(fā)流程:

  • 對日志行的解析
  • Map函數(shù)實現(xiàn)
  • Reduce函數(shù)實現(xiàn)
  • 啟動程序?qū)崿F(xiàn)
  • 1). 對日志行的解析
    新建文件: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;// 記錄訪問時間與時區(qū)private String request;// 記錄請求的url與http協(xié)議private String status;// 記錄請求狀態(tài);成功是200private String body_bytes_sent;// 記錄發(fā)送給客戶端文件主體內(nèi)容大小private String http_referer;// 用來記錄從那個頁面鏈接訪問過來的private String http_user_agent;// 記錄客戶瀏覽器的相關(guān)信息private boolean valid = true;// 判斷數(shù)據(jù)是否合法@Overridepublic 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;}public static void main(String args[]) {String line = "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\"";System.out.println(line);KPI kpi = new KPI();String[] arr = line.split(" ");kpi.setRemote_addr(arr[0]);kpi.setRemote_user(arr[1]);kpi.setTime_local(arr[3].substring(1));kpi.setRequest(arr[6]);kpi.setStatus(arr[8]);kpi.setBody_bytes_sent(arr[9]);kpi.setHttp_referer(arr[10]);kpi.setHttp_user_agent(arr[11] + " " + arr[12]);System.out.println(kpi);try {SimpleDateFormat df = new SimpleDateFormat("yyyy.MM.dd:HH:mm:ss", Locale.US);System.out.println(df.format(kpi.getTime_local_Date()));System.out.println(kpi.getTime_local_Date_hour());System.out.println(kpi.getHttp_referer_domain());} catch (ParseException e) {e.printStackTrace();}}}

    從日志文件中,取一行通過main函數(shù)寫一個簡單的解析測試。

    控制臺輸出:

    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" valid:true remote_addr:222.68.172.190 remote_user:- time_local:18/Sep/2013:06:49:57 request:/images/my.jpg status:200 body_bytes_sent:19939 http_referer:"http://www.angularjs.cn/A00n" http_user_agent:"Mozilla/5.0 (Windows 2013.09.18:06:49:57 2013091806 www.angularjs.cn

    我們看到日志行,被正確的解析成了kpi對象的屬性。我們把解析過程,單獨封裝成一個方法。

    private static KPI parser(String line) {System.out.println(line);KPI kpi = new KPI();String[] arr = line.split(" ");if (arr.length > 11) {kpi.setRemote_addr(arr[0]);kpi.setRemote_user(arr[1]);kpi.setTime_local(arr[3].substring(1));kpi.setRequest(arr[6]);kpi.setStatus(arr[8]);kpi.setBody_bytes_sent(arr[9]);kpi.setHttp_referer(arr[10]);if (arr.length > 12) {kpi.setHttp_user_agent(arr[11] + " " + arr[12]);} else {kpi.setHttp_user_agent(arr[11]);}if (Integer.parseInt(kpi.getStatus()) >= 400) {// 大于400,HTTP錯誤kpi.setValid(false);}} else {kpi.setValid(false);}return kpi;}

    對map方法,reduce方法,啟動方法,我們單獨寫一個類來實現(xiàn)

    下面將分別介紹MapReduce的實現(xiàn)類:

    • PV:org.conan.myhadoop.mr.kpi.KPIPV.java
    • IP: org.conan.myhadoop.mr.kpi.KPIIP.java
    • Time: org.conan.myhadoop.mr.kpi.KPITime.java
    • Browser: org.conan.myhadoop.mr.kpi.KPIBrowser.java

    1). PV:org.conan.myhadoop.mr.kpi.KPIPV.java

    package org.conan.myhadoop.mr.kpi;import java.io.IOException; import java.util.Iterator;import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapred.FileInputFormat; import org.apache.hadoop.mapred.FileOutputFormat; import org.apache.hadoop.mapred.JobClient; import org.apache.hadoop.mapred.JobConf; import org.apache.hadoop.mapred.MapReduceBase; import org.apache.hadoop.mapred.Mapper; import org.apache.hadoop.mapred.OutputCollector; import org.apache.hadoop.mapred.Reducer; import org.apache.hadoop.mapred.Reporter; import org.apache.hadoop.mapred.TextInputFormat; import org.apache.hadoop.mapred.TextOutputFormat;public class KPIPV { public static class KPIPVMapper extends MapReduceBase implements Mapper {private IntWritable one = new IntWritable(1);private Text word = new Text();@Overridepublic void map(Object key, Text value, OutputCollector output, Reporter reporter) throws IOException {KPI kpi = KPI.filterPVs(value.toString());if (kpi.isValid()) {word.set(kpi.getRequest());output.collect(word, one);}}}public static class KPIPVReducer extends MapReduceBase implements Reducer {private IntWritable result = new IntWritable();@Overridepublic void reduce(Text key, Iterator values, OutputCollector output, Reporter reporter) throws IOException {int sum = 0;while (values.hasNext()) {sum += values.next().get();}result.set(sum);output.collect(key, result);}}public static void main(String[] args) throws Exception {String input = "hdfs://192.168.1.210:9000/user/hdfs/log_kpi/";String output = "hdfs://192.168.1.210:9000/user/hdfs/log_kpi/pv";JobConf conf = new JobConf(KPIPV.class);conf.setJobName("KPIPV");conf.addResource("classpath:/hadoop/core-site.xml");conf.addResource("classpath:/hadoop/hdfs-site.xml");conf.addResource("classpath:/hadoop/mapred-site.xml");conf.setMapOutputKeyClass(Text.class);conf.setMapOutputValueClass(IntWritable.class);conf.setOutputKeyClass(Text.class);conf.setOutputValueClass(IntWritable.class);conf.setMapperClass(KPIPVMapper.class);conf.setCombinerClass(KPIPVReducer.class);conf.setReducerClass(KPIPVReducer.class);conf.setInputFormat(TextInputFormat.class);conf.setOutputFormat(TextOutputFormat.class);FileInputFormat.setInputPaths(conf, new Path(input));FileOutputFormat.setOutputPath(conf, new Path(output));JobClient.runJob(conf);System.exit(0);} }

    在程序中會調(diào)用KPI類的方法

    KPI kpi = KPI.filterPVs(value.toString());

    通過filterPVs方法,我們可以實現(xiàn)對PV,更多的控制。

    在KPK.java中,增加filterPVs方法

    /*** 按page的pv分類*/public static KPI filterPVs(String line) {KPI kpi = parser(line);Set pages = new HashSet();pages.add("/about");pages.add("/black-ip-list/");pages.add("/cassandra-clustor/");pages.add("/finance-rhive-repurchase/");pages.add("/hadoop-family-roadmap/");pages.add("/hadoop-hive-intro/");pages.add("/hadoop-zookeeper-intro/");pages.add("/hadoop-mahout-roadmap/");if (!pages.contains(kpi.getRequest())) {kpi.setValid(false);}return kpi;}

    在filterPVs方法,我們定義了一個pages的過濾,就是只對這個頁面進行PV統(tǒng)計。

    我們運行一下KPIPV.java

    2013-10-9 11:53:28 org.apache.hadoop.mapred.MapTask$MapOutputBuffer flush 信息: Starting flush of map output 2013-10-9 11:53:28 org.apache.hadoop.mapred.MapTask$MapOutputBuffer sortAndSpill 信息: Finished spill 0 2013-10-9 11:53:28 org.apache.hadoop.mapred.Task done 信息: Task:attempt_local_0001_m_000000_0 is done. And is in the process of commiting 2013-10-9 11:53:30 org.apache.hadoop.mapred.LocalJobRunner$Job statusUpdate 信息: hdfs://192.168.1.210:9000/user/hdfs/log_kpi/access.log.10:0+3025757 2013-10-9 11:53:30 org.apache.hadoop.mapred.LocalJobRunner$Job statusUpdate 信息: hdfs://192.168.1.210:9000/user/hdfs/log_kpi/access.log.10:0+3025757 2013-10-9 11:53:30 org.apache.hadoop.mapred.Task sendDone 信息: Task 'attempt_local_0001_m_000000_0' done. 2013-10-9 11:53:30 org.apache.hadoop.mapred.Task initialize 信息: Using ResourceCalculatorPlugin : null 2013-10-9 11:53:30 org.apache.hadoop.mapred.LocalJobRunner$Job statusUpdate 信息: 2013-10-9 11:53:30 org.apache.hadoop.mapred.Merger$MergeQueue merge 信息: Merging 1 sorted segments 2013-10-9 11:53:30 org.apache.hadoop.mapred.Merger$MergeQueue merge 信息: Down to the last merge-pass, with 1 segments left of total size: 213 bytes 2013-10-9 11:53:30 org.apache.hadoop.mapred.LocalJobRunner$Job statusUpdate 信息: 2013-10-9 11:53:30 org.apache.hadoop.mapred.Task done 信息: Task:attempt_local_0001_r_000000_0 is done. And is in the process of commiting 2013-10-9 11:53:30 org.apache.hadoop.mapred.LocalJobRunner$Job statusUpdate 信息: 2013-10-9 11:53:30 org.apache.hadoop.mapred.Task commit 信息: Task attempt_local_0001_r_000000_0 is allowed to commit now 2013-10-9 11:53:30 org.apache.hadoop.mapred.FileOutputCommitter commitTask 信息: Saved output of task 'attempt_local_0001_r_000000_0' to hdfs://192.168.1.210:9000/user/hdfs/log_kpi/pv 2013-10-9 11:53:31 org.apache.hadoop.mapred.JobClient monitorAndPrintJob 信息: map 100% reduce 0% 2013-10-9 11:53:33 org.apache.hadoop.mapred.LocalJobRunner$Job statusUpdate 信息: reduce > reduce 2013-10-9 11:53:33 org.apache.hadoop.mapred.Task sendDone 信息: Task 'attempt_local_0001_r_000000_0' done. 2013-10-9 11:53:34 org.apache.hadoop.mapred.JobClient monitorAndPrintJob 信息: map 100% reduce 100% 2013-10-9 11:53:34 org.apache.hadoop.mapred.JobClient monitorAndPrintJob 信息: Job complete: job_local_0001 2013-10-9 11:53:34 org.apache.hadoop.mapred.Counters log 信息: Counters: 20 2013-10-9 11:53:34 org.apache.hadoop.mapred.Counters log 信息: File Input Format Counters 2013-10-9 11:53:34 org.apache.hadoop.mapred.Counters log 信息: Bytes Read=3025757 2013-10-9 11:53:34 org.apache.hadoop.mapred.Counters log 信息: File Output Format Counters 2013-10-9 11:53:34 org.apache.hadoop.mapred.Counters log 信息: Bytes Written=183 2013-10-9 11:53:34 org.apache.hadoop.mapred.Counters log 信息: FileSystemCounters 2013-10-9 11:53:34 org.apache.hadoop.mapred.Counters log 信息: FILE_BYTES_READ=545 2013-10-9 11:53:34 org.apache.hadoop.mapred.Counters log 信息: HDFS_BYTES_READ=6051514 2013-10-9 11:53:34 org.apache.hadoop.mapred.Counters log 信息: FILE_BYTES_WRITTEN=83472 2013-10-9 11:53:34 org.apache.hadoop.mapred.Counters log 信息: HDFS_BYTES_WRITTEN=183 2013-10-9 11:53:34 org.apache.hadoop.mapred.Counters log 信息: Map-Reduce Framework 2013-10-9 11:53:34 org.apache.hadoop.mapred.Counters log 信息: Map output materialized bytes=217 2013-10-9 11:53:34 org.apache.hadoop.mapred.Counters log 信息: Map input records=14619 2013-10-9 11:53:34 org.apache.hadoop.mapred.Counters log 信息: Reduce shuffle bytes=0 2013-10-9 11:53:34 org.apache.hadoop.mapred.Counters log 信息: Spilled Records=16 2013-10-9 11:53:34 org.apache.hadoop.mapred.Counters log 信息: Map output bytes=2004 2013-10-9 11:53:34 org.apache.hadoop.mapred.Counters log 信息: Total committed heap usage (bytes)=376569856 2013-10-9 11:53:34 org.apache.hadoop.mapred.Counters log 信息: Map input bytes=3025757 2013-10-9 11:53:34 org.apache.hadoop.mapred.Counters log 信息: SPLIT_RAW_BYTES=110 2013-10-9 11:53:34 org.apache.hadoop.mapred.Counters log 信息: Combine input records=76 2013-10-9 11:53:34 org.apache.hadoop.mapred.Counters log 信息: Reduce input records=8 2013-10-9 11:53:34 org.apache.hadoop.mapred.Counters log 信息: Reduce input groups=8 2013-10-9 11:53:34 org.apache.hadoop.mapred.Counters log 信息: Combine output records=8 2013-10-9 11:53:34 org.apache.hadoop.mapred.Counters log 信息: Reduce output records=8 2013-10-9 11:53:34 org.apache.hadoop.mapred.Counters log 信息: Map output records=76

    用hadoop命令查看HDFS文件

    ~ hadoop fs -cat /user/hdfs/log_kpi/pv/part-00000/about 5 /black-ip-list/ 2 /cassandra-clustor/ 3 /finance-rhive-repurchase/ 13 /hadoop-family-roadmap/ 13 /hadoop-hive-intro/ 14 /hadoop-mahout-roadmap/ 20 /hadoop-zookeeper-intro/ 6

    這樣我們就得到了,剛剛?cè)罩疚募械?#xff0c;指定頁面的PV值。

    指定頁面,就像網(wǎng)站的站點地圖一樣,如果沒有指定所有訪問鏈接都會被找出來,通過“站點地圖”的指定,我們可以更容易地找到,我們所需要的信息。

    后面,其他的統(tǒng)計指標的提取思路,和PV的實現(xiàn)過程都是類似的,大家可以直接下載源代碼,運行看到結(jié)果!!

    ######################################################
    看文字不過癮,作者視頻講解,請訪問網(wǎng)站:http://onbook.me/video
    ######################################################

    轉(zhuǎn)載請注明出處:
    http://blog.fens.me/hadoop-mapreduce-log-kpi/

    總結(jié)

    以上是生活随笔為你收集整理的海量Web日志分析 用Hadoop提取KPI统计指标的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。