Hadoop 之 hive 學習

     1. hive介紹

    Hive 是建立在Hadoop上的數據倉庫基礎構架。它提供了一系列的工具,可以用來進行數據提取轉化加載(ETL),這是一種可以存儲、查詢和分析存儲在 Hadoop  中的大規模數據的機制。Hive 定義了簡單的類 SQL  查詢語言,稱爲 QL ,它允許熟悉 SQL  的用戶查詢數據。同時,這個語言也允許熟悉 MapReduce  開發者的開發自定義的 mapper和reducer來處理內建的mapper和reducer無法完成的複雜的分析工作。

    Hive是SQL解析引擎,它將SQL語句轉譯成M/R Job然後在Hadoop執行。

    Hive的表其實就是HDFS的目錄/文件,按表名把文件夾分開。如果是分區表,則分區值是子文件夾,可以直接在M/R Job裏使用這些數據

    HIVE支持數據更新,有限更新;支持列式數據庫;


    2、Hive架構與基本組成
    下面是Hive的架構圖。
圖1.1 Hive體系結構

   Hive的體系結構可以分爲以下幾部分:
    (1)用戶接口主要有三個:CLI,Client 和 WUI。其中最常用的是CLI,Cli啓動的時候,會同時啓動一個Hive副本。Client是Hive的客戶端,用戶連接至Hive Server。在啓動 Client模式的時候,需要指出Hive Server所在節點,並且在該節點啓動Hive Server。 WUI是通過瀏覽器訪問Hive。
    (2)Hive將元數據存儲在數據庫中,如mysql、derby。Hive中的元數據包括表的名字,表的列和分區及其屬性,表的屬性(是否爲外部表等),表的數據所在目錄等。
    (3)解釋器、編譯器、優化器完成HQL查詢語句從詞法分析、語法分析、編譯、優化以及查詢計劃的生成。生成的查詢計劃存儲在HDFS中,並在隨後有MapReduce調用執行。
    (4)Hive的數據存儲在HDFS中,大部分的查詢、計算由MapReduce完成(包含*的查詢,比如select * from tbl不會生成MapRedcue任務)。

    Hive將元數據存儲在RDBMS中,


     3. hive 與 mysql數據庫

    因爲HIVE的元數據保存在MYSQL中,所以實際使用時需要在LINUX下安裝和使用mysql數據庫;

     一,安裝說明

按實驗手冊完成安裝;

啓動mysql時,使用root用戶;

/etc/init.d/mysql  restart    //重啓服務

service mysql status       //查看狀態;

進入mysql客戶端,使用root用戶,注意u和root之間沒有空格;

mysql  -uroot            //初始安裝後,root用戶無密碼,可以設置密碼

或者mysql –uroot –p      //使用密碼登陸

    二,使用mysql

查看內置用戶, mysql數據庫的user表(show tabes查看)。

在mysql下:

show databases;       //包含系統數據庫mysql

select Host, User, Password from mysql.user;   //查看系統的用戶表

   

        新建mysql 用戶hadoop(密碼hadoop),並授權其在本機或者任何其他機器使用密碼登陸,並可以操作任何數據庫;注意,該字符的定界符,不是單引號’,而是`(鍵盤中,波浪線~鍵下方的按鍵);然後刷新權限。

mysql>grant all on *.* to hadoop@'%' identified by 'hadoop';

mysql>grant all on *.* to hadoop@'localhost' identified by 'hadoop';

mysql>grant all on *.* to hadoop@'master' identified by 'hadoop';

mysql>flush privileges; 

在NAVICAT 工具中連接虛擬機數據庫,要授權給root用戶(允許其他其他機器訪問本數據庫);

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'zkpk' WITH GRANT OPTION;

FLUSH  PRIVILEGES;


4. Hive QL 操 作

1, 內部表的建立和使用

create table stest(id int,name string) row format delimited fields terminated by ‘\t’;

describe stest;

//編輯文件testdata1(兩個字段,以\t分隔, 輸入幾行數據),並上傳(注意文件路徑)到表中;

load data local inpath '/home/zkpk/testdata1' overwrite into table stest;

select * from stest;

   2, 外部表的建立和使用

create external table stest_ext(id int,name string) row format delimited fields terminated by ‘\t’ location ‘/hive/ext’;

show create table stest_ext;

//編輯文件testdata2(兩個字段,以\t分隔),並上傳到表中;

load data local inpath '/home/zkpk/testdata2' overwrite into table stest_ext;

select * from stest_ext;

   3, 分區表的建立和使用

create external table stest_par(id int,name string) partitioned by (class string) row format delimited fields terminated by ‘\t’ location ‘/hive/par’;

show create table stest_par;

//編輯文件testdata3(兩個字段,以\t分隔),並上傳到表中;

load data local inpath '/home/zkpk/testdata3' overwrite into table stest_par patition (class='A');

//編輯文件testdata4(兩個字段,以\t分隔),並上傳到表中;

load data local inpath '/home/zkpk/testdata4' overwrite into table stest_par patition (class='B');

dfs -cat  /hive/par/testdata3;

select * from stest_par;

select * from stest_par a where a.class='A';

4  建Bucket表                                                           

                  CREATE TABLE par_table(viewTime INT, userid BIGINT,

                  page_url STRING, referrer_url STRING,
                  ip STRING COMMENT 'IP Address of the User')
                 COMMENT 'This is the page view table'
                 PARTITIONED BY(date STRING, pos STRING)
                 CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS
                 ROW FORMAT DELIMITED ‘\t’

                   FIELDS TERMINATED BY '\n'
               STORED AS SEQUENCEFILE;

               複製一個空表

                   CREATE TABLE empty_key_value_store

                    LIKE key_value_store;


                  刪除表

                 DROP TABLE table_name


5. Hive數據處理案例--搜狗搜索日誌分析


    1.數據和腳本程序(用於數據預處理)準備

       使用SSH Secure File Transfer Client 將所需文件傳到Linux虛擬機的本地目錄

    2.數據預處理

       1.數據擴展

          將日誌記錄的時間字段拆分,添加年,月,日,小時字段

          進入腳本程序所在的文件目錄,執行:bash sogou-log-extend.sh                                     /home/sogou_data/sogou.500w.utf8  /home/sogou_data/sogou.500w.utf8.ext

       2.數據過濾

           過濾掉某幾個字段爲空的行(使用到數據擴展之後產生的數據)

           進入腳本程序所在的文件目錄,執行:bash sogou-log-extend.sh                                      /home/sogou_data/sogou.500w.utf8.ext /home/sogou_data/sogou.500w.utf8.flt

    3.基於Hive構建日誌數據的數據倉庫

          首先在集羣運行的環境下啓動hive:啓動命令 bin/hive,之後創建一個搜狗數據庫:create                 database sogou

          創建擴展4個字段(年,月,日,小時)數據的外部表

          創建一個按年,月,日,小時分區的分區表

    4.數據倉庫建好之後就可以對數據進行分析了

          1. 實現數據分析需求一:條數統計

             1.數據總條數:

              Select count(*)  from sogou_flt;

              

             2.獨立uid總數:

              Select  count(distinct(uid))  from sogou_flt;

              

         2.實現數據分析需求二:關鍵詞分析

             1.查詢關鍵詞長度統計:

                

             

             2.查詢頻度排名(頻度最高的前50詞): 

               Selectkeyword, count(*) as cnt from sogou_flt group by keyword order by cnt                  keyworddesc limit 50;     

                                         

總結:Hive是一個基於Hadoop文件系統之上的數據倉庫架構,它爲數據倉庫的管理提供了許多功能:數據ETL(抽取,轉換和加載)工具,數據存儲管理和大型數據集的查詢和分析能力。同時Hive定義了類SQL語言---Hive QL,Hive QL允許用戶進行和SQL相似的操作,還允許開發人員方便的使用Mapper和Reducer操作。總之,Hive是一種數據倉庫技術,用於查詢,管理和分析存儲在分佈式存儲系統上的海量結構化和非結構化的數據。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章