1. 程式人生 > >大資料技術學習筆記之網站流量日誌分析專案:資料採集層的實現3

大資料技術學習筆記之網站流量日誌分析專案:資料採集層的實現3

一、資料採集業務
    -》資料來源
        -》網站:使用者訪問日誌、使用者行為日誌、伺服器執行日誌
        -》業務:訂單、使用者、商品資訊
    -》SDK
        -》SDK用於監聽使用者的行為,收集使用者的資訊,傳送給nginx等日誌伺服器
        -》針對不同的客戶端有不同的SDK
            -》手機APP
            -》網站:js
            -》後臺:java
        -》使用者的客戶端或者行為的不同,導致需要不同的SDK進行處理,收集不同的資料
        -》收集資料的 原則
            -》儘量收集多的資料
    -》常見的欄位
        -》客戶端的ip
        -》使用者的id
        -》URL
        -》客戶端的時間
        -》客戶端
        -》refere_url
        ……
    -》網站日誌伺服器:nginx
        -》日誌檔案
        -》自定義收集的日誌內容及格式
        -》nginx預設將所有的日誌全部儲存為一個檔案
    -》資料收集方案
        -》java:小型業務
            -》可以根據業務需求,實現各種自定的業務,靈活性好
            -》有一定的效能侷限性
        -》flume:分散式工具,適合業務較大的資料採集
            -》架構:
                -》source:讀取資料來源,將資料來源轉化為位元組流,傳送給channel
                    exec、spooling dir、taildir
                -》channel:負責臨時儲存資料
                    mem、file
                -》sink:從channel中取資料,將資料傳送給目標地
                    hdfs
            -》高階特性
                -》sinks:多個sink,一個sink要對應一個channel
                -》flume colloctor
                -》source insterceptor
                    -》timestamp
                    -》host
                    -》static
                    -》regex
                -》channel selector
                -》sink processor
                    -》load_balance
                    -》failover
        -》shell:適合小資料量的業務收集
    -》大資料儲存
        -》hdfs
        
        
        
-》nginx的日誌
'$remote_addr^A$msec^A$http_host^A$request_uri';

192.168.134.1^A
1523153395.558^A
bigdata-training01.erongda.com^A
/hpsk.jpg?
en=e_pv&
p_url=http%3A%2F%2Flocalhost%3A8080%2Fhpsk_sdk%2Fdemo.html&
p_ref=http%3A%2F%2Flocalhost%3A8080%2Fhpsk_sdk%2Fdemo.html&
tt=%E6%B5%8B%E8%AF%95%E9%A1%B5%E9%9D%A21&
ver=1&
pl=website&
sdk=js&
u_ud=4E770FF3-2F36-4311-BEBA-69366B19EEA8&
u_mid=hpsk&
u_sd=465D3B0E-E600-4D56-B7FC-01591F33D4A5&
c_time=1523153395361&
l=zh-CN&
b_iev=Mozilla%2F5.0%20(Windows%20NT%2010.0%3B%20Win64%3B%20x64)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F60.0.3112.90%20Safari%2F537.36&
b_rst=1366*768

-》工作中執行flume的程式
$FLUME_HOME/bin/flume-ng agent --conf $FLUME_HOME/conf/ --conf-file $FLUME_HOME/conf/collectLog.conf --name $1 -Dflume.root.logger=INFO,console >> $FLUME_HOME/logs/collectLog.run.log 2>&1 &
        
    -》寫入hdfs
    -》設定分割槽
    -》設定大小
    -》使用上面命令執行


美團:https://tech.meituan.com/mt-log-system-arch.html


-》使用shell指令碼上傳
    -》將nginx日誌拆分一天一個檔案,檔案中包含日期
        
    -》上傳到對應的分割槽
        -》bin/hdfs dfs -put linux hdfs
        -》bin/hive -e --database stu_info ""    
        
二、ETL
    -》實現的功能
        -》欄位的過濾
            -》過濾非法資料,不需要的欄位
        -》解析補全資料
            -》ip:國家省份城市
            -》客戶端:瀏覽器和作業系統
        -》欄位的格式化
            -》時間的格式化
                dd/MMM/yyyy HH:mm:ss
                    -》yyyy-MM-dd HH:mm:ss
                    -》unixtimestamp:ms為單位
            -》獲取來源域名
                -》第一步:找到該使用者訪問的第一條記錄中的refere_url的值
                -》第二步:對url進行擷取
    -》通過MapReduce去實現etl
        -》一般只有Mapper,沒有reduce
        
    -》解析日誌資料
58.215.204.118
-
-
[18/Sep/2013:06:51:35
+0000]
"GET
/nodejs-socketio-chat/
HTTP/1.1"
200
10818
"http://www.google.com/url?sa=t&rct=j&q=nodejs%20%E5%BC%82%E6%AD%A5%E5%B9%BF%E6%92%AD&source=web&cd=1&cad=rja&ved=0CCgQFjAA&url=%68%74%74%70%3a%2f%2f%62%6c%6f%67%2e%66%65%6e%73%2e%6d%65%2f%6e%6f%64%65%6a%73%2d%73%6f%63%6b%65%74%69%6f%2d%63%68%61%74%2f&ei=rko5UrylAefOiAe7_IGQBw&usg=AFQjCNG6YWoZsJ_bSj8kTnMHcH51hYQkAA&bvm=bv.52288139,d.aGc"
"Mozilla/5.0 (Windows NT 5.1; rv:23.0) Gecko/20100101 Firefox/23.0"

        -》分隔符:空格
        -》欄位資訊:11個
            0:ip
            1: -
            2: userid
            3: time
            4:時區
            5: 請求方式
            6: 請求地址
            7: 訪問協議
            8: 請求結果狀態
            9: 返回結果的位元組大小
            10: refere_url
            11: user_agent
        -》需要的欄位:
            -》ip
            -》user_id
            -》time
            -》request
            -》status
            -》body_size
            -》http_ref
            -》user_agent
            
    -》MapReduce實現
        -》自定義資料型別:webLogBean
            -》valid:bool
                標記該條記錄是否合法
            -》ip
            -》user_id
            -》time
            -》request
            -》status
            -》body_size
            -》http_ref
            -》user_agent
        -》input:預設讀檔案
        -》map:
            -》欄位解析
                -》輸入:key是偏移量,value是行的內容
            -》解析及非法判斷:編寫 工具類實現
                -》將每一行內容進行分割,給weblogbean賦值
                -》對欄位進行過濾、格式化
                    simpledataformat df1 = new simpledataformat("dd/MMM/yyyy:HH:mm:ss",locale.english);
                    Date date = df1.paser("11/Aug/2018:00:00:00");
                    simpledataformat df2 = new simpledataformat("yyy-MM-dd HH:mm:ss")
                    String parsedate = df2.format(date);
                -》做非法性判斷
                    -》判斷時間是否不存在?
                    -》欄位個數能不能小於11?
                    -》
        -》output