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


免責聲明!

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



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