大數據入門第十三天——離線綜合案例:網站點擊流數據分析


推薦書籍:《網站分析實戰——如何以數據驅動決策,提升網站價值》

相關隨筆:http://blog.csdn.net/u014033218/article/details/76847263

一、網站點擊流數據分析項目業務背景

  1.什么是點擊流數據

    1.web訪問日志

即指用戶訪問網站時的所有訪問、瀏覽、點擊行為數據。比如點擊了哪一個鏈接,在哪個網頁停留時間最多,采用了哪個搜索項、總體瀏覽時間等。
而所有這些信息都可被保存在網站日志中。通過分析這些數據,可以獲知許多對網站運營至關重要的信息。采集的數據越全面,分析就能越精准。 日志的生成渠道:
1)是網站的web服務器所記錄的web訪問日志; 2)是通過在頁面嵌入自定義的js代碼來獲取用戶的所有訪問行為(比如鼠標懸停的位置,點擊的頁面組件等),
  然后通過ajax請求到后台記錄日志;這種方式所能采集的信息最全面;
3)通過在頁面上埋點1像素的圖片,將相關頁面訪問信息請求到后台記錄日志; 日志數據內容詳述: 在實際操作中,有以下幾個方面的數據可以被采集: 1)訪客的系統屬性特征。比如所采用的操作系統、瀏覽器、域名和訪問速度等。 2)訪問特征。包括停留時間、點擊的URL等。 3)來源特征。包括網絡內容信息類型、內容分類和來訪URL等。 產品特征。包括所訪問的產品編號、產品類別、產品顏色、產品價格、產品利潤、

  日志示例:

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.點擊流數據模型

  點擊流概念

  點擊流這個概念更注重用戶瀏覽網站的整個流程,網站日志中記錄的用戶點擊就像是圖上的“點”,而點擊流更像是將這些“點”串起來形成的“線”。也可以把“點”認為是網站的Page,而“線”則是訪問網站的Session。所以點擊流數據是由網站日志中整理得到的,它可以比網站日志包含更多的信息,從而使基於點擊流數據統計得到的結果更加豐富和高效

  點擊流模型生成

  點擊流數據在具體操作上是由散點狀的點擊日志數據梳理所得,從而,點擊數據在數據建模時應該存在兩張模型表(Pageviews和visits):

  

  

  2.點擊流數據分析意義

    參見文首鏈接

   3.流量分析常見指標 

    1)基礎分析PV,IP,UV

    2)來源分析

    3)受訪分析

    4)訪客分析

    5)轉化路徑分析

   //完整指標參考文首鏈接

 二、整體技術流程及架構

  1.處理流程   

  該項目是一個純粹的數據分析項目,其整體流程基本上就是依據數據的處理流程進行,依此有以下幾個大的步驟:

  1) 數據采集

    首先,通過頁面嵌入JS代碼的方式獲取用戶訪問行為,並發送到web服務的后台記錄日志

    然后,將各服務器上生成的點擊流日志通過實時或批量的方式匯聚到HDFS文件系統中

    當然,一個綜合分析系統,數據源可能不僅包含點擊流數據,還有數據庫中的業務數據(如用戶信息、商品信息、訂單信息等)及對分析有益的外部數據

  2) 數據預處理

    通過mapreduce程序對采集到的點擊流數據進行預處理,比如清洗,格式整理,濾除臟數據等

  3) 數據入庫

    將預處理之后的數據導入到HIVE倉庫中相應的庫和表中

  4) 數據分析

    項目的核心內容,即根據需求開發ETL分析語句,得出各種統計結果

  5) 數據展現

    將分析所得數據進行可視化

  2.項目結構

    

 三、模塊開發——數據采集

  數據采集的需求廣義上來說分為兩大部分。

  1)是在頁面采集用戶的訪問行為,具體開發工作:

    1、開發頁面埋點js,采集用戶訪問行為

    2、后台接受頁面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);

    }

}
WeblogPreProcess

   運行mr進行過濾處理:

hadoop jar weblog.jar  cn.itcast.bigdata.hive.mr.WeblogPreProcess /weblog/input /weblog/preout

   ###剩余模塊,待補充,暫時參考文首博文


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM