1. 程式人生 > >Hive資料儲存的模式

Hive資料儲存的模式

一、Hive資料的兩種型別

       Hive的資料分為表資料和元資料,表資料是Hive中表格(table)具有的資料;而元資料是用來儲存表的名字,表的列和分割槽及其屬性,表的屬性(是否為外部表等),表的資料所在目錄等。

二、Hive的資料儲存

       Hive是基於Hadoop分散式檔案系統的資料倉庫架構,它的資料儲存在Hadoop分散式檔案系統中。Hive本身是沒有專門的資料儲存格式,也沒有為資料建立索引,只需要在建立表的時候告訴Hive資料中的列分隔符和行分隔符,Hive就可以解析資料。所以往Hive表裡面匯入資料只是簡單的將資料移動到表所在的目錄中(如果資料是在HDFS上;但如果資料是在本地檔案系統中,那麼是將資料複製到表所在的目錄中)。

       Hive中主要包含以下幾種資料模型:Table(表),External Table(外部表),Partition(分割槽),Bucket(桶)。

1、表:Hive中的表和關係型資料庫中的表在概念上很類似,每個表在HDFS中都有相應的目錄用來儲存表的資料,這個目錄可以通過${HIVE_HOME}/conf/hive-site.xml配置檔案中的hive.metastore.warehouse.dir屬性來配置,這個屬性預設的值是/user/hive/warehouse(這個目錄在HDFS上),我們可以根據實際的情況來修改這個配置。如果我有一個表wyp,那麼在HDFS中會建立/user/hive/warehouse/wyp目錄(這裡假定hive.metastore.warehouse.dir配置為/user/hive/warehouse);wyp表所有的資料都存放在這個目錄中。這個例外是外部表。
2、外部表:Hive中的外部表和表很類似,但是其資料不是放在自己表所屬的目錄中,而是存放到別處,這樣的好處是如果你要刪除這個外部表,該外部表所指向的資料是不會被刪除的,它只會刪除外部表對應的元資料;而如果你要刪除表,該表對應的所有資料包括元資料都會被刪除。
3、分割槽:在Hive中,表的每一個分割槽對應表下的相應目錄,所有分割槽的資料都是儲存在對應的目錄中。比如wyp表有dt和city兩個分割槽,則對應dt=20131218,city=BJ對應表的目錄為/user/hive/warehouse/dt=20131218/city=BJ,所有屬於這個分割槽的資料都存放在這個目錄中。
4、桶:對指定的列計算其hash,根據hash值切分資料,目的是為了並行,每一個桶對應一個檔案(注意和分割槽的區別)。比如將wyp表id列分散至16個桶中,首先對id列的值計算hash,對應hash值為0和16的資料儲存的HDFS目錄為:/user/hive/warehouse/wyp/part-00000;而hash值為2的資料儲存的HDFS 目錄為:/user/hive/warehouse/wyp/part-00002。

 Hive資料抽象結構圖

        從上圖可以看出,表是在資料庫下面,而表裡面又要分割槽、桶、傾斜的資料和正常的資料等;分割槽下面也是可以建立桶的。

二、Hive的元資料

  Hive中的元資料包括表的名字,表的列和分割槽及其屬性,表的屬性(是否為外部表等),表的資料所在目錄等。 由於Hive的元資料需要不斷的更新、修改,而HDFS系統中的檔案是多讀少改的,這顯然不能將Hive的元資料儲存在HDFS中。目前Hive將元資料儲存在資料庫中,如Mysql、Derby中。我們可以通過以下的配置來修改Hive元資料的儲存方式。

<property>
  <name>javax.jdo.option.ConnectionURL</name>
  <value>jdbc:mysql://localhost:3306/hive_hdp?characterEncoding=UTF-8
                    &createDatabaseIfNotExist=true</value>
  <description>JDBC connect string for a JDBC metastore</description>
</property>
  
<property>
  <name>javax.jdo.option.ConnectionDriverName</name>
  <value>com.mysql.jdbc.Driver</value>
  <description>Driver class name for a JDBC metastore</description>
</property>
  
<property>
  <name>javax.jdo.option.ConnectionUserName</name>
  <value>root</value>
  <description>username to use against metastore database</description>
</property>
  
<property>
  <name>javax.jdo.option.ConnectionPassword</name>
  <value>123456</value>
  <description>password to use against metastore database</description>
</property>

當然,你還需要將相應資料庫的啟動複製到${HIVE_HOME}/lib目錄中,這樣才能將元資料儲存在對應的資料庫中。

轉載出處:https://www.iteblog.com/archives/866.html