Hadoop專案實戰-使用者行為分析之編碼實踐

哥不是小蘿莉發表於2015-06-24

1.概述

  本課程的視訊教程地址:《使用者行為分析之編碼實踐

  本課程以使用者行為分析案例為基礎,帶著大家去完成對各個KPI的編碼工作,以及應用排程工作,讓大家通過本課程掌握Hadoop專案的編碼、排程流程。下面我們來看看本課程有哪些課時,如下圖所示:

  首先,我們來學習第一課時:《Hadoop專案基礎程式碼》。

2.內容

2.1 Hadoop專案基礎程式碼

  本課時介紹編寫Hadoop基礎程式碼及指令碼,在前面搭建好的Hadoop專案工程上, 完成專案的基本程式碼的編寫,以及一些注意事項,為編寫核心程式碼做準備,讓大家掌握Hadoop專案的基礎程式碼開發。

  本課時主要包含以下知識點,如下圖所示:

  下面,我為大家介紹Hadoop專案工程的基本資訊配置,由於本課程屬於編碼實踐,所以設計到編碼的相關流程。 所以大家在學習的時候,請事先將叢集啟動,IDE開啟。下面我給大家演示如下內容,他們分別是:

  • 專案工程的相關配置資訊(pom檔案的依賴配置,log日誌資訊的配置)
  • 叢集資訊的相關配置(連線叢集節點路徑資訊) 

  基礎程式碼實現包含的內容,如下圖所示:

  具體演示細節,大家可以觀看視訊,這裡我就不多做贅述了。《觀看地址

2.2 Hadoop專案核心地址實現

  本課時介紹如何去實現Hadoop的核心程式碼模組, 在基礎程式碼模組上,完成核心程式碼的實現,讓大家掌握專案相關指標的統計開發。

  下面我們來看看本課時有那些知識點,如下圖所示:

  下面我們來看看離線結果統計的處理方式有哪些,這裡,我用一個圖來說明,在離線統計中的統計方式,如下圖所示:

  這裡,從圖中我們可以看出,我們可以使用編寫Hive指令碼或Hive應用程式來統計, 也可以編寫MapReduce程式來完成統計,也可以組合使用,這裡,本課程的案例, 我使用的是組合使用,用Hive和MapReduce組合來完成。

  接著來看核心程式碼實現的內容,如下圖所示:

  指令碼如下所示:

#建立分割槽
CREATE EXTERNAL TABLE ubas(ip string, timespan string, url string,hour string)PARTITIONED BY (logdate string) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION '/home/hdfs/ubas/out/meta'

  統計的KPI指令碼,如下所示:

# clean hdfs data and output 
/home/hadoop/hadoop-2.6.0/bin/hadoop jar ubas-1.0.0-jar-with-dependencies.jar $1

# use hive to stats

## 1.location data to partition
/home/hadoop/hive-0.14.0-bin/bin/hive -e "ALTER TABLE ubas ADD PARTITION(logdate='$1') LOCATION '/home/hdfs/ubas/out/meta/$1';"

## 2.stats pv
/home/hadoop/hive-0.14.0-bin/bin/hive -e "CREATE TABLE pv_$1 AS SELECT COUNT(1) AS PV FROM ubas WHERE logdate='$1';"

## 3.stats ip
/home/hadoop/hive-0.14.0-bin/bin/hive -e "CREATE TABLE ip_$1 AS SELECT COUNT(DISTINCT ip) AS IP FROM ubas WHERE logdate='$1';"

## 4.stats amount hour
/home/hadoop/hive-0.14.0-bin/bin/hive -e "CREATE TABLE amount_$1 ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' AS SELECT '$1',hour AS HOUR_TAG, COUNT(hour) AS HOUR,'' AS UPDATE_DATE FROM ubas WHERE logdate='$1' GROUP BY hour;"

## 5.stats jr
/home/hadoop/hive-0.14.0-bin/bin/hive -e "CREATE TABLE jr_$1 AS SELECT COUNT(1) AS JR FROM (SELECT COUNT(ip) AS times FROM ubas WHERE logdate='$1' GROUP BY ip HAVING times=1) e;"

## 6.combine pv,ip,jr and tr to ubas table
/home/hadoop/hive-0.14.0-bin/bin/hive -e "CREATE TABLE ubas_$1 ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' AS SELECT '$1', a.pv, b.ip, c.jr, ROUND(COALESCE(CAST(b.ip AS DOUBLE), 0)/a.pv, 2),'' AS UPDATE_DATE FROM pv_$1 a JOIN ip_$1 b ON 1=1 JOIN jr_$1 c ON 1=1 ;"

# sqoop data to mysql

## 1.sqoop t_kpi_day
/home/hadoop/sqoop-1.4.5/bin/sqoop export -D sqoop.export.records.per.statement=100 --connect jdbc:mysql://10.211.55.26:3306/hadoop_ubas --username root --password root --table t_kpi_day --fields-terminated-by ',' --export-dir "/home/hive/warehouse/ubas_$1" --batch --update-key createdate --update-mode allowinsert;

## 2.sqoop t_kpi_hour
/home/hadoop/sqoop-1.4.5/bin/sqoop export -D sqoop.export.records.per.statement=100 --connect jdbc:mysql://10.211.55.26:3306/hadoop_ubas --username root --password root --table t_kpi_hour --fields-terminated-by ',' --export-dir "/home/hive/warehouse/amount_$1" --batch --update-key createdate,kpi_code --update-mode allowinsert;

# drop tmp table to hive warehouse
/home/hadoop/hive-0.14.0-bin/bin/hive -e "drop table amount_$1;drop table ip_$1;drop table jr_$1;drop table pv_$1;drop table ubas_$1;"

2.3 統計結果處理

  本課時介紹將統計好的資料匯出到關係型資料庫,以及對外提供資料共享介面,讓大家掌握匯出資料的流程及共享介面程式的編寫。

   本課時主要有一下知識點,如下圖所示:

  下面我們來看看使用 Sqoop 如何將 HDFS 上的統計結果匯出到 MySQL 資料庫, 接下來,我們來看看 Sqoop 的匯出流程,如下圖所示:

  首先,我們是將統計結果存放在 HDFS 叢集上,然後我們使用 Sqoop 工具去將 HDFS 的資料匯出到關係型資料庫,如 MySQL 整個基本流程就是這樣。下面我們來使用 Sqoop 工具對HDFS 上的資料進行匯出,同樣,在使用匯出功能時,這樣大家需要 安裝 Sqoop 工具,Sqoop 的安裝較為簡單,大家可以下去補充學習下,這裡就不多做贅述了。

  接下來,我們來看看資料共享流程,如下圖所示:

  從圖中我們可以看出,我們將統計後的結果存放在mysql資料庫中,這時我們需要編寫一個rpc將資料共享出去,這裡我採用的共享方式是, 編寫一個thrift的服務介面,將資料通過這個介面共享出去,然後,前端同學獲取資料後,可以將資料結果以圖表的方式進行展示。

  Thrift介面程式碼,如下所示:

  • Thrift介面檔案
namespace java cn.jikexueyuan.ubas.service

service UBASService {
    map<string, double> queryDayKPI(1:string beginDate,2:string endDate),
    map<double, double> queryHourKPI(1:string beginDate,2:string endDate)
}
  • Server模組程式碼
package cn.jikexueyuan.ubas.main;

import org.apache.thrift.TProcessorFactory;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.server.THsHaServer;
import org.apache.thrift.server.TServer;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TNonblockingServerSocket;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import cn.jikexueyuan.ubas.service.UBASService;
import cn.jikexueyuan.ubas.service.impl.UBASServiceImpl;

/**
 * @Date Mar 23, 2015
 *
 * @Author dengjie
 */
public class StatsServer {

    private static Logger logger = LoggerFactory.getLogger(StatsServer.class);

    private final int PORT = 9090;

    @SuppressWarnings({ "rawtypes", "unchecked" })
    private void start() {
        try {
            TNonblockingServerSocket socket = new TNonblockingServerSocket(PORT);
            final UBASService.Processor processor = new UBASService.Processor(new UBASServiceImpl());
            THsHaServer.Args arg = new THsHaServer.Args(socket);
            /*
             * Binary coded format efficient, intensive data transmission, The
             * use of non blocking mode of transmission, according to the size
             * of the block, similar to the Java of NIO
             */
            arg.protocolFactory(new TCompactProtocol.Factory());
            arg.transportFactory(new TFramedTransport.Factory());
            arg.processorFactory(new TProcessorFactory(processor));
            TServer server = new THsHaServer(arg);
            server.serve();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public static void main(String[] args) {
        try {
            logger.info("start thrift server...");
            StatsServer stats = new StatsServer();
            stats.start();
        } catch (Exception ex) {
            ex.printStackTrace();
            logger.error(String.format("run thrift server has error,msg is %s", ex.getMessage()));
        }
    }

}

2.4 應用排程

  本課時介紹將開發的Hadoop應用打包部署到伺服器,配置並完成應用排程, 讓大家掌握Hadoop專案的打包和部署及排程流程。

  本課時主要包含一下知識點,如下圖所示:

  下面,我們來看看專案打包外掛的使用,首先打包的內容,下面我們來看一張圖,如下圖所示:

  關於使用Crontab進行定時排程,詳情大家可以觀看視訊教程,這裡我就不多做贅述了。《觀看地址

  本課程我們對專案的指標進行了編碼實踐,並指導大家去編碼實現相應的模組功能,以及幫助大家去排程我們開發的應用等知識,應該掌握一下知識,如下圖所示:

3.總結

  我們在有了這些知識作為基礎,會使得我們在今後的工作中,開發類似的Hadoop專案變得遊刃有餘,更加的得心應手。

4.結束語

  這就是本課程的主要內容,主要就對Hadoop專案做相應的編碼實踐,完成各個KPI的開發模組。

  如果本教程能幫助到您,希望您能點選進去觀看一下,謝謝您的支援!

  轉載請註明出處,謝謝合作!

    本課程的視訊教程地址:《使用者行為分析之編碼實踐

相關文章