一篇文章徹底明白Hive數(shù)據(jù)存儲的各種模式
Hive的數(shù)據(jù)分為表數(shù)據(jù)和元數(shù)據(jù),表數(shù)據(jù)是Hive中表格(table)具有的數(shù)據(jù);而元數(shù)據(jù)是用來存儲表的名字,表的列和分區(qū)及其屬性,表的屬性(是否為外部表等),表的數(shù)據(jù)所在目錄等。下面分別來介紹。
一、Hive的數(shù)據(jù)存儲
在讓你真正明白什么是hive 博文中我們提到Hive是基于Hadoop分布式文件系統(tǒng)的,它的數(shù)據(jù)存儲在Hadoop分布式文件系統(tǒng)中。Hive本身是沒有專門的數(shù)據(jù)存儲格式,也沒有為數(shù)據(jù)建立索引,只需要在創(chuàng)建表的時候告訴Hive數(shù)據(jù)中的列分隔符和行分隔符,Hive就可以解析數(shù)據(jù)。所以往Hive表里面導(dǎo)入數(shù)據(jù)只是簡單的將數(shù)據(jù)移動到表所在的目錄中(如果數(shù)據(jù)是在HDFS上;但如果數(shù)據(jù)是在本地文件系統(tǒng)中,那么是將數(shù)據(jù)復(fù)制到表所在的目錄中)。
Hive中主要包含以下幾種數(shù)據(jù)模型:Table(表),External Table(外部表),Partition(分區(qū)),Bucket(桶)(本博客會專門寫幾篇博文來介紹分區(qū)和桶)。
1、表:Hive中的表和關(guān)系型數(shù)據(jù)庫中的表在概念上很類似,每個表在HDFS中都有相應(yīng)的目錄用來存儲表的數(shù)據(jù),這個目錄可以通過${HIVE_HOME}/conf/hive-site.xml配置文件中的 hive.metastore.warehouse.dir屬性來配置,這個屬性默認(rèn)的值是/user/hive/warehouse(這個目錄在 HDFS上),我們可以根據(jù)實際的情況來修改這個配置。如果我有一個表wyp,那么在HDFS中會創(chuàng)建/user/hive/warehouse/wyp 目錄(這里假定hive.metastore.warehouse.dir配置為/user/hive/warehouse);wyp表所有的數(shù)據(jù)都存放在這個目錄中。這個例外是外部表。
2、外部表:Hive中的外部表和表很類似,但是其數(shù)據(jù)不是放在自己表所屬的目錄中,而是存放到別處,這樣的好處是如果你要刪除這個外部表,該外部表所指向的數(shù)據(jù)是不會被刪除的,它只會刪除外部表對應(yīng)的元數(shù)據(jù);而如果你要刪除表,該表對應(yīng)的所有數(shù)據(jù)包括元數(shù)據(jù)都會被刪除。
3、分區(qū):在Hive中,表的每一個分區(qū)對應(yīng)表下的相應(yīng)目錄,所有分區(qū)的數(shù)據(jù)都是存儲在對應(yīng)的目錄中。比如wyp 表有dt和city兩個分區(qū),則對應(yīng)dt=20131218,city=BJ對應(yīng)表的目錄為/user/hive/warehouse /dt=20131218/city=BJ,所有屬于這個分區(qū)的數(shù)據(jù)都存放在這個目錄中。
4、桶:對指定的列計算其hash,根據(jù)hash值切分?jǐn)?shù)據(jù),目的是為了并行,每一個桶對應(yīng)一個文件(注意和分區(qū)的區(qū)別)。比如將wyp表id列分散至16個桶中,首先對id列的值計算hash,對應(yīng)hash值為0和16的數(shù)據(jù)存儲的HDFS目錄為:/user /hive/warehouse/wyp/part-00000;而hash值為2的數(shù)據(jù)存儲的HDFS 目錄為:/user/hive/warehouse/wyp/part-00002。
來看下Hive數(shù)據(jù)抽象結(jié)構(gòu)圖
從上圖可以看出,表是在數(shù)據(jù)庫下面,而表里面又要分區(qū)、桶、傾斜的數(shù)據(jù)和正常的數(shù)據(jù)等;分區(qū)下面也是可以建立桶的。
二、Hive的元數(shù)據(jù)
Hive中的元數(shù)據(jù)包括表的名字,表的列和分區(qū)及其屬性,表的屬性(是否為外部表等),表的數(shù)據(jù)所在目錄等。 由于Hive的元數(shù)據(jù)需要不斷的更新、修改,而HDFS系統(tǒng)中的文件是多讀少改的,這顯然不能將Hive的元數(shù)據(jù)存儲在HDFS中。目前Hive將元數(shù)據(jù)存儲在數(shù)據(jù)庫中,如Mysql、Derby中。我們可以通過以下的配置來修改Hive元數(shù)據(jù)的存儲方式
- <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>
當(dāng)然,你還需要將相應(yīng)數(shù)據(jù)庫的啟動復(fù)制到${HIVE_HOME}/lib目錄中,這樣才能將元數(shù)據(jù)存儲在對應(yīng)的數(shù)據(jù)庫中。