網站流量日誌分析(資料 採集之 Flume 採集)
目錄
網站流量日誌分析的意義
通過分析使用者的行為資料 讓更多的使用者沉澱下來變成會員 賺取更多的錢。
如何進行網站分析
流量分析
- 質量分析 在看重數量的同時 需要關注流量的質量 所謂的質量指的是流量所能帶來產生的價值。
- 多維度細分 維度指的是分析的問題的角度 在不同的維度下 問題所展示的特性是不一樣的
內容導航分析
從頁面的角度分析 使用者的訪問行為軌跡
轉化分析(漏斗模型分析)
從轉化目標分析 分析所謂的流失率轉化率 漏斗模型:層層遞減 逐級流失的形象描述
網站流量日誌分析的資料處理流程
按照資料的流轉流程進行 通俗概括就是資料從哪裡來一直到資料到哪兒去
資料採集
- 資料從無到有的過程:通過技術把客觀事件量化成為資料(感測器收集 伺服器日誌收集) - 資料搬運過程:把資料從一個儲存介質傳遞到另一個儲存介質中(Apache Flume)
資料預處理
- 目的:保證後續正式處理的資料是格式統一、乾淨規則的結構化資料
- 技術:任何語言軟體只要能夠接受資料處理資料並且最終輸出資料 都可以用於資料預處理
**選擇MapReduce**
- MR本身是java程式,語言比較熟悉 可以無縫的呼叫java現有的開源庫進行資料處理
- MR是分散式的程式 在預處理中 如果資料量比較大 可以分散式平行計算處理 提高效率
資料入庫
- 庫:面向分析的資料倉庫,也是就會Apache Hive
- 入庫的本質:經過ETL(抽取、轉換、載入)把各個不同的資料來源集中載入到數倉的分析主題下面。
資料分析
- 本質:根據業務需求 使用hive sql計算統計出各種不同的指標 分析是一個持續的過程
資料視覺化
儘量的使用圖形表格的形式 把分析的結果規律展示給別人看 也稱之為資料報表
埋點資料採集
資料從無到有的採集 如何把使用者的訪問行為記錄下來變成網站訪問日誌
資料採集方式及其優缺點
### 網站日誌檔案
網站的web伺服器自帶日誌記錄的功能 簡單便捷的收集一些基礎的屬性資訊
常見的web伺服器(Tomcat nginx apache server(httpd))
優點:簡單便捷 自帶功能 不需要配置就可以使用
缺點:收集的資訊確定 不利於維護 收集的資訊不夠完整全面
### 埋點JavaScript收集
- 目標:不以影響使用者的正常瀏覽體驗作為標準 資料採集分析錦上添花
- 何為埋點
```
在待採集資料的頁面上,預先置入一段JavaScript程式碼,當用戶的某種行為滿足JavaScript執行條件,觸發JavaScript的執行,在執行的過程中進行資料的採集工作。
```
- 標準的URL
```
協議://主機:埠/資源路徑?k1=v1&k2=v2
```
- 好處:可以根據業務需求 定製化收集的屬性資訊 在不影響使用者瀏覽體驗的情況下 進行更多資料的收集
埋點js程式碼實現自定義收集使用者資料
(除了追求能跑通,還要考慮效能和後期維護)
問題: js和html頁面耦合在一起 不利於後續js維護
```
把js單獨提取處理變成一個檔案 然後通過src屬性引入頁面 進行所謂解耦合
```
問題: 一臺伺服器身兼多職 壓力過大 降低伺服器請求壓力
```
單獨的去部署伺服器 專門用於採集資料的請求響應
可能會產生跨域問題(限制js跨域的資料傳送)
**以請求圖片的形式 把採集的資料拼接成為圖片的引數 傳送到指定的伺服器上去 繞開js的跨域問題**
(圖片的請求沒有域的限制,js的請求會有。跨域問題:不能從一臺伺服器上的js傳送至另一臺。主機,協議,埠任何一個不一樣,就是不同域。跨域的本質是為了限制js的請求不安全,是針對js的限制。在頁面收集領域,通常採用 以請求圖片的形式繞開所謂的跨域問題)
為了降低請求的圖片對頁面的視覺干擾,將圖片定義為1*1畫素。
```
確定收集的資訊
通常在收集資料之前結合業務需求 分析的需求確定收集哪些資訊欄位 和收集途徑
- 可以通過nginx內建的日誌收集功能獲取到
- 可以通過頁面上內建的物件常見的屬性獲取到
- 可以自定義編寫js程式碼進行相關屬性的收集
埋點程式碼的編寫
本來埋點程式碼的邏輯就是真正進行資料收集的邏輯,但是為了後續維護方便 把真正收集資料的js提取出變成了js檔案,在這種情況下,埋點程式碼的變成了如何把這個js檔案引入到頁面上。
直接通過src屬性引入
```
<script src="www.itcast.cn/collect.js">
```
js匿名函式自呼叫
建立匿名函式 自己呼叫自己 並且呼叫一次 通常用於頁面初始化操作
```
(function() {
var ma = document.createElement('script'); ma.type = 'text/javascript'; ma.async = true;
ma.src = 'www.itcast.cn/collect.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ma, s);
})();
```
前端收集資料js
依然是一個匿名函式自呼叫的格式 保證被引入到頁面上之後 自己可以呼叫自己執行且執行一次
- 通過頁面內建的物件獲取一些屬性資訊
- 通過解析全域性資料 獲取一些資訊
- 把收集的屬性資訊按照url格式進行拼接 並且進行url編碼
- 頁面建立一個圖片標籤 把標籤的src屬性指向後端收集資料的伺服器
- 把收集資料拼接的引數放置請求圖片的url後面 傳遞給後端
後端指令碼
所謂後端就是接受解析前端傳送採集資料的伺服器
- 接受請求 解析引數 儲存資料
- 響應圖片 log.gif 1*1
- 響應cookie cookiekey cookievalue path
注意搞清楚nginx 中 location模組的具體職責:用於請求url資源路徑的匹配。
日誌格式
考慮日誌中欄位之間的分隔符問題 以有利於後續程式處理資料方便為標準
常見的分隔符 製表符 空格 特殊符號 \001
日誌切分
nginx預設把日誌一直寫在一個檔案中access.log 不利於後續的維護移動操作處理
通過shell指令碼給nginx程序傳送usr1訊號 告知其過載配置檔案 在過載配置檔案的時候 重新開啟一個新的日誌檔案 在配合crontab定時器 從而完成間接的通過時間控制檔案的滾動
flume資料採集
kafka 和 flume 都是日誌系統,kafka 是分散式訊息中介軟體,自帶儲存,提供push 和 pull 存取資料功能。
flume分為 agent (資料採集器),collector (資料簡單處理和寫入),storage(儲存器)三部分,每一部分都是可以定製的。比如 agent 採用 RPC(Thrift-RPC)、text(檔案)等,storage 指定用 hdfs 做。
flume每一部分都是可以定製。kafka更合適做日誌快取,flume資料採集部分做的很好,可以定製很多資料來源,減少開發量。
-
flume 新source taildir
- 監控一個檔案的變化,此時相當於exec source :tail -f xxx
- 監控一個資料夾下檔案的變化,並且支援正則匹配 此時相當於spooldir source
- 支援斷點續傳功能 通過檔案記錄上傳的位置 待重啟或者出現故障的時候 可以繼續工作
-
需求:在使用flume採集資料到hdfs的時候 以檔案大小進行控制滾動,大小為:128M
a1.sinks.k1.hdfs.rollInterval = 0 a1.sinks.k1.hdfs.rollSize = 134217728 a1.sinks.k1.hdfs.rollCount = 0
當通過flume上傳檔案至hdfs當中 如果控制檔案滾動的條件不滿足怎麼辦?
如果不滿足 位於hdfs上的檔案將會一直處於臨時狀態 xxx.tmp
a1.sinks.k1.hdfs.rollInterval = 0 時間間隔
a1.sinks.k1.hdfs.rollSize = 134217728 檔案的大小
a1.sinks.k1.hdfs.rollCount = 0 event數量
解決:基於檔案空閒時間滾動
hdfs.idleTimeout 預設值是0 如果配置指定的時間 比如30s
意味著如果30s之內 檔案沒有資料寫入 即是其他的滾動條件不滿足 此時已然進行檔案的滾動
避免檔案一致處於所謂的臨時狀態