1. 程式人生 > 程式設計 >專案-日誌分析平臺

專案-日誌分析平臺

日誌分析平臺(練手專案)

練習hdfs mr hive hbase

  • 各種公司都需要,例如電商、旅遊(攜程)、保險種種。
  • 資料收集-資料清洗-資料分析-資料視覺化。
  • 資料:使用者的行為日誌,不是系統產生的日誌。

資料量

如何談資料量

  • 站長工具:PV(頁面訪問量) UV(日均IP訪問)
  • 說條數。
  • 大小慎重說不要瞎說。

技術選型

  • 儲存引擎:hbase/hdfs
  • 分析引擎(計算):mr/hive 為了練手用MR
  • 視覺化:不做。

模組

使用者基本資訊分析模組

  • 分析新增使用者,活躍使用者,總使用者,新增會員,活躍會員,會話分析等。
  • 公司開始的錢都花在推廣上。
  • 所有指標值都是離線跑批處理。而且沒必要做實時,每天早上來看指標就好了。

瀏覽器來源分析

時間和瀏覽器兩個維度

地域分析模組

調整倉庫,根據IP定位

使用者訪問深度分析模組

某一個會話、某個使用者訪問的頁面個數。業務強相關。

外鏈資料分析模組

廣告投放。拼多多砍一刀

資料來源

使用nginxlog 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的日誌通過flumesink到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中間需要落一次盤。差別很大。