網站流量日志分析的意義
通過分析用戶的行為數據 讓更多的用戶沉淀下來變成會員 賺取更多的錢。
如何進行網站分析
流量分析
- 質量分析 在看重數量的同時 需要關注流量的質量 所謂的質量指的是流量所能帶來產生的價值。
- 多維度細分 維度指的是分析的問題的角度 在不同的維度下 問題所展示的特性是不一樣的
內容導航分析
從頁面的角度分析 用戶的訪問行為軌跡
轉化分析(漏斗模型分析)
從轉化目標分析 分析所謂的流失率轉化率 漏斗模型:層層遞減 逐級流失的形象描述
網站流量日志分析的數據處理流程
按照數據的流轉流程進行 通俗概括就是數據從哪里來一直到數據到哪兒去
數據采集
- 數據從無到有的過程:通過技術把客觀事件量化成為數據(傳感器收集 服務器日志收集)
- 數據搬運過程:把數據從一個存儲介質傳遞到另一個存儲介質中(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之內 文件沒有數據寫入 即是其他的滾動條件不滿足 此時已然進行文件的滾動
避免文件一致處於所謂的臨時狀態