大資料技術學習筆記之網站流量日誌分析專案:資料採集層的實現3
阿新 • • 發佈:2018-12-07
一、資料採集業務
-》資料來源
-》網站:使用者訪問日誌、使用者行為日誌、伺服器執行日誌
-》業務:訂單、使用者、商品資訊
-》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
-》資料來源
-》網站:使用者訪問日誌、使用者行為日誌、伺服器執行日誌
-》業務:訂單、使用者、商品資訊
-》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