天天看點

使用Hive處理伺服器日志

假設這樣一個場景,使用者有許多的機器(ecs或者自有機房的都可以),每天産生非常多的日志,記錄了使用者的通路的一些資訊,比如userid,通路的頁面位址,通路的時間,通路ip等等。我們對這些資料進行一個離線分析,每天分析一次,計算網站的各個頁面的uv、pv,并觀察一下是否有作弊的情況:如多個不同的賬号來自于同一個ip。并能将最終的這個結果同步到資料庫中,在管理背景檢視。

首先,我們需要擷取所有伺服器的日志資料。這個可以通過阿裡雲的日志服務(sls)來完成。

可以安裝日志服務的用戶端到指定的機器上,然後在日志服務的控制台進行資料收集配置,就能夠把資料收集上來了。

你可以在配置中指定你需要收集的目錄和檔案名,通過這一步,所有的機器上的日志就都會被收集到日志服務中去。

收集到了資料。現在我們要把這些資料都放到oss上去。主要是幾個原因

oss的存儲本身非常便宜,而日志服務預設資料并不永久儲存

日志服務沒有提供讀取大量離線資料的接口

在logstore管理标簽下能夠看到有一欄日志投遞,如下

使用Hive處理伺服器日志

點選對應的logstore後面的oss(建立),就可以建立一個到oss的投遞任務了

其中有幾點要注意的

投遞的時候,是否壓縮選項請選擇非壓縮的文本

是oss投遞的路徑最終是這樣構成的,會自動加上很多層的路徑

使用Hive處理伺服器日志

所有的投遞的資料都是一個json結構,并不是原始的資料格式

這個就需要我們在處理資料的時候,要對所有的目錄進行周遊,并将資料做一次json解析,将最終要處理的資料内容取出來

這裡假定,日志檔案的内容是一個文本,對應到一個key叫content。裡面的多個字段使用|來分割,儲存到oss中的資料類似如下的格式 <code>{"content":"1463987545149|12345|121.164.16.19|www.xxxx.com/user"}</code>

若使用emr-1.0.x或者emr-1.1.x,其中的hive版本是1.0.1,使用下面的sql

若使用emr-1.2.x或者emr-1.3.x,其中的hive版本是2.0.0,使用下面的sql

accesskeyid,accesskeysecret就是你的akid,和secret

bucketname是oss對應的bucket的名字

dirname是投遞到oss的目錄,因為設定了周遊所有目錄,是以隻要寫這一級目錄就可以了

get_json_object就是用來從json格式資料中将content這個key對應的内容取出來使用

接下來我們需要把要使用的字段都解析出來使用,比如userid,ip等等,我們使用分隔符|來對日志内容進行分割。

我這裡是采用建立了一張新的表,而這張表的對應資料是儲存在計算叢集的hdfs上的

這張resulttable表就可以作為後續處理的起點,對資料進行各種統計,比如pv,uv等。

所有的資料計算完成以後,我們可以把結果同步到mysql(rds)中去。

目前同步資料還不是自動化的,後續e-mapreduce會有資料同步的作業支援,在計算完成以後,直接就進行資料同步。敬請期待。