閱讀903 返回首頁    go 阿裏雲 go 技術社區[雲棲]


大數據日誌分析項目架構

項目簡介:大數據涉及到的業務很多很複雜,從一開始的項目架構,再到後台的網站搭建,以及數據的收集,數據的分析,數據的遷移,業務開發,後台運維,等等。我們沒辦法一個實驗將所有的過程都學習到。本次試驗我們將會將重點放在項目架構上,後麵的項目我們將重點放在每一部分的實現上。通過本次實驗,你將能了解到一個大數據架構師工作的基本步驟,雖然本次實驗我們也有複雜的代碼分析過程,但是大家沒有必要將自己的重點放在代碼上麵,大家應該更加站在架構師的角度,專注於整個項目每一部分的連接,每個部分具體實現的細節,大家可以不必太深入,我們後期會有專門的實驗放在這上麵。
有關代碼我們已經實現並且提供,大家直接打開,然後閱讀熟悉每部分的意義即可。
本次項目我們是架構一個日誌分析,我們的要完成的任務包括後台和前端的實現,網站的搭建,nginx反向代理的搭建,etl數據清洗程序,數據分析,數據報表的實現。

一、業務分析和需求文檔

1.業務分析概述

本次試驗我們主要是分析類似淘寶等購物網站上的點擊流,從而進行展示分析。在本次項目中我們分別從七個大的角度來進行分析,分別為:

用戶基本信息分析模塊、瀏覽器信息分析模塊、地域信息分析模塊、用戶瀏覽深度分析模塊、外鏈數據分析模塊、訂單分析模塊以及事件分析模塊。

注意幾個概念:

用戶/訪客:表示同一個瀏覽器代表的用戶。唯一標示用戶
會員:表示網站的一個正常的會員用戶。
會話:一段時間內的連續操作,就是一個會話中的所有操作。
Pv:訪問頁麵的數量
在本次項目中,所有的計數都是去重過的。比如:活躍用戶/訪客,計算uuid的去重後的個數。

我們分析數據的需求文檔和最終的展示結果大概如下。

2.用戶基本信息分析模塊

用戶基本信息分析模塊主要是從用戶/訪客和會員兩個主要角度分析瀏覽相關信息,包括但不限於新增用戶,活躍用戶,總用戶,新增會員,活躍會員,總會員以及會話分析等。下麵就各個不同的用戶信息角度來進行分析:

(1).用戶分析

該分析主要分析新增用戶、活躍用戶以及總用戶的相關信息。
新訪客:老訪客(活躍訪客中) = 1:7~10

(2).會員分析

該分析主要分析新增會員、活躍會員以及總會員的相關信息。

(3).會話分析

該分析主要分析會話個數、會話長度和平均會話長度相關的信息。

(4).Hourly分析

該分析主要分析每天每小時的用戶、會話個數以及會話長度的相關信息。

3.其他模塊分析

在用戶模塊的基礎上,我們可以添加其他的六個模塊分析,我們本次試驗先不展示所有的模塊,隻是作簡單介紹,例如地域分布模塊:

上麵分析的業務需求大家可能不太懂,沒關係,注意在下麵的項目中,時不時回頭看看我們的需求,就能明白了。

二、開發環境搭建

為了方便管理,我們以後按照管理,盡量使用maven構建java和scala項目。另外我們的軟件安裝在D盤的soft目錄下,我們的開發項目放在D盤的workspace目錄下。

1.下載安裝軟件

分別在https://tomcat.apache.orghttps://maven.apache.org下載tomcat和maven,解壓後放在D盤的soft目錄,然後配置環境變量,需要配置的環境變量包括 MAVEN_HOMETOMCAT_HOME,並且將他們的bin目錄添加到PATH中。安裝配置完成後,在命令行輸入start-up和mvn命令,檢查是否安裝正確。
確保無誤後,我們的開發環境使用IDEA,安裝好IDEA,打開,配置maven的目錄,如下圖的方法,搜索maven,在Maven的配置填寫maven的路徑。

2.搭建服務器

(1).布置開發環境

如果大家熟悉javaEE開發,這一段就比較簡單。我們搭建服務器就是新建一個javaEE項目,然後啟動,這個過程需要借助tomcat實現。首先打開IDEA,IDEA中已經配置好了maven的路徑。
點擊File ->New -> Project ,選擇java的web application,然後下一步:

在下一步我們設置項目路徑,我們的項目名為taobaopayment,放在D盤下的workspace目錄下。然後點擊完成。這時候就新建了一個web項目,我們在項目的web文件下能看到一個index.jsp文件,這個文件你可以修改為自定義的內容,例如我修改為:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>taobaopayment</title>
  </head>
  <body>
  支付頁麵
  </body>
</html>

(2).本地發布項目

菜單欄選擇Run ->Edit Configuration或者點擊右上角按鈕添加tomcat的發布參數,依次點擊 加號 ->tomcat server -> local ,添加tomcat:

在右邊的配置頁麵配置好名字、地址、端口:

然後在deployment選項下麵點擊加號添加發布選項,然後設置你content名字,我們設置為 taobaopayment

點擊確定後,我們可以看到右上方和下方都出現了可以啟動的三角形按鈕,點擊啟動:

啟動成功後打開瀏覽器,輸入https://localhost:8080/taobaopayment/,出現我們剛剛編輯的jsp頁麵,剩下的操作自己實驗。

三、Web服務器開發

根據我們的需求文檔,我們需要實現支付成功和退款頁麵。這裏又分為兩部分,一是前端的頁麵傳來的請求數據,這部分代碼使用JavaScript編寫,另一方麵是後台的服務器發送過來的代碼,通過Java語言編寫。

1.後端開發

(1).程序後台事件分析

本項目中在程序後台會有chargeSuccess事件,本事件的主要作用是發送訂單成功的信息給nginx服務器。發送格式同pc端發送方式, 也是訪問同一個url來進行數據的傳輸。格式為:
https://hongyahuayu.com/index.jpg?query1=spark
當會員最終支付成功的時候觸發chargeSuccess該事件,該事件需要程序主動調用,然後向後台發送數據:
u_mid=maomao&c_time=1449142044528&oid=orderid_1&ver=1&en=e_cs&pl=jdk&sdk=java,其中 u_midoid代表用戶id和訂單id。
前麵我們分析了後端的業務,如果你不太懂,我們尅簡單地說,後端程序的工作流如下:

簡單說,後端就是要設計方法,當chargeSuccess觸發的時候,我們給後台發送數據。

(2).後端程序開發

程序開發有一定難度,另外由於我們本次試驗的重點是後麵的數據分析,這一塊不作太高的要求,大家能夠理解即可,核心代碼如下,其餘代碼可以在項目中查看:

    public static boolean onChargeSuccess(String orderId, String memberId) {
        try {
            if (isEmpty(orderId) || isEmpty(memberId)) {
                // 訂單id或者memberid為空
                log.log(Level.WARNING, "訂單id和會員id不能為空");
                return false;
            }
            // 代碼執行到這兒,表示訂單id和會員id都不為空。
            Map<String, String> data = new HashMap<String, String>();
            data.put("u_mid", memberId);
            data.put("oid", orderId);
            data.put("c_time", String.valueOf(System.currentTimeMillis()));
            data.put("ver", version);
            data.put("en", "e_cs");
            data.put("pl", platformName);
            data.put("sdk", sdkName);
            // 創建url
            String url = buildUrl(data);
            // 發送url&將url加入到隊列
            SendDataMonitor.addSendUrl(url);
            return true;
        } catch (Throwable e) {
            log.log(Level.WARNING, "發送數據異常", e);
        }
        return false;
    }

注意事項 修改代碼這裏url地址為自己服務器的地址:

2.前端開發

(1).前端事件分析

前麵我們說後端的事件主要是chargeSuccess,前端的時間處理就更複雜了。針對我們最終的不同分析模塊,我們需要不同的數據,接下來分別從各個模塊分析,每個模塊需要的數據。
1. 用戶基本信息就是用戶的瀏覽行為信息分析,也就是我們隻需要pageview事件就可以了;
2. 瀏覽器信息分析以及地域信息分析其實就是在用戶基本信息分析的基礎上添加瀏覽器和地域這個維度信息,其中瀏覽器信息我們可以通過瀏覽器的window.navigator.userAgent來進行分析,地域信息可以通過nginx服務器來收集用戶的ip地址來進行分析,也就是說pageview事件也可以滿足這兩個模塊的分析。
3. 外鏈數據分析以及用戶瀏覽深度分析我們可以在pageview事件中添加訪問頁麵的當前url和前一個頁麵的url來進行處理分析,也就是說pageview事件也可以滿足這兩個模塊的分析。
4. 訂單信息分析要求pc端發送一個訂單產生的事件,那麼對應這個模塊的分析,我們需要一個新的事件chargeRequest。對於事件分析我們也需要一個pc端發送一個新的事件數據,我們可以定義為event。
我們要分析的模塊包括:

用戶基本信息分析
瀏覽器信息分析
地域信息分析
外鏈數據分析
用戶瀏覽深度分析
訂單信息分析

我們處理的事件包括:

pageview事件
chargeRequest事件
launch事件

第一,Launch事件。當用戶第一次訪問網站的時候觸發該事件,不提供對外調用的接口,隻實現該事件的數據收集。
第二,Pageview事件,當用戶訪問頁麵/刷新頁麵的時候觸發該事件。該事件會自動調用,也可以讓程序員手動調用。
第三,chargeRequest事件。當用戶下訂單的時候觸發該事件,該事件需要程序主動調用。
每次都會發送對應的數據,例如:

u_sd=8E9559B3-DA35-44E1-AC98-85EB37D1F263&c_time=1449139048231&oid=orderid123&on=%E4%BA%A7%E5%93%81%E5%90%8D%E7%A7%B0&cua=1000&cut=%E4%BA%BA%E6%B0%91%E5%B8%81&pt=%E6%B7%98%E5%AE%9D&ver=1&en=e_cr&pl=website&sdk=js&b_rst=1920*1080&u_ud=12BF4079-223E-4A57-AC60-C1A04D8F7A2F&b_iev=Mozilla%2F5.0%20(Windows%20NT%206.1%3B%20WOW64)%20AppleWebKit%2F537.1%20(KHTML%2C%20like%20Gecko)%20Chrome%2F21.0.1180.77%20Safari%2F537.1&l=zh-CN

這個url的字段比較多,字段詞典如下:

參數名稱    類型  描述
en  string  事件名稱, eg: e_pv
ver string  版本號, eg: 0.0.1
pl  string  平台, eg: website
sdk string  Sdk類型, eg: js
b_rst   string  瀏覽器分辨率,eg: 1800*678
b_iev   string  瀏覽器信息useragent
u_ud    string  用戶/訪客唯一標識符
l   string  客戶端語言
u_mid   string  會員id,和業務係統一致
u_sd    string  會話id
c_time  string  客戶端時間
p_url   string  當前頁麵的url
p_ref   string  上一個頁麵的url
tt  string  當前頁麵的標題
ca  string  Event事件的Category名稱
ac  string  Event事件的action名稱
kv_*    string  Event事件的自定義屬性
du  string  Event事件的持續時間
oid string  訂單id
on  string  訂單名稱
cua string  支付金額
cut string  支付貨幣類型
pt  string  支付方式

(2).前端程序開發

前麵我們簡單實現了後端開發,現在前端的JavaScript代碼實現可能就更複雜了,對大家來說難度略大,但是還好這不是我們的重點,我大概展示幾個函數:

onPageView: function() {
                // 觸發page view事件
                if (this.preCallApi()) {
                    var time = new Date().getTime();
                    var pageviewEvent = {};
                    pageviewEvent[this.columns.eventName] = this.keys.pageView;
                    pageviewEvent[this.columns.currentUrl] = window.location.href; // 設置當前url
                    pageviewEvent[this.columns.referrerUrl] = document.referrer; // 設置前一個頁麵的url
                    pageviewEvent[this.columns.title] = document.title; // 設置title
                    this.setCommonColumns(pageviewEvent); // 設置公用columns
                    this.sendDataToServer(this.parseParam(pageviewEvent)); // 最終發送編碼後的數據ss
                    this.updatePreVisitTime(time);
                }
            },

            onChargeRequest: function(orderId, name, currencyAmount, currencyType, paymentType) {
                // 觸發訂單產生事件
                if (this.preCallApi()) {
                    if (!orderId || !currencyType || !paymentType) {
                        this.log("訂單id、貨幣類型以及支付方式不能為空");
                        return ;
                    }

                    if (typeof(currencyAmount) == "number") {
                        // 金額必須是數字
                        var time = new Date().getTime();
                        var chargeRequestEvent = {};
                        chargeRequestEvent[this.columns.eventName] = this.keys.chargeRequestEvent;
                        chargeRequestEvent[this.columns.orderId] = orderId;
                        chargeRequestEvent[this.columns.orderName] = name;
                        chargeRequestEvent[this.columns.currencyAmount] = currencyAmount;
                        chargeRequestEvent[this.columns.currencyType] = currencyType;
                        chargeRequestEvent[this.columns.paymentType] = paymentType;
                        this.setCommonColumns(chargeRequestEvent); // 設置公用columns
                        this.sendDataToServer(this.parseParam(chargeRequestEvent)); // 最終發送編碼後的數據ss
                        this.updatePreVisitTime(time);
                    } else {
                        this.log("訂單金額必須是數字");
                        return ;
                    }   
                }
            },

            onEventDuration: function(category, action, map, duration) {
                // 觸發event事件
                if (this.preCallApi()) {
                    if (category && action) {
                        var time = new Date().getTime();
                        var event = {};
                        event[this.columns.eventName] = this.keys.eventDurationEvent;
                        event[this.columns.category] = category;
                        event[this.columns.action] = action;
                        if (map) {
                            for (var k in map){
                                if (k && map[k]) {
                                    event[this.columns.kv + k] = map[k];
                                }
                            }
                        }
                        if (duration) {
                            event[this.columns.duration] = duration;
                        }
                        this.setCommonColumns(event); // 設置公用columns
                        this.sendDataToServer(this.parseParam(event)); // 最終發送編碼後的數據ss
                        this.updatePreVisitTime(time);
                    } else {
                        this.log("category和action不能為空");
                    }
                }
            }

完整的代碼,如果有興趣自己可以詳細研究,
注意事項 ,發布的時候一定要將代碼中的url改為你的服務器的url:

3.項目發布

(1).本地項目發布

前麵我們已經簡單的實現了後台和前端的代碼,首先我們在本地啟動服務,方法和前麵一樣,隻是我們將自己的代碼添加進去了,點擊啟動按鈕。

然後去瀏覽器訪問 https://localhost:8080/taobaopayment/demo4.jsp,然後點擊跳轉按鈕測試

截止現在我們的後台項目基本完成,這裏麵的代碼比較難,大家可以根據情況查看,不用花太多的精力。

(2).發布到linux的tomcat上

我們的項目不可能放在本地運行,需要放到Linux的集群環境才能正常運行。首先打開Xshell,連上linux節點。
第一步,在Linux上安裝tomcat。
安裝的過程很簡單,首先要安裝java配置JAVA相關環境變量,然後在tomcat的官網下載tomcat的tar.gz包,解壓,然後配置tomcat相關環境變量。啟動tomcat的命令是tomcat安裝目錄下麵的bin下麵的startup.sh,執行就能啟動tomcat,然後訪問節點的8080端口,如圖:

第二步,將項目打成war包。
類似以前打jar包,點開project structure -> artificts,添加一個artifict,名字為taobaopayment,type選擇 Web Application:Archive,設置好對應的輸出目錄output idrectory,一般默認即可,然後點擊確定

設置好後,點擊build -> build artifacts,構建war包

構建結束後,進入剛剛設置的輸出目錄,你將會在剛剛設置的目錄下看到一個war包。

通過xshell的xftp工具,將打出來的war包拷貝放在linux的tomcat安裝目錄的webapps目錄下:

然後tomcat會自動解壓war包,我們就可以在瀏覽器訪問剛剛發布的項目了:

到這裏我們的整個後端項目就發布成功了。

四、數據分析係統開發

本次我們的重心是整個係統的搭建,這部分的開發過程比較複雜,大家酌情進行學習,代碼我們已經寫好,大家隻要稍作理解。細節和邏輯我們後續的實驗還會講解。

1.需求回顧

之前我們已經做過需求分析,這時候大家再回頭看看我們一開始的需求設計,我們是要完成幾個關鍵指標的設計分析。假設我們已經配置好了tomcat和nginx,那麼我們知道每次用有瀏覽等行為時,我們的服務器就會給我們的設置的url發送數據,然後nginx就會收到我們發送的數據。接下來就是分析nginx收集到的數據。

隨便選取一條數據查看:

192.168.126.1^A1458731952.690^A192.168.126.11^A/log.gif?en=e_pv&p_url=http%3A%2F%2Flocalhost%3A8080%2FBIG_DATA_LOG2%2Fdemo.jsp&p_ref=http%3A%2F%2Flocalhost%3A8080%2FBIG_DATA_LOG2%2Fdemo.jsp&tt=%E6%B5%8B%E8%AF%95%E9%A1%B5%E9%9D%A21&ver=1&pl=website&sdk=js&u_ud=EAB36BC9-0347-4D33-8579-AA8C331D001A&u_mid=laoxiao&u_sd=2D24B8A2-B2EF-450C-8C86-4F8B0F3E2785&c_time=1458731943823&l=zh-CN&b_iev=Mozilla%2F5.0%20(Windows%20NT%2010.0%3B%20WOW64%3B%20rv%3A45.0)%20Gecko%2F20100101%20Firefox%2F45.0&b_rst=1366*768

這條數據提取了很多來自url的query信息,通過^A隔開,我們需要編寫代碼分析這種數據。

2.ETL處理

(1).定義工具類

本次試驗的工具類主要是從一個url中抽取KPI信息,我們前麵的業務需要的信息包括了地址、瀏覽器、操作係統等,根據我們的分析,所以我們需要使用IP地址解析等工具。解析url的工具類我們放在com.hongya.etl.util下麵,大家自己認真分析。

(2).定義相關常量類

我們的數據分析是有時間段的,我們分析的結果放進hbase中的表中,表名、字段名、時間範圍等都是需要用到的常量,我們放在com.hongya.common下麵,大家可以查看。

(3).業務代碼

我們的數據字段含義在前麵已經講過了,現在我們需要將數據解析後放進hbase中。ETL過程就是簡單的字符串處理,隻需要一個Mapper程序即可完成。相應的代碼在com.hongya.etl.mr.ald中,大家可以查看。

(4).本地測試運行

然後我們在本地新建一個文件,將上麵哪一行測試數據放進去:

192.168.126.1^A1458731952.690^A192.168.126.11^A/log.gif?en=e_pv&p_url=http%3A%2F%2Flocalhost%3A8080%2FBIG_DATA_LOG2%2Fdemo.jsp&p_ref=http%3A%2F%2Flocalhost%3A8080%2FBIG_DATA_LOG2%2Fdemo.jsp&tt=%E6%B5%8B%E8%AF%95%E9%A1%B5%E9%9D%A21&ver=1&pl=website&sdk=js&u_ud=EAB36BC9-0347-4D33-8579-AA8C331D001A&u_mid=laoxiao&u_sd=2D24B8A2-B2EF-450C-8C86-4F8B0F3E2785&c_time=1458731943823&l=zh-CN&b_iev=Mozilla%2F5.0%20(Windows%20NT%2010.0%3B%20WOW64%3B%20rv%3A45.0)%20Gecko%2F20100101%20Firefox%2F45.0&b_rst=1366*768

然後我們將com.hongya.etl.mr.ald.AnalyserLogDataRunner中的setJobInputPaths方法的路徑改為剛剛添加的文件的路徑,並且在setConf方法設置一下zookeeper地址,並且啟動zookeeper,就可以點擊運行,在本地觀察結果。

如圖我們可以看出ETL後將這一行數據轉化為了Hbase的一條Put,這裏一直運行不結束是因為我沒有啟動Hbase,所以一直沒法寫進去,發布項目的時候是需要啟動的。
這個Mapper讀取數據格式上麵有,而寫出的數據格式是Hbase的Put。不知道大家是否記得Hbase的javaAPI,我們介紹過Put的使用。最後我們每一條記錄將會放進Hbase的表格中,例如上麵的示例數據最後會解析為一條Put數據,我們可以看出它的rowKey是帶著日期的:

rowKey 1458731952690_84973288
cf: info ,key:tt value:測試頁麵1
cf: info ,key:country value:unknown
cf: info ,key:ver value:1
cf: info ,key:u_mid value:laoxiao
cf: info ,key:os value:Windows
cf: info ,key:city value:unknown
cf: info ,key:ip value:192.168.126.1
cf: info ,key:b_rst value:1366*768
cf: info ,key:en value:e_pv
cf: info ,key:c_time value:1458731943823
cf: info ,key:l value:zh-CN
cf: info ,key:u_sd value:2D24B8A2-B2EF-450C-8C86-4F8B0F3E2785
cf: info ,key:u_ud value:EAB36BC9-0347-4D33-8579-AA8C331D001A
cf: info ,key:os_v value:Windows
cf: info ,key:p_ref value:https://localhost:8080/BIG_DATA_LOG2/demo.jsp
cf: info ,key:province value:unknown
cf: info ,key:s_time value:1458731952690
cf: info ,key:p_url value:https://localhost:8080/BIG_DATA_LOG2/demo.jsp
cf: info ,key:browser value:Firefox
cf: info ,key:sdk value:js
cf: info ,key:pl value:website
cf: info ,key:browser_v value:45.0

3.關鍵指標分析

上麵的ETL完成後我們的結果數據都放在hbase的event_logs表格的info列族中,現在我們需要運行代碼分析這些數據,對我們的數據進行我們前麵的設計文檔中的關鍵指標分析。

(1).代碼結構規範

我們的程序需要定期分析hbase的數據,我們分析的指標有很多,我們需要從hbase中提取的數據也有很多。最後分析完每個指標後我們放進mysql中,供echart做展示。
1. 首先我們分析的指標需要即KPI需要專門的類定義好,放在com.hongya.common.KpiType下麵。
2. 我們需要自定義Key和Value的類型,這些類型包含了需要統計的關鍵維度信息,作為mapreduce任務的輸入輸出key,我們定義好了放在com.hongya.transformer.model.dim下麵。
3. 我們的hadoop任務寫mysql需要有專門的OutputFormat,我們放在com.hongya.transformer.service下麵,由於每個唯獨統計任務寫mysql都不一樣,所以我們通過配置文件的方式傳入,在output-collector.xml中有相關配置。
4. 無論是讀寫mysql還是hbase都有配置,我們通過配置文件的方式傳入,配置文件有query-mapping.xmltransfomer-env.xml

(2).業務代碼實現

上麵分析了業務,我們開始寫mapreduce程序統計分析指標。
我們知道我們現在的mapreduce讀取hbase的數據,然後寫進mysql中,相關代碼我們放在了com.hongya.transformer.mr包下麵。
由於時間關係,我們的業務隻實現了new user指標的統計,大家可以查看com.hongya.transformer.mr.nu包下的內容。
當我們的hbase中有數據時,運行com.hongya.transformer.mr.nu.NewInstallUserRunner,就能看到下麵的結果。

如果你map完成後reduce就失敗 ,沒關係,是因為你的mysql還沒有配置好,我們在後麵會介紹的。

四、數據分析係統架構

我們有了服務器後,接下來的任務就是對服務器的數據進行收集處理,處理後的數據進行展示。我們需要搭建一個完整的服務器,這時候首先需要一個集群,我們在雲端直接使用一個節點的centos作為服務器。首先打開Xshell,連上centos節點,我們這裏節點名為node1

1.部署hadoop和Hbase

(1).部署hadoop

hadoop單節點安裝很簡單,以前講過。直接解壓後,配置hadoop-env.sh、core-site.xml、hdfs-site.xml
1. hadoop-env.sh配置 JAVA_HOME
2. core-site.xml配置

 <property>
    <name>fs.defaultFS</name>
    <value>hdfs://localhost:8020</value>
  </property>
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/opt/data/hadoop</value>
      </property>

然後就能夠格式化,啟動:

hdfs namenode -format
start-dfs.sh

(2).配置Hbase

首先安裝單節點的zookeeper,安裝好後啟動,這個不細說:

zkServer.sh start

然後解壓Hbase安裝包.
1. 配置hbase-env.sh,配置JAVA_HOME,然後將 HBASE_MANAGES_ZK改為false
2. 配置hbase-site.xm

<property>
    <name>hbase.rootdir</name>
    <value>hdfs://localhost:8020/hbase</value>
</property>
<property>
    <name>hbase.cluster.distributed</name>
    <value>true</value>
</property>
<property>
    <name>hbase.zookeeper.quorum</name>
    <value>localhost</value>
</property>
  1. 複製hadoop配置 複製hadoop的 core-site.xml和hdf-site.xml到hbase的conf目錄下 然後就能啟動Hbase了。 啟動hbase後使用hbase shell進入交互窗口,執行建表語句: shell create 'event_logs' ,'info' 如果執行成功了就可以開始下一步了。 ### 2.部署nginx服務 前麵我們將項目發布到tomcat上麵了。正常情況下我們需要通過nginx進行負載均衡,同時收集url的請求日誌。 我們可以安裝nginx,也可以安裝淘寶開源的tengine,比一般nginx多一些功能,而且淘寶上有中文文檔。 #### (1).nginx安裝 步驟如下: shell 1.安裝GCC編譯器等工具: yum install -y gcc gcc-c++ autoconf automake libtool make openssl openssl-devel pcre pcre-devel 2.下載安裝Nginx: wget https://nginx.org/download/nginx-1.6.3.tar.gz 注:這裏也可以下載tengine壓縮包,比一般nginx多一些功能 tar -zxvf nginx-1.6.3.tar.gz cd nginx-1.6.3/ ./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/usr/local/nginx/conf/nginx.conf --pid-path=/usr/local/nginx/logs/nginx.pid \ --with-http_ssl_module \ --with-http_stub_status_module \ --with-http_gzip_static_module \ make && make install 如果正常的話,就安裝好了,然後啟動nginx服務即可。記住啟動之前需要先關閉之前的tomcat,因為他們兩個的端口衝突了。啟動命令是就是nginx,啟動以後,如果不修改配置,我們可以直接打開瀏覽器訪問8080端口,出現這樣就算是成功了。 #### (2).nginx配置 現在我們已經安裝了nginx,我們要配置nginx的反向代理,讓他替我們監聽我們的需要監聽的端口。上麵我們安裝的時候已經配置了配置文件的路徑:/usr/local/nginx/conf/nginx.conf。現在我們修改他的內容。 我們讓它監聽80端口,這樣我們給80端口發送的數據就可以被nginx收集然後我們後期處理: 我們隻需要添加下麵的內容: ``` log_format my_format '$remote_addr^A$msec^A$http_host^A$request_uri';

location = /log.gif {
root html;
## 配置日誌文件保存位置
access_log /opt/data/access.log my_format;
}

修改後的nginx.conf內容大概是這樣的,其實就是添加了一行log_format,然後修改了端口信息:

然後我們通過命令讓配置文件生效: sudo nginx -s reload
#### (3).測試nginx收集日誌
這時候我們可以啟動我們之前的web項目,啟動之前記得修改代碼的url為剛剛配置的地址格式:

然後我們發布運行項目,或者打war包放在tomcat裏麵,然後啟動tomcat。在瀏覽器輸入:`https://localhost:8080/taobaopayment/demo4.jsp` 模擬用戶點擊。如果你發現瀏覽器一直處於刷新狀態,可能你需要換一個瀏覽器:


你還可以運行我們的Test類,來模擬後台的數據,報錯沒關係,隻需要手動點擊停止程序:

然後我們查看剛剛配置的文件,已經有了幾條記錄,是剛剛我們發送的,而且都是我們配置的格式:

到這裏就恭喜,我們的gninx基本完成。
### 3.日誌收集係統
日誌手機一般有兩種方式,shell實現和flume實現。
shell命令前麵大家都熟悉過,flume使用在前麵的SparkStreaming實驗也使用過,我們不介紹過多,簡單回顧一下即可。
首先安裝好flume,配置JAVA_HOME和HADOOP_HOME,然後新建或者複製一個配置文件,log.cfg ,添加下麵的內容:
```shell
# 配置三個組件的名字
agent.sources = r1
agent.channels = c1
agent.sinks = k1

# For each one of the sources, the type is defined
agent.sources.r1.type = exec
## 這裏配置你剛剛手機日誌的文件
agent.sources.r1.command = tail -F /Users/dengziming/opt/data/hongya/taobaopayment/access.log
agent.sources.r1.port = 44444

# The channel can be defined as follows.
agent.channels.c1.type = memory
agent.channels.c1.capacity = 1000
agent.channels.c1.transactionCapacity = 1000

# Each sink's type must be defined
agent.sinks.k1.type = hdfs
agent.sinks.k1.hdfs.path = hdfs://localhost:8020/flume/events/%Y-%m-%d/%H%M/
agent.sinks.k1.hdfs.filePrefix = events-
agent.sinks.k1.hdfs.round = true
agent.sinks.k1.hdfs.roundValue = 10
agent.sinks.k1.hdfs.roundUnit = minute
agent.sinks.k1.hdfs.useLocalTimeStamp = true

#Specify the channel the sink should use
agent.sources.r1.channels = c1
agent.sinks.k1.channel = c1
agent.channels.memoryChannel.capacity = 100

配置好後適用命令啟動:

bin/flume-ng agent --conf conf --conf-file conf/log.cfg --name agent -D flume.root.logger=INFO,console

這樣就會收集我們剛剛nginx的日誌到hadoop的 /flume/events/%Y-%m-%d/%H%M/ 路徑下
恭喜你,馬上就要進入數據分析部分

4.提交數據分析任務

現在我們要開始運行程序,分析數據了。

(1).啟動zookeeper、hadoop、hbase

啟動命令就不說了,然後記得之前我們已經在hbase中創建了表格:

create 'event_logs' ,'info'

(2).運行ETL任務

我們的etl的任務是 com.hongya.etl.mr.ald.AnalyserLogDataRunner,打開這段代碼,我們修改幾個路徑和配置,因為是測試,我們把數據放在本地運行。修改的主要是zookeeper地址和我們剛剛的日誌路徑:

然後運行程序:

然後我們可以根據日誌看到打印的rowKey,我們可以在hbase中查看這些rowKey

(3).創建mysql表格

我們的etl完成後數據放在hbase中,然後我們需要進行統計分析,結果放在mysql,首先是建立mysql表格,我們的表格統一放在數據庫report下麵,首先建庫,然後按照下麵的語句依次建表:

DROP TABLE IF EXISTS `stats_user`;
CREATE TABLE `stats_user` (
  `date_dimension_id` int(11) NOT NULL,
  `platform_dimension_id` int(11) NOT NULL,
  `active_users` int(11) DEFAULT '0' COMMENT '活躍用戶數',
  `new_install_users` int(11) DEFAULT '0' COMMENT '新增用戶數',
  `total_install_users` int(11) DEFAULT '0' COMMENT '總用戶數',
  `sessions` int(11) DEFAULT '0' COMMENT '會話個數',
  `sessions_length` int(11) DEFAULT '0' COMMENT '會話長度',
  `total_members` int(11) unsigned DEFAULT '0' COMMENT '總會員數',
  `active_members` int(11) unsigned DEFAULT '0' COMMENT '活躍會員數',
  `new_members` int(11) unsigned DEFAULT '0' COMMENT '新增會員數',
  `created` date DEFAULT NULL,
  PRIMARY KEY (`platform_dimension_id`,`date_dimension_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='統計用戶基本信息的統計表';

這隻是一個表格,由於我們的表格太多,這裏不展示,我們會將所有數據庫的建表語句放在文件中,大家可以參考,最終如圖:

(4).運行統計任務

新用戶點擊分析任務放在com.hongya.transformer.mr.nu.NewInstallUserRunner中,大家可以查看代碼,然後我們修改一下配置,主要是mysql的用戶名密碼,在DimensionConverterImpl中,另外我們還有查看核對 src/transformer-env.xml 下的內容:
如圖,修改用戶名密碼為你的mysql設置:

修改zookeeper地址和運行的起始日期,你可以設置的小一點:

然後我們點擊運行,我們就可以根據日誌看到map和reduce執行的過程:

執行完成後,我們查看我們剛剛的mysql的report庫的stats_device_browser和stats_user表格:

當然我們還可以查看dimension_browser等其他表格。
程序執行成功。

4.數據轉移係統

數據轉移係統我們使用sqoop,由於我們的部分mapreduce任務每次運行的結果都放在hadoop或者Hbase上麵,我們可能需要手動將關鍵指標轉移到關係型數據庫,然後編寫代碼進行展示。但是在這裏,我們都寫進了mysql,就暫時不適用sqoop了,也是為了減輕大家的負擔。

5.數據展示

數據展示我們使用 jquery + Echart吧。真正項目的echart展示部分一般不需要我們管,會有專門的前端高手負責,所以我們就簡單的做一下吧。以瀏覽器維度為例,我們直接寫sql語句select name,count(*) from dimension_browser group by browser_name,將結果文件寫到echart的option屬性中:

然後重新再瀏覽器段查看吧:

當然我這是一種不可取的做法,因為這種方式顯然是不符合企業生產環境的。真正的生產環境肯定是通過後台和數據庫交互,通過ajax將數據傳給前端展示,我們做的很敷衍,是因為這不是我們的重點。

6.項目發布

這上麵的所有步驟都完成了,就可以發布項目了,我們需要一套任務調度係統。azkaban是目前來說用的比較多的任務調度係統,我們推薦大家課後了解一下azkaban的安裝使用。這裏我們沒法演示了。

項目上線

1.基本步驟

將整個項目設計好以後,就可以上線了,這裏我們總結一下真實項目上線的過程。
1. 軟件的安裝
本地安裝開發環境需要的東西,以及相關的依賴。服務器需要安裝tomcat、nginx、zookeeper、hadoop、Hbase
2. 項目開發
這裏的項目開發有三部分,服務端程序,日誌分析程序,前端展示程序,其中日誌分析程序我們隻完成了new user 開發,剩下的業務由大家自己開發。前端展示程序我們隻是簡單展示,沒有開發,這不是重點。
3. 搭建nginx服務器,監聽80端口
nginx的安裝和部署需要注意很多,安裝完成後修改配置文件。
4. 啟動flume,收集來自nginx的數據
flume配置完成後會收集日誌文件的日誌,按照時間放到hadoop上麵。
5. 發布web項目
將項目打成war包,放到tomcat上,然後瀏覽器就可以訪問,有訪問時會向80端口發送數據。
6. 建表
新建hbase的表格和mysql表格
7. 定時啟動hadoop任務
我們通過以前說過的方法將程序打成jar包,上傳到linux,在Linux上通過hadoop jar命令提交。
8. 啟動展示任務
這裏我們簡單處理一下忽略掉。
9. 將運行和展示任務添加到定時任務進行調度
這部分比較複雜,需要專門的時間學習。

2.自己動手發布程序

  1. 安裝相關軟件,我這裏已經安裝完成,大家自己檢查安裝。
  2. 安裝hadoop、zookeeper、hbase、flume並配置
    這部分不詳細講解,配置方法上麵都有,配置好以後啟動相應集群。啟動命令分別為:

    start-dfs.sh
    start-yarn.sh
    start-hbase.sh
    bin/flume-ng agent -c ./conf -f ./conf/log.cfg -n agent 
    

    至少有這些java進程:

  3. 安裝nginx,啟動nginx服務,修改nginx的配置文件,監聽80端口,並且收集格式為: /log.gif 的url。
    可以在瀏覽器訪問linux的80端口:

  4. 項目打war包,放到tomcat中。
    打包之前,修改代碼的url為你的linux節點加上log.gif

    然後打成war包,名字為:taobaopayment.war,放在tomcat的webapps目錄下,使員工startup.sh 啟動tomcat,訪問8080端口,然後訪https://node1:8080/taobaopayment/demo4.jsp
    如果這裏一直在刷新,那麼需要換一個瀏覽器:

    比如我用Safari瀏覽器,不斷點擊,產生數據:

  5. 創建hbase和mysql表格
    hbase創建event_logs表格,info列族,
    mysql建表語句文件裏有。

  6. 執行mapreduce的ETL任務
    你可以選擇打jar包,或者在本地執行,執行的主類是:com.hongya.etl.mr.ald.AnalyserLogDataRunner
    需要修改zookeeper配置和輸入路徑,如果在集群上運行,這個輸入路徑是前麵配置的flume手機日誌的路徑。

    執行完成後,可以去hbase查看數據。

  7. 運行分析程序
    分析程序基於我們剛剛的結果,主類為:com.hongya.transformer.mr.nu.NewInstallUserRunner,運行之前需要在DimensionConverterImpl類中設置mysql的連接信息。

  8. 查看mysql數據庫的結果,並展示
    查看mysql的結果:

    數據展示模塊,需要使用Echart,脫離了我們的實驗主題,我們簡單模擬,訪問瀏覽器的:https://node1:8080/taobaopayment/showUser.jsphttps://node1:8080/taobaopayment/showBrowser.jsp

最後更新:2017-11-03 12:04:23

  上一篇:go  iphone7plusid被停用怎麼解鎖
  下一篇:go  iphone7忘記密碼被鎖了怎麼辦