1. 程式人生 > 實用技巧 >網站流量日誌分析(資料 採集之 Flume 採集)

網站流量日誌分析(資料 採集之 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之內 檔案沒有資料寫入 即是其他的滾動條件不滿足 此時已然進行檔案的滾動
避免檔案一致處於所謂的臨時狀態