課程內容python
本文連接:nginx
張丹博客 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頁
git
關於張丹程序員
骨灰級程序員, 大數據創業者
DataguruID: bsspirit
Weibo: @Conan_Z
Blog:http://blog.fens.me
Email: bsspirit@gmail.comangularjs
項目背景:Web日誌分析
需求分析:KPI指標
架構設計:日誌分析系統架構
算法模型:Map-Reduce並行算法
程序開發:
–用Maven構建Hadoop項目
–MapReduce程序實現 github
Web日誌由Web服務器產生,多是Nginx, Apache, Tomcat等。web
從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