Hadoop應用開發實戰案例 第2周 Web日志分析項目 張丹


課程內容

本文鏈接:

張丹博客 http://www.fens.me
用Maven構建Hadoop項目 http://blog.fens.me/hadoop-maven-eclipse/
程序源代碼下載:https://github.com/bsspirit/maven_hadoop_template/releases/tag/kpi_v1
Flume部署:  http://blog.csdn.net/zhouleilei/article/details/8568147  周雷雷博客
Chukwa部署: 詳情見陸嘉恆書第415頁

 

關於張丹

骨灰級程序員, 大數據創業者
DataguruID: bsspirit
Weibo: @Conan_Z
Blog:http://blog.fens.me
Email: bsspirit@gmail.com

 

項目背景:Web日志分析
需求分析:KPI指標
架構設計:日志分析系統架構
算法模型:Map-Reduce並行算法
程序開發:
            –用Maven構建Hadoop項目
            –MapReduce程序實現 

 

 

 

Web日志由Web服務器產生,可能是Nginx, Apache, Tomcat等。

從Web日志中,我們可以獲取網站每個頁面的PV值(PageView,頁面訪問量)、獨立IP數
稍微復雜一些的,可以計算得出用戶所檢索的關鍵詞排行榜、用戶停留時間最高的頁面等;
更復雜的,構建廣告點擊模型、分析用戶行為特征等等。

 

項目背景: Nginx日志

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"

 

流行網站分析工具

1.Webtrends
2.Google分析
3.百度統計

 

項目背景:少量數據的情況

少量數據的情況(10Mb,100Mb,10G),在單機處理尚能忍受的時候,我可以直接利用各種Unix/Linux工具,awk、grep、sort、join等都是日志分析的利器,再配合perl, python,正則表達式,基本就可以解決所有的問題。
例如,從nginx日志中得到訪問量最高前5個IP,實現很簡單:

~ cat access.log.10 | awk '{a[$1]++} END {for(b in a) print b"\t"a[b]}' | sort -k2 -r | head -n 5

 

項目背景: 海量數據的情況

當數據量每天以10G、100G增長的時候,單機處理能力已經不能滿足需求。我們就需要增加系統的復雜性,用計算機集群,存儲陣列來解決。

在Hadoop出現之前,海量數據存儲,和海量日志分析都是非常困難的。只有少數一些公司,掌握着高效的並行計算,分步式計算,分步式存儲的核心技術。
Hadoop的出現,大幅度的降低了海量數據處理的門檻,讓小公司甚至是個人都能力,搞定海量數據。並且,Hadoop非常適用於日志分析系統。

 

分布式日志的收集

1.腳本方案
2.Flume
3.Chukwa

 

架構設計:應用系統及日志系統架構

左邊: Application業務系統
右邊: Hadoop的HDFS, MapReduce。

 

架構設計:應用系統及日志系統架構

日志是由業務系統產生的,我們可以設置web服務器每天產生一個新的目錄,目錄下面會產生多個日志文件,每個日志文件64M。
設置系統定時器CRON,夜間在0點后,向HDFS導入昨天的日志文件。
完成導入后,設置系統定時器,啟動MapReduce程序,提取並計算統計指標。
完成計算后,設置系統定時器,從HDFS導出統計指標數據到數據庫,方便以后的即使查詢。

 

架構設計:數據流

 

Flume

Cloudera提供的分布式、可靠、和高可用的海量日志采集、聚合和傳輸的系統
Flume提供了從console(控制台)、RPC(Thrift-RPC)、text(文件)、tail(UNIX tail)、syslog(syslog日志系統,支持TCP和UDP等2種模式),exec(命令執行)等數據源上收集數據的能力。同時,Flume的數據接受方,可以是console(控制台)、text(文件)、dfs(HDFS文件)、RPC(Thrift-RPC)和syslogTCP(TCP syslog日志系統)等。

 

 

體系架構

data flow描述了數據從產生,傳輸、處理並最終寫入目標的一條路徑(圖中的實線)。
Agent用於采集數據,是flume中產生數據流的地方,將產生的數據流傳輸到collector。
collector用於對數據進行聚合,往往會產生一個更大的流。
收集數據有2種主要工作模式,如下: Push Sources:外部系統會主動地將數據推送到Flume中。 Polling Sources:Flume到外部系統中獲取數據。

 

Flume Master

用於管理數據流的配置

部署詳情見:http://blog.csdn.net/zhouleilei/article/details/8568147          周雷雷博客

 

Chukwa

在印度神話中Chukwa是一只最古老的龜。它支撐着世界。在它的背上還支撐着一種叫做Maha-Pudma的大象,在大象的背上頂着這個地球。呵呵,大 象?Hadoop?不難理解為什么在Hadoop中的這個子項目叫做Chukwa了,或許Chukwa的其中一位開發者是印度人?呵呵,我瞎猜的,神話中 的Chukwa的,貌似是這樣

 

架構圖

 

部署Chukwa:詳情見陸嘉恆書第415頁

 

 

需求分析:案例介紹

某電子商務網站,在線團購業務。每日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: 用戶的訪問設備統計

 

注:商業保密限制,無法提供電商網站的日志。 下面的內容,將以我的個人網站為例提取數據進行分析, http://www.fens.me  張丹博客

 

需求分析: 電商網站VS個人網站

從商業的角度,個人網站的特征與電商網站不太一樣,沒有轉化率,同時跳出率也比較高。
從技術的角度,同樣都關注KPI指標設計
–PV, IP, 轉化率, 跳出率, 在線時長, 來源網站,來源域名,外部鏈接
–搜索流量,搜索關鍵詞
–入口頁面,跳出頁面,受訪頁面
–訪客男女,訪客年齡,訪客位置
–使用設置,操作系統,瀏覽器,爬蟲,RSS閱讀器

 

拆解為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″

 

算法模型: 並行算法 1

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)}

 

算法模型: 並行算法 2

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)}

 

程序開發: 用Maven構建Hadoop項目

 

開發環境
–Win7 64bit
–Java 1.6.0_45
–Maven3
–Eclipse Juno Service Release 2


Hadoop集群系統環境:
–Linux: Ubuntu 12.04.2 LTS 64bit Server
–Java: 1.6.0_29
–Hadoop: hadoop-1.0.3,單節點,IP:192.168.1.210


請參考文章:用Maven構建Hadoop項目 http://blog.fens.me/hadoop-maven-eclipse/

 

程序開發: 向HDFS導入日志文件

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

 

程序開發: MapReduce開發流程

對”日志行”的解析
Map函數實現
Reduce函數實現
啟動程序實現

 

程序源代碼下載:https://github.com/bsspirit/maven_hadoop_template/releases/tag/kpi_v1

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM