推薦書籍:《網站分析實戰——如何以數據驅動決策,提高網站價值》css
相關隨筆:http://blog.csdn.net/u014033218/article/details/76847263java
1.什麼是點擊流數據node
1.web訪問日誌nginx
即指用戶訪問網站時的全部訪問、瀏覽、點擊行爲數據。好比點擊了哪個連接,在哪一個網頁停留時間最多,採用了哪一個搜索項、整體瀏覽時間等。
而全部這些信息均可被保存在網站日誌中。經過分析這些數據,能夠獲知許多對網站運營相當重要的信息。採集的數據越全面,分析就能越精準。 日誌的生成渠道: 1)是網站的web服務器所記錄的web訪問日誌; 2)是經過在頁面嵌入自定義的js代碼來獲取用戶的全部訪問行爲(好比鼠標懸停的位置,點擊的頁面組件等),
而後經過ajax請求到後臺記錄日誌;這種方式所能採集的信息最全面; 3)經過在頁面上埋點1像素的圖片,將相關頁面訪問信息請求到後臺記錄日誌; 日誌數據內容詳述: 在實際操做中,有如下幾個方面的數據能夠被採集: 1)訪客的系統屬性特徵。好比所採用的操做系統、瀏覽器、域名和訪問速度等。 2)訪問特徵。包括停留時間、點擊的URL等。 3)來源特徵。包括網絡內容信息類型、內容分類和來訪URL等。 產品特徵。包括所訪問的產品編號、產品類別、產品顏色、產品價格、產品利潤、
日誌示例:web
GET /log.gif?t=item.010001&m=UA-J2011-1&pin=-&uid=1679790178&sid=1679790178|12&v=je=1$sc=24-bit$sr=1600x900$ul=zh-cn$cs=GBK$dt=【雲南白藥套裝】雲南白藥 牙膏 180g×3 (留蘭香型)【行情 報價 價格 評測】-京東$hn=item.jd.com$fl=16.0 r0$os=win$br=chrome$bv=39.0.2171.95$wb=1437269412$xb=1449548587$yb=1456186252$zb=12$cb=4$usc=direct$ucp=-$umd=none$uct=-$ct=1456186505411$lt=0$tad=-$sku=1326523$cid1=1316$cid2=1384$cid3=1405$brand=20583$pinid=-&ref=&rm=1456186505411 HTTP/1.1
2.點擊流數據模型ajax
點擊流這個概念更注重用戶瀏覽網站的整個流程,網站日誌中記錄的用戶點擊就像是圖上的「點」,而點擊流更像是將這些「點」串起來造成的「線」。也能夠把「點」認爲是網站的Page,而「線」則是訪問網站的Session。因此點擊流數據是由網站日誌中整理獲得的,它能夠比網站日誌包含更多的信息,從而使基於點擊流數據統計獲得的結果更加豐富和高效。chrome
點擊流數據在具體操做上是由散點狀的點擊日誌數據梳理所得,從而,點擊數據在數據建模時應該存在兩張模型表(Pageviews和visits):數據庫
2.點擊流數據分析意義apache
參見文首連接瀏覽器
3.流量分析常見指標
//完整指標參考文首連接
1.處理流程
該項目是一個純粹的數據分析項目,其總體流程基本上就是依據數據的處理流程進行,依此有如下幾個大的步驟:
1) 數據採集
首先,經過頁面嵌入JS代碼的方式獲取用戶訪問行爲,併發送到web服務的後臺記錄日誌
而後,將各服務器上生成的點擊流日誌經過實時或批量的方式匯聚到HDFS文件系統中
固然,一個綜合分析系統,數據源可能不只包含點擊流數據,還有數據庫中的業務數據(如用戶信息、商品信息、訂單信息等)及對分析有益的外部數據。
2) 數據預處理
經過mapreduce程序對採集到的點擊流數據進行預處理,好比清洗,格式整理,濾除髒數據等
3) 數據入庫
將預處理以後的數據導入到HIVE倉庫中相應的庫和表中
4) 數據分析
項目的核心內容,即根據需求開發ETL分析語句,得出各類統計結果
5) 數據展示
將分析所得數據進行可視化
2.項目結構
數據採集的需求廣義上來講分爲兩大部分。
1)是在頁面採集用戶的訪問行爲,具體開發工做:
一、開發頁面埋點js,採集用戶訪問行爲
二、後臺接受頁面js請求記錄日誌
此部分工做也能夠歸屬爲「數據源」,其開發工做一般由web開發團隊負責
2)是從web服務器上匯聚日誌到HDFS,是數據分析系統的數據採集,此部分工做由數據分析平臺建設團隊負責,具體的技術實現有不少方式:
² Shell腳本
優勢:輕量級,開發簡單
缺點:對日誌採集過程當中的容錯處理不便控制
² Java採集程序
優勢:可對採集過程實現精細控制
缺點:開發工做量大
² Flume日誌採集框架
成熟的開源日誌採集系統,且自己就是hadoop生態體系中的一員,與hadoop體系中的各類框架組件具備天生的親和力,可擴展性強
數據採集技術選型
flume
採集規則:
agent1.sources = source1 agent1.sinks = sink1 agent1.channels = channel1 # Describe/configure spooldir source1 #agent1.sources.source1.type = spooldir #agent1.sources.source1.spoolDir = /var/logs/nginx/ #agent1.sources.source1.fileHeader = false # Describe/configure tail -F source1 #使用exec做爲數據源source組件 agent1.sources.source1.type = exec #使用tail -F命令實時收集新產生的日誌數據 agent1.sources.source1.command = tail -F /var/logs/nginx/access_log agent1.sources.source1.channels = channel1 #configure host for source #配置一個攔截器插件 agent1.sources.source1.interceptors = i1 agent1.sources.source1.interceptors.i1.type = host #使用攔截器插件獲取agent所在服務器的主機名 agent1.sources.source1.interceptors.i1.hostHeader = hostname #配置sink組件爲hdfs agent1.sinks.sink1.type = hdfs #a1.sinks.k1.channel = c1 #agent1.sinks.sink1.hdfs.path=hdfs://hdp-node-01:9000/weblog/flume-collection/%y-%m-%d/%H%M%S #指定文件sink到hdfs上的路徑 agent1.sinks.sink1.hdfs.path= hdfs://hdp-node-01:9000/weblog/flume-collection/%y-%m-%d/%H-%M_%hostname #指定文件名前綴 agent1.sinks.sink1.hdfs.filePrefix = access_log agent1.sinks.sink1.hdfs.maxOpenFiles = 5000 #指定每批下沉數據的記錄條數 agent1.sinks.sink1.hdfs.batchSize= 100 agent1.sinks.sink1.hdfs.fileType = DataStream agent1.sinks.sink1.hdfs.writeFormat =Text #指定下沉文件按1G大小滾動 agent1.sinks.sink1.hdfs.rollSize = 1024*1024*1024 #指定下沉文件按1000000條數滾動 agent1.sinks.sink1.hdfs.rollCount = 1000000 #指定下沉文件按30分鐘滾動 agent1.sinks.sink1.hdfs.rollInterval = 30 #agent1.sinks.sink1.hdfs.round = true #agent1.sinks.sink1.hdfs.roundValue = 10 #agent1.sinks.sink1.hdfs.roundUnit = minute agent1.sinks.sink1.hdfs.useLocalTimeStamp = true # Use a channel which buffers events in memory #使用memory類型channel agent1.channels.channel1.type = memory agent1.channels.channel1.keep-alive = 120 agent1.channels.channel1.capacity = 500000 agent1.channels.channel1.transactionCapacity = 600 # Bind the source and sink to the channel agent1.sources.source1.channels = channel1 agent1.sinks.sink1.channel = channel1
//實際進行適當調整
調整啓動命令,啓動便可:
在部署了flume的nginx服務器上,啓動flume的agent,命令以下: bin/flume-ng agent --conf ./conf -f ./conf/weblog.properties.2 -n agent
//正確匹配配置文件名稱與agent名稱等.
過濾「不合規」數據
格式轉換和規整
根據後續的統計需求,過濾分離出各類不一樣主題(不一樣欄目path)的基礎數據
核心mapreduce代碼:
package cn.itcast.bigdata.hive.mr.pre; import java.io.IOException; import java.util.HashSet; import java.util.Set; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.NullWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import cn.itcast.bigdata.hive.mrbean.WebLogBean; import cn.itcast.bigdata.hive.mrbean.WebLogParser; /** * 處理原始日誌,過濾出真實pv請求 * 轉換時間格式 * 對缺失字段填充默認值 * 對記錄標記valid和invalid * * @author * */ public class WeblogPreProcess { static class WeblogPreProcessMapper extends Mapper<LongWritable, Text, Text, NullWritable> { //用來存儲網站url分類數據 Set<String> pages = new HashSet<String>(); Text k = new Text(); NullWritable v = NullWritable.get(); /** * 從外部加載網站url分類數據 */ @Override protected void setup(Context context) throws IOException, InterruptedException { pages.add("/about"); pages.add("/black-ip-list/"); pages.add("/cassandra-clustor/"); pages.add("/finance-rhive-repurchase/"); pages.add("/hadoop-family-roadmap/"); pages.add("/hadoop-hive-intro/"); pages.add("/hadoop-zookeeper-intro/"); pages.add("/hadoop-mahout-roadmap/"); } @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String line = value.toString(); WebLogBean webLogBean = WebLogParser.parser(line); // 過濾js/圖片/css等靜態資源 WebLogParser.filtStaticResource(webLogBean, pages); /* if (!webLogBean.isValid()) return; */ k.set(webLogBean.toString()); context.write(k, v); } } public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); Job job = Job.getInstance(conf); job.setJarByClass(WeblogPreProcess.class); job.setMapperClass(WeblogPreProcessMapper.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(NullWritable.class); // FileInputFormat.setInputPaths(job, new Path(args[0])); // FileOutputFormat.setOutputPath(job, new Path(args[1])); FileInputFormat.setInputPaths(job, new Path("c:/weblog/input")); FileOutputFormat.setOutputPath(job, new Path("c:/weblog/output")); job.setNumReduceTasks(0); job.waitForCompletion(true); } }
運行mr進行過濾處理:
hadoop jar weblog.jar cn.itcast.bigdata.hive.mr.WeblogPreProcess /weblog/input /weblog/preout
###剩餘模塊,待補充,暫時參考文首博文