1. 程式人生 > >使用flume+hive採集Web伺服器的access日誌

使用flume+hive採集Web伺服器的access日誌

1、配置伺服器格式

博主這裡用的是tomcat的combined預設格式,格式如下

127.0.0.1 - - [28/Mar/2017:09:23:10 +0800] "GET /manager/html HTTP/1.1" 401 2536 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"

2、進入hive shell來建立表

使用正則法則來匹配日誌格式

CREATE TABLE td_log_analyze(  
  host STRING,  
  identity STRING,  
  usr STRING,  
  time STRING,  
  request STRING,  
  status STRING,  
  size STRING,  
  referer STRING,  
  agent STRING)
partitioned by (dt string) ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe' WITH SERDEPROPERTIES ( "input.regex" = "([^ ]*) ([^ ]*) ([^ ]*) (-|\\[[^\\]]*\\]) ([^ \"]*|\"[^\"]*\") (-|[0-9]*) (-|[0-9]*)(?: ([^ \"]*|\"[^\"]*\") ([^ \"]*|\"[^\"]*\"))?", "output.format.string"
= "%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s %9$s" )
STORED AS TEXTFILE
;

3、配置flume-agent

#定義agent名, source、channel、sink的名稱  
logAnalyzeAG.sources = s1  
logAnalyzeAG.channels = c1  
logAnalyzeAG.sinks = k1  
#具體定義source  
logAnalyzeAG.sources.s1.type = spooldir  
logAnalyzeAG.sources.s1.spoolDir = /home/data/tomcat/tomcat-8081
/logs/access #設定快取提交行數 logAnalyzeAG.sources.s1.deserializer.maxLineLength =1048576 logAnalyzeAG.sources.s5.fileSuffix =.FINISH logAnalyzeAG.sources.s5.ignorePattern=^localhost_access_log\.txt$ logAnalyzeAG.sources.s1.consumeOrder = oldest logAnalyzeAG.sources.s1.deserializer = org.apache.flume.sink.solr.morphline.BlobDeserializer$Builder logAnalyzeAG.sources.s1.batchsize = 5 #定義攔截器,為訊息新增時間戳 #logAnalyzeAG.sources.r1.interceptors = i1 #logAnalyzeAG.sources.r1.interceptors.i1.type = org.apache.flume.interceptor.TimestampInterceptor$Builder #具體定義channel logAnalyzeAG.channels.c1.type = memory logAnalyzeAG.channels.c1.capacity = 10000 logAnalyzeAG.channels.c1.transactionCapacity = 100 #具體定義sink logAnalyzeAG.sinks.k1.type = hdfs #%y-%m-%d/%H%M/%S #這裡對應就是hive 表的目錄 此處如果是外部表,則直接對應你的localtion地址,如果普通則對應到你的hive表目錄即可 logAnalyzeAG.sinks.k1.hdfs.path = hdfs://172.16.38.159:8020/apps/hive/warehouse/log_data.db/td_log_analyze/%Y-%m-%d logAnalyzeAG.sinks.k1.hdfs.filePrefix = log-%Y-%m-%d logAnalyzeAG.sinks.k1.hdfs.fileSuffix = .log logAnalyzeAG.sinks.k1.hdfs.fileType = DataStream #不按照條數生成檔案 logAnalyzeAG.sinks.k1.hdfs.rollCount = 0 #HDFS上的檔案達到128M時生成一個檔案 logAnalyzeAG.sinks.k1.hdfs.rollSize = 2914560 #HDFS上的檔案達到60秒生成一個檔案 #logAnalyzeAG.sinks.k1.hdfs.rollInterval = 60 logAnalyzeAG.sinks.k1.hdfs.useLocalTimeStamp = true #組裝source、channel、sink logAnalyzeAG.sources.s1.channels = c1 logAnalyzeAG.sinks.k1.channel = c1

PS:採用spoolDir來採集是檔案級別的,即掃描新增檔案。實時增量可以採用tailDir。上面的配置檔案會過濾掉當天列印的檔案localhost_access_log.txt。

4、因為對日誌進行的分割槽存放,所以要想將hive表對應指定分割槽需要建立hive 分割槽

ALTER TABLE td_log_analyze ADD IF NOT EXISTS PARTITION (dt='2017-03-29') LOCATION '/apps/hive/warehouse/log_data.db/td_log_analyze/2017-03-29/';  

 注意,需要先建立分割槽,再採集資料到hdfs,hive才能識別到資料

5、編寫shell指令碼,每天建立第二天的hive分割槽

#!/bin/bash
#獲取明天的日期
day=$(date --date='1 days' +%Y-%m-%d)
cd /home/
touch log.sql
#為明天預新增hive分割槽
echo "ALTER TABLE td_log_analyze ADD IF NOT EXISTS PARTITION (dt='${day}') LOCATION '/apps/hive/warehouse/log_data.db/td_log_analyze/${day}/';" > /home/log.sql
beeline -u 'jdbc:hive2://node0.hdp:2181,node2.hdp:2181,node1.hdp:2181/log_data;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2' -f '/home/log.sql'

6、設定定時任務(centos)

crontab -e

 新增任務資訊,每天凌晨兩點執行

0 2 * * * /home/shell-test/hive-partitions.sh

重新載入配置

service crond reload

PS:附上tomcat日誌格式的配置方法

在tomcat的server.xml檔案中,host主機配置區域找到類似如下即為訪問日誌的配置:              unpackWARs="true" autoDeploy="true">         
                       prefix="localhost_access_log." suffix=".txt" 
               pattern="%h %l %u %t "%r" %s %b" /> 
      其中的directory用於指定日誌的存放路徑,預設位於tomcat的logs目錄中,例如我們可以修改成: directory="c:/wwwlogs" 使日誌放到c:\wwwlogs目錄中去。 其中的prefix和suffic分別用於指定日誌檔案的字首和字尾,不用我多說。 現在我們主要來看一下pattern配置段,它用於指定日誌的輸出格式。有效的日誌格式模式可以參見下面內容,如下字串,其對應的資訊由指定的響應內容取代: 

    %a - 遠端IP地址 
    %A - 本地IP地址 
    %b - 傳送的位元組數,不包括HTTP頭,或“ - ”如果沒有傳送位元組 
    %B - 傳送的位元組數,不包括HTTP頭 
    %h - 遠端主機名 
    %H - 請求協議 
    %l (小寫的L)- 遠端邏輯從identd的使用者名稱(總是返回' - ') 
    %m - 請求方法 
    %p - 本地埠 
    %q - 查詢字串(在前面加上一個“?”如果它存在,否則是一個空字串 
    %r - 第一行的要求 
    %s - 響應的HTTP狀態程式碼 
    %S - 使用者會話ID 
    %t - 日期和時間,在通用日誌格式     %u - 遠端使用者身份驗證 
    %U - 請求的URL路徑 
    %v - 本地伺服器名 
    %D - 處理請求的時間(以毫秒為單位) 
    %T - 處理請求的時間(以秒為單位) 
    %I (大寫的i) - 當前請求的執行緒名稱 

此外,您可以指定以下別名來設定為普遍使用的模式之一:
    common - %h %l %u %t "%r" %s %b 
    combined - %h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i"  

另外,還可以將request請求的查詢引數、session會話變數值、cookie值或HTTP請求/響應頭內容的變數值等內容寫入到日誌檔案。 
它仿照了apache的語法: 

    %{XXX}i xxx代表傳入的頭(HTTP Request)     %{XXX}o xxx代表傳出的響應頭(Http Resonse) 
    %{XXX}c  xxx代表特定的Cookie名 
    %{XXX}r  xxx代表ServletRequest屬性名     %{XXX}s xxx代表HttpSession中的屬性名