專案-日誌分析平臺
阿新 • • 發佈:2019-12-31
日誌分析平臺(練手專案)
練習hdfs mr hive hbase
- 各種公司都需要,例如電商、旅遊(攜程)、保險種種。
- 資料收集-資料清洗-資料分析-資料視覺化。
- 資料:使用者的行為日誌,不是系統產生的日誌。
資料量
如何談資料量
- 站長工具:PV(頁面訪問量) UV(日均IP訪問)
- 說條數。
- 大小慎重說不要瞎說。
技術選型
- 儲存引擎:hbase/hdfs
- 分析引擎(計算):mr/hive 為了練手用MR
- 視覺化:不做。
模組
使用者基本資訊分析模組
- 分析新增使用者,活躍使用者,總使用者,新增會員,活躍會員,會話分析等。
- 公司開始的錢都花在推廣上。
- 所有指標值都是離線跑批處理。而且沒必要做實時,每天早上來看指標就好了。
瀏覽器來源分析
時間和瀏覽器兩個維度
地域分析模組
調整倉庫,根據IP定位
使用者訪問深度分析模組
某一個會話、某個使用者訪問的頁面個數。業務強相關。
外鏈資料分析模組
廣告投放。拼多多砍一刀
資料來源
使用nginx
的log module
nginx
upstream 中 下劃線 坑?!
log module
-
內嵌變數
- $remote_host 遠端IP地址
- $request_uri 完整的原始請求行(帶引數)
-
log module
- $mesc 產生時間。單位有意思。
location
location檔案 location有精準匹配>正則匹配>字首匹配
js傳送日誌
- 用圖片發資料。請求一個圖片資源,裡面有引數給nginx抓到。
sendDataToServer : function(data) {
alert(data);
// 傳送資料data到伺服器,其中data是一個字串
var that = this;
var i2 = new Image(1,1);// <img src="url"></img>
i2.onerror = function() {
// 這裡可以進行重試操作
};
i2.src = this.clientConfig.serverUrl + "?" + data;
},複製程式碼
java程式碼傳送(訂單的成功或失敗)
傳送日誌到nginx,如果出現網路延遲等問題,不能讓後面的業務受到影響
- 開啟一個阻塞佇列,開一個執行緒從裡面一直取然後傳送。
// 只負責扔到佇列中。
public static void addSendUrl(String url) throws InterruptedException {
getSendDataMonitor().queue.put(url);
}
// 第一次傳送 開啟一個執行緒 監聽佇列。
public static SendDataMonitor getSendDataMonitor() {
if (monitor == null) {
synchronized (SendDataMonitor.class) {
if (monitor == null) {
monitor = new SendDataMonitor();
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
// 執行緒中呼叫具體的處理方法
SendDataMonitor.monitor.run();
}
});
// 測試的時候,不設定為守護模式
// thread.setDaemon(true);
thread.start();
}
}
}
return monitor;
}
複製程式碼
資料採集
將nginx
的日誌通過flume
sink到hdfs
a1.sources = r1
a1.sinks = k1
a1.channels = c1
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
a1.sources.r1.type = exec
a1.sources.r1.command = tail -F /opt/data/access.log
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
a1.sinks.k1.type = hdfs
# hdfs 中的目錄
a1.sinks.k1.hdfs.path = /project/events/%Y-%m-%d/
a1.sinks.k1.hdfs.filePrefix = events-
a1.sinks.k1.hdfs.useLocalTimeStamp = true
# 10k 滾動一個檔案
a1.sinks.k1.hdfs.rollSize = 10240
a1.sinks.k1.hdfs.rollInterval = 10
a1.sinks.k1.hdfs.rollCount = 0
# 預設是SequenceFile
a1.sinks.k1.hdfs.fileType = DataStream
複製程式碼
資料清洗
上MR程式碼。將hdfs->hbase
- 具體需不需要
reducer
是看需不需要。差別還是很大的。從map
->reduce
中間需要落一次盤。差別很大。