大資料4.2 -- hive資料庫

項羽齊發表於2018-04-03

  

  1 Hive

      Hadoop在海量離線資料分析時遇到的問題:

      開發除錯一個複雜的MR程式,不適合要求快速得出結果的業務場景。

      Hadoop是由Java開發的,MR天生對java支援最好,對其他語言的使用者不太友好。

      需要對Hadoop底層具有一定的瞭解,並且要記憶大量的API,才能開發出一個優秀MR

      

      

 

      hive是一個基於hadoop資料倉儲,使用hiveQL(類sql)來實現分散式離線資料處理。

      hive的優點:

            1、不需要開發除錯複雜的MR,適用於要求快速出結果的業務場景。

            2、類SQL請多對所有的程式設計師都比較友好

            3、不需要對hadoop底層有過深的瞭解

            4、支援使用java或其他語言處理邏輯封裝成UDF,來豐富函式庫。

      資料倉儲的概念:

        資料倉儲是一個面向主題的,穩定的反映歷史資料的資料儲存系統,一般用來為管理者提供決策分析。

        資料倉儲和資料庫的區別:

            

        資料表:

          內部表:先有表,後有資料。刪除表時,資料清空。

          外部表:先有資料,後有表。刪除表時,資料依然保留。

 

        分割槽:

          分割槽實現了資料倉儲的面向主題的設計思想。

        分桶表:

          分桶表是用來測試,用hash模餘的方式實現每桶中的資料都具有一定的代表性。

        

     

    1.1 概述

      Hive是建立在 Hadoop 上的資料倉儲基礎構架。它提供了一系列的工具,可以用來進行資料提取轉化載入(ETL),這是一種可以儲存、查詢和分析儲存在 Hadoop 中的大規模資料的機制。Hive 定義了簡單的類 SQL 查詢語言,稱為 HQL,它允許熟悉 SQL 的使用者查詢資料。同時,也允許開發者使用java等語言解決複雜邏輯問題,並封裝起來成為一個自定義函式(UDF),載入到hive中,來彌補原函式庫的不足。

           

 

 

      1.1.1 資料倉儲

        資料倉儲是一個面向主題的,穩定的,反映歷史資料的資料儲存系統,一般用來為管理者提供決策分析。

       

 

    1.2 Hive的安裝

        Hive的安裝非常簡單,上傳,解壓,啟動。前提是,Hadoop要全量啟動。配置JAVA_HOMEHADOOP_HOME

      Hadoop啟動:

        Start-all.sh全量啟動hadoop

         

 

      如果以上hadoop相關程式不全,先執行stop-all.sh停掉所有服務,然後start-all.sh重新啟動。

       

      Hive的啟動:

        進入hivebin目錄,執行./hive

         

 

    1.3 基礎操作

        1.3.1 建立資料庫

          Create database db1;

           

 

          結論一:hive中的資料庫在HDFS中就是/user/hive/warehouse目錄下的一級以資料庫名+.db命名的資料夾

        1.3.2 建立表

          create table tb_user (id int,name string) ;

           

 

          結論二:hive中的表在HDFS中就是在對應資料庫資料夾下的一個資料夾。

      1.3.3 插入資料

        insert into table tb_user values(1,'dongcc');

           

 

          結論三:hive在必要時會將HQL翻譯成MR來執行。

           

 

          結論四:hive中的資料以檔案的形式存放在HDFS中對應表的目錄下。

      1.3.4 載入資料

          Load data local inpath ‘檔案路徑’ into table tb_user;

           

 

      1.3.5 建立帶有分隔符的表

        create table tb_book (id int ,name string) row format delimited fields terminated by '\t';

         

      1.3.6 Default資料庫

         

 

        結論五:default資料庫在HDFS中將資料直接存放在/user/hive/warehouse目錄下。

 

      1.3.7 可能遇到的問題

        Hive啟動不了

        檢查JAVA_HOMEHADOOP_HOME是否配置成功。如果沒有問題並報錯:Cannot find hadoop installation: $HADOOP_HOME or $HADOOP_PREFIX must be set or hadoop must be in the path

        解決辦法:

        指定HADOOP_HOME路徑

          cd /usr/local/src/hive/apache-hive-1.2.0-bin/conf

          cp hive-env.sh.template hive-env.sh

          vim hive-env.sh

          增加HADOOP_HOME

           

          HADOOP_HOME=/usr/local/src/hadoop/hadoop-2.7.1

        Hive啟動報錯Safe mode

           

 

          Hadoop在啟動時有個安全模式,其在啟動時有些工作要做,後設資料的處理,DataNode的等待等過程。需要一段時間,遇到時需要等一段時間,耐心稍微等一會。過會自動就會好。

          如果長時間還報錯還在安全模式可以手工設定退出安全模式

           [root@hadoop01 bin]# pwd

          /usr/local/src/hadoop/hadoop-2.7.1/bin

          [root@hadoop01 bin]# ./hadoop dfsadmin -safemode leave

          DEPRECATED: Use of this script to execute hdfs command is deprecated.

          Instead use the hdfs command for it.

 

          Safe mode is OFF

          [root@hadoop01 bin]#

          引數value的說明如下:

          enter - 進入安全模式

          leave - 強制NameNode離開安全模式

          get - 返回安全模式是否開啟的資訊

          wait - 等待,一直到安全模式結束

 

  1.4 Hive後設資料庫的替換

        後設資料:hive中記錄維護資料庫,表,資料之間關係的資料。

        Hive中的後設資料存在傳統的關係型資料庫中。Derby資料庫。

        Derby基於檔案,他只會維護hive啟動目錄下的後設資料,更換啟動目錄後原來的資料丟失。

        Hive官方提供了一些替換Derby的備選方案,oracle(收費) , mysql(免費)

  1.4.1 替換後設資料庫為mysql

    1. 修改配置檔案hive-site.xml
    2. <?xml version="1.0" encoding="UTF-8" standalone="no"?>
      <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
      <configuration>
        <property>
          <name>javax.jdo.option.ConnectionURL</name>
          <value>jdbc:mysql://192.168.220.1:3306/hive?createDatabaseIfNotExist=true</value>
        </property>
        <property>
          <name>javax.jdo.option.ConnectionDriverName</name>
          <value>com.mysql.jdbc.Driver</value>
        </property>
        <property>
          <name>javax.jdo.option.ConnectionUserName</name>
          <value>root</value>
        </property>
        <property>
          <name>javax.jdo.option.ConnectionPassword</name>
          <value>123456</value>
        </property>
      </configuration>
      hive-site.xml

      將配置檔案修改後並不能成功啟動hive,報錯如下:

         

 

      原因,我們並沒有給hive相關的驅動包。

      2.匯入驅動包

        直接將mysql驅動包上傳到hivelib目錄中即可

        但是再次嘗試啟動仍然報錯,

         

        沒有訪問許可權,解決辦法:開啟mysql外部訪問許可權。

      3.開啟mysql外部訪問許可權

        grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;

        flush privileges; #更新許可權

        如果上面修改後還提示許可權錯誤,修改指定機器

        grant all privileges on *.* to 'root'@'hadoop01' identified by 'root' with grant option;

        flush privileges;

      4.再次啟動hive

 

    1.4.2 Hive後設資料庫字符集必須為latin1

      修改後設資料庫hive字符集為latin1:

      登入到我們使用過的mysql

      Mysql> ALTER DATABASE hive DEFAULT CHARACTER SET latin1;  

       

 

  1.5 後設資料資訊

       

 

    DBS:資料庫後設資料資訊

     

    TBLS:表的後設資料資訊

       

 

    SDS:表的詳細資訊

       

 

    COLUMNS_V2:列後設資料資訊

       

 

 

 

  1.6 Hadoop常用命令

    啟動:start-all.sh

    關閉:stop-all.sh

    格式化:hdfs namenode -format

    建立目錄:hadoop fs -mkdir /user

    上傳檔案:hadoop fs -put ‘檔案路徑’ /user

    刪除檔案:hadoop fs -rm /user/book.txt

    刪除目錄:hadoop fs -rm -r /user

  1.7 內部表和外部表

    1.7.1 內部表(託管表):先有表後有資料

      建立內部表:

        Create table tb_book id int ,name string)row format delimited fields termianted by ‘\t’;

      載入資料:

        load data local inpath '/usr/local/src/hive/data/book.txt' into table tb_book;

      內部表在直接向HDFS中上傳檔案時,能夠正確管理。

      刪除內部表:

        Drop table tb_book;

      後設資料資訊會被刪除,HDFS中的相關目錄和資料也會被刪除。

    1.7.2 外部表:先有資料後有表

      準備資料:

        Hadoop fs -mkdir /data

        Hadoop fs -put ‘檔案路徑’ /data

 

      建立外部表:

        create external table ext_book(id int, name string) row format delimited fields terminated by '\t' location '/data';

      直接載入資料到HDFS中,hive是可以正常維護的。

      刪除外部表

        Drop table tb_stu;

        後設資料會被刪除,但是HDFS中的檔案不會被刪除。

 

  1.8 分割槽表

      分割槽表,實現了資料倉儲中面向主題的設計模式。

    1.8.1 建立單級分割槽表

      create table tb_book (id int,name string) partitioned by (country string) row format delimited fields terminated by '\t';

    1.8.2 載入資料

      load data local inpath '/usr/local/src/hive/data/ch.txt' overwrite into table tb_book partition (country='ch');

    1.8.3 檢視資料

       

      發現結果集多了一列ch

       

 

      Hive中的分割槽表中的分割槽其實就是表目錄下的一個資料夾。

       

 

      手動載入資料到HDFS中即使按照他的規則建立了相關目錄也沒有能夠正確維護。

      我們需要修改表,新增對應的分割槽資訊後設資料。

    1.8.4 新增分割槽資訊

      Alter table tb_book add partition (country=’ch’);

    1.8.4.1 按分割槽查詢資料

      Select * from tb_book where country = ‘ch’;

 

 

 

    1.8.5 建立多級分割槽表

        create table tb_book2 (id int,name string) partitioned by (country stringgender string) row format delimited fields terminated by '\t';

       載入資料

        load data local inpath '/usr/local/src/hive/data/jp_male.txt' overwrite into table tb_book2 partition (country='jp',gender='male');

       查詢資料

        Select * from tb_book2 where country = ‘ch’ and gender = ‘male’;

 

  1.9 分桶表

      分桶通過hash模餘的方式,提取部分資料作為測試資料。

    1.9.1 建立分桶表

      create table tb_teacher(id int,name string) clustered by (id) into 4 buckets row format delimited fields terminated by ',';

        

    1.9.2 從其他表中查出資料插入分桶表

      insert overwrite table tb_teacher select * from tb_tmp;

       

 

    1.9.3 資料取樣

      Select * from table_name tablesample bucket x out of y on id;

      其中x為第幾個桶,不能大於總桶數, y為選取資料的步長(幾個桶取一次資料)Y應為桶數的因數或倍數,當y大於桶數時,選取結果非整桶抽取,而是抽取每桶中的y除以桶數分之一,即:1/(y/桶數)

      Hive還支援用百分比的方式進行取樣,但是該資料取出的是前百分之多少,不具備代表性。

      select * from tb_tmp tablesample (50 percent);

相關文章