1. 程式人生 > >大資料技術學習筆記之hive框架基礎3-sqoop工具的使用及具體業務分析

大資料技術學習筆記之hive框架基礎3-sqoop工具的使用及具體業務分析

一、CDH版本的介紹及環境部署
    -》Hadoop的三大發行版本
        -》Apache Hadoop
        -》cloudera Hadoop:CDH
        -》Hortonworks: HDP
    -》選用CDH版本的好處
        -》解決每個框架之間的相容性問題
        -》不需要對其他框架進行對應版本的編譯
    -》cdh5框架的下載:cdh-5.3.6
        -》http://archive.cloudera.com/cdh5/cdh/5/
    -》安裝部署CDH版本
        -》建立CDH版本目錄
            sudo mkdir /opt/cdh-5.3.6
            sudo chown -R hpsk:hpsk /opt/cdh-5.3.6
        -》Hadoop
            -》下載解壓
            -》修改配置檔案
                ->hadoop-env.sh
                ->core-site.xml
                ->hdfs-site.xml
                ->mapred-site.xml
                ->yarn-site.xml
                ->slaves
            -》格式化HDFS
                bin/hdfs namenode -format
            -》啟動
        -》Hive
            -》下載解壓
            -》修改配置檔案
                ->hive-env.sh
                ->hive-site.xml
                ->log4j
            -》新增MySQL的連線驅動包
            -》啟動
            -》建立表
            
二、sqoop的介紹及安裝部署
    -》sqoop的功能:用於hdfs與rdbms之間資料的匯入匯出
    -》資料分析的業務流程
        -》資料清洗
            -》欄位的過濾
            -》欄位的補充    -》使用者、訂單、商品、一般儲存在RDBMS-》用sqoop實現
            -》欄位格式化
        -》資料分析後的資料儲存
            -》HDFS
            -》將分析好的資料匯出到MySQL中,供資料展示層進行讀取
    -》sqoop不僅僅支援將資料匯入到hdfs
        -》hive
        -》hbase
    -》sqoop的底層實現原理
        -》使用引數來使用sqoop命令即可
        -》sqoop底層封裝的是一個MapReduce程式
        -》將引數傳遞給MapReduce,然後進行打包,提交給yarn執行
        -》只有map task,沒有reduce task,不進行排序合併等操作
    -》sqoop版本
        -》sqoop1:選用1.4.5
        -》sqoop2:添加了sqoop server ,安全機制等等
    -》sqoop中的匯入匯出,基於HDFS而言
    -》sqoop的安裝部署
        -》下載解壓
            tar -zxvf /opt/tools/sqoop-1.4.5-cdh5.3.6.tar.gz -C /opt/cdh-5.3.6/
        -》修改配置檔案(宣告環境變數)
            mv conf/sqoop-env-template.sh conf/sqoop-env.sh
            export HADOOP_COMMON_HOME=/opt/cdh-5.3.6/hadoop-2.5.0-cdh5.3.6
            export HADOOP_MAPRED_HOME=/opt/cdh-5.3.6/hadoop-2.5.0-cdh5.3.6
            export HIVE_HOME=/opt/cdh-5.3.6/hive-0.13.1-cdh5.3.6
        -》新增MySQL的連線驅動包
            cp /opt/tools/mysql-connector-java-5.1.27-bin.jar lib/
            -》新增jacon
        -》測試
            -》幫助命令
                bin/sqoop help
                bin/sqoop list-databases --connect jdbc:mysql://bigdata-training01.hpsk.com:3306 --username root --password 123456
            
三、sqoop的匯入
    -》將MySQL中的資料匯入到HDFS
        -》在MySQL中建立資料
            create table toHdfs(
            id varchar(20) primary key,
            name varchar(20) not null
            );
            insert into toHdfs value("0001","laoda");
            insert into toHdfs value("0002","laoer");
            insert into toHdfs value("0003","laosan");
            insert into toHdfs value("0004","laosi");
        -》使用SQOOP將資料匯入到HDFS
            usage: sqoop import [GENERIC-ARGS] [TOOL-ARGS]
            bin/sqoop import \
            --connect jdbc:mysql://bigdata-training01.hpsk.com:3306/sqoop \
            --username root \
            --password 123456 \
            --table toHdfs
            -》預設的輸出路徑:使用者的家目錄
            -》指定匯入目錄
                --target-dir
            -》指定maptask的個數
                -m
            -》提前刪除已存在的目錄
                bin/sqoop import \
                --connect jdbc:mysql://bigdata-training01.hpsk.com:3306/sqoop \
                --username root \
                --password 123456 \
                --table toHdfs \
                --direct \
                --delete-target-dir \
                --target-dir /sqoop/import/ \
                -m 1
            -》指定匯入分隔符
                --fields-terminated-by
                
                bin/sqoop import \
                --connect jdbc:mysql://bigdata-training01.hpsk.com:3306/sqoop \
                --username root \
                --password 123456 \
                --table toHdfs \
                --direct \
                --delete-target-dir \
                --target-dir /sqoop/import/ \
                --fields-terminated-by '\t' \
                -m 1
            -》指定匯入某些列
                 --columns
                bin/sqoop import \
                --connect jdbc:mysql://bigdata-training01.hpsk.com:3306/sqoop \
                --username root \
                --password 123456 \
                --table toHdfs \
                --columns id \
                --direct \
                --delete-target-dir \
                --target-dir /sqoop/columns \
                --fields-terminated-by '\t' \
                -m 1
            -》指定匯入SQL語句結果
                -e,--query <statement>
                -》不能與--table一起使用
                bin/sqoop import \
                --connect jdbc:mysql://bigdata-training01.hpsk.com:3306/sqoop \
                --username root \
                --password 123456 \
                --query 'select name from toHdfs where $CONDITIONS' \
                --direct \
                --delete-target-dir \
                --target-dir /sqoop/columns \
                --fields-terminated-by '\t' \
                -m 1
        -》如果MySQL中的資料,是動態變化的,如何保證資料同步的問題?
            -》如果每天都有增加的資料。每次匯入到hdfs時,會不會包含之前匯入過的資料?
            -》如果MySQL中的資料被修改,如何解決HDFS上的資料同步?
        -》增量匯入(追加資料方式)
        Incremental import arguments:3個引數配置:
       --check-column <column>        Source column to check for incremental
                                      change
       --incremental <import-type>    Define an incremental import of type
                                      'append' or 'lastmodified'
       --last-value <value>           Last imported value in the incremental
                                      check column
        -》check-column:用於記錄匯入的標誌列
        -》incremental:匯入的型別
            -》append:追加
            -》lastmodified:根據時間進行匯入
        -》last-value:上一次匯入時的最後一個值

            create table toHdfsIN(
            id int primary key,
            name varchar(20) not null
            );
            insert into toHdfsIN value("1","laoda");
            insert into toHdfsIN value("2","laoer");
            insert into toHdfsIN value("3","laosan");
            insert into toHdfsIN value("4","laosi");
            insert into toHdfsIN value("5","laowu");
            insert into toHdfsIN value("6","laoliu");

            bin/sqoop import \
            --connect jdbc:mysql://bigdata-training01.hpsk.com:3306/sqoop \
            --username root \
            --password 123456 \
            --table toHdfsIN \
            --direct \
            --delete-target-dir \
            --target-dir /sqoop/incremental/ \
            --fields-terminated-by '\t' \
            -m 1
            -》增量匯入不能與--delete-target-dir一起使用
                bin/sqoop import \
                --connect jdbc:mysql://bigdata-training01.hpsk.com:3306/sqoop \
                --username root \
                --password 123456 \
                --table toHdfsIN \
                --direct \
                --target-dir /sqoop/incremental/ \
                --fields-terminated-by '\t' \
                --check-column id \
                --incremental append \
                --last-value 4 \
                -m 1

        -》增量匯入一般都使用sqoop job來執行
            bin/sqoop-job \
            --create job1 \
            -- import \
            --connect jdbc:mysql://bigdata-training01.hpsk.com:3306/sqoop \
            --username root \
            --password 123456 \
            --table toHdfsIN \
            --direct \
            --target-dir /sqoop/incremental/ \
            --fields-terminated-by '\t' \
            --check-column id \
            --incremental append \
            --last-value 4 \
            -m 1
            -》檢視job:bin/sqoop job --show job1
            -》執行job1:bin/sqoop job -exec job1
            
    -》匯入HIVE
        bin/sqoop import \
        --connect jdbc:mysql://bigdata-training01.hpsk.com:3306/sqoop \
        --username root \
        --password 123456 \
        --table toHdfs \
        --delete-target-dir \
        --hive-import  \
        --hive-database student \
        --hive-table stu_info \
        --fields-terminated-by '\t' \
        -m 1
        -》實際過程
            -》MapReduce將MySQL中的資料儲存到hdfs的家目錄
            -》將資料從hdfs的家目錄載入到hive表中去
    
四、sqoop的匯出
    -》將HDFS(HIVE)中的資料匯出到MySQL
        -》bin/sqoop export --help
    
        bin/sqoop export \
        --connect jdbc:mysql://bigdata-training01.hpsk.com:3306/sqoop \
        --username root \
        --password 123456 \
        --table fromHdfs \                                             //要匯入的mysql目標表格
        --export-dir /user/hive/warehouse/student.db/stu_info \   //HDFS要匯出的檔案路徑
        
        --input-fields-terminated-by '\t' \
        -m 1
    -》使用sqoop執行檔案(而不是命令列)
        bin/sqoop --options-file file_path
        bin/sqoop --options-file /opt/datas/sqoop.txt
        檔案格式注意:
        換行不要,一個引數一行
        export
        --connect jdbc:mysql://bigdata-training01.hpsk.com:3306/sqoop
        --username
        root
        --password
        123456
        --table
        fromHdfs                                         
        --export-dir
        /user/hive/warehouse/student.db/stu_info  
        --input-fields-terminated-by
        '\t'
        -m
        1
五、使用者行為案例分析
    -》需求分析
        -》需求:統計每天每小時的PV,UV數
        -》實現過程
            -》建立hive表載入源資料
                -》建立分割槽表,兩級分割槽
            -》過濾欄位,提取需要的欄位
            -》統計PV
                count(URL)
            -》統計UV
                count(distinct guid)
            -》生成結果表
                date    hour    PV        UV
            -》匯出到MySQL
                sqoop
    -》資料採集
        create database log_analysis;
        use log_analysis;
        create table log_source(
        id                  string,
        url                 string,
        referer             string,
        keyword             string,
        type                string,
        guid                string,
        pageId              string,
        moduleId            string,
        linkId              string,
        attachedInfo        string,
        sessionId           string,
        trackerU            string,
        trackerType         string,
        ip                  string,
        trackerSrc          string,
        cookie              string,
        orderCode           string,
        trackTime           string,
        endUserId           string,
        firstLink           string,
        sessionViewNo       string,
        productId           string,
        curMerchantId       string,
        provinceId          string,
        cityId              string,
        fee                 string,
        edmActivity         string,
        edmEmail            string,
        edmJobId            string,
        ieVersion           string,
        platform            string,
        internalKeyword     string,
        resultSum           string,
        currentPage         string,
        linkPosition        string,
        buttonPosition      string
        )
        partitioned by (date string,hour string)
        row format delimited fields terminated by '\t'
        stored as textfile;
        load data local inpath '/opt/datas/2015082818' into table log_source partition (date='20150828',hour='18');
        load data local inpath '/opt/datas/2015082819' into table log_source partition (date='20150828',hour='19');
    -》資料清洗
        -》提取欄位:
            -》手動分割槽
                create table log_clear_part1(
                id  string,
                url string,
                guid string
                )
                partitioned by (date string,hour string)
                row format delimited fields terminated by '\t'
                stored as textfile;

                insert into table log_clear_part1 partition (date='20150828',hour='18')
                select id,url,guid from log_source where date='20150828' and hour='18';
                insert into table log_clear_part1 partition (date='20150828',hour='19')
                select id,url,guid from log_source where date='20150828' and hour='19';
        -》動態分割槽:一條語句實現自動分割槽
            -》引數配置:
            hive.exec.dynamic.partition=true
            hive.exec.dynamic.partition.mode=nonstrict
            
            create table log_clear_part2(
            id  string,
            url string,
            guid string
            )
            partitioned by (date string,hour string)
            row format delimited fields terminated by '\t'
            stored as textfile;
            insert into table log_clear_part2 partition (date='20150828',hour)
            select id,url,guid,hour from log_source where date='20150828';
            
    -》資料分析
        create table result(
        date string ,
        hour string,
        PV string,
        UV string
        );
        insert overwrite table result select date,hour,count(url) PV ,count(distinct guid) UV from log_clear_part2 group by date,hour;
    -》資料儲存
        mysql中:
        create table result_visit(
        date varchar(30) not null,
        hour varchar(30) not null,
        pv varchar(30) not null,
        uv varchar(30) not null,
        primary key(date,hour)
        );

    -》hive預設的分隔符:\001
        bin/sqoop export \
        --connect jdbc:mysql://bigdata-training01.hpsk.com:3306/sqoop \
        --username root \
        --password 123456 \
        --table result_visit \
        --export-dir /user/hive/warehouse/log_analysis.db/result \
        --input-fields-terminated-by '\001' \
        -m 1