1. 程式人生 > >HIVE—資料倉庫

HIVE—資料倉庫

1、 hive是什麼?

Hive是基於 Hadoop 的一個數據倉庫工具:

1.       hive本身不提供資料儲存功能,使用HDFS做資料儲存;

2.       hive也不分散式計算框架,hive的核心工作就是把sql語句翻譯成MR程式;

3.       hive也不提供資源排程系統,也是預設由Hadoop當中YARN叢集來排程;

4.      

可以將結構化的資料對映為一張資料庫表,並提供 HQL(Hive SQL)查詢功能。

2、 hive和Hadoop關係

Hive利用HDFS儲存資料,利用MapReduce查詢資料

3、 hive特點

1.       可以將結構化的資料檔案對映為一張資料庫表(二維表),並提供類SQL查詢功能

2.       可以將sql語句轉換為MapReduce任務進行執行。Hive 將使用者的HiveQL 語句通過直譯器轉換為MapReduce 作業提交到Hadoop 叢集上,Hadoop 監控作業執行過程,然後返回作業執行結果給使用者。

3.       Hive 在載入資料過程中不會對資料進行任何的修改,只是將資料移動到HDFS 中Hive 設定的目錄下,因此,Hive 不支援對資料的改寫和新增,所有的資料都是在載入的時候確定的。

4.       Hive的適應場景:只適合做海量離線資料的統計分析。

4、 hive資料的儲存

1.       Hive中所有的資料都儲存在 HDFS 中,沒有專門的資料儲存格式(可支援Text,SequenceFile,ParquetFile,RCFILE等)

2.       只需要在建立表的時候告訴 Hive 資料中的列分隔符和行分隔符,Hive 就可以解析資料。

3.       Hive 中包含以下資料模型:DB、Table,External Table,Partition,Bucket。

db:在hdfs中表現為${hive.metastore.warehouse.dir}目錄下一個資料夾

table:在hdfs中表現所屬db目錄下一個資料夾

external table:與table類似,不過其資料存放位置可以在任意指定路徑

partition:在hdfs中表現為table目錄下的子目錄

bucket:在hdfs中表現為同一個表目錄下根據hash雜湊之後的多個檔案

5、 Hive 體系結構

 

 6、 hive的架構原理

 

 

Driver是核心,Driver可以解析語法,最難的就是解析sql的語法,只要把SQL的語法解析知道怎麼做了,它內部用MapReduce模板程式,它很容易把它組裝起來,比如做一個join操作,最重要的是識別語法,認識你的語法,知道你語法有什麼東西,解析出來會得到一個語法樹,根據一些語法樹,去找一些MapReduce模板程式,把它組裝起來。

例如:有二個表去join,內部有一個優化機制,有一個預設值,如果小表小於預設值,就採用map—join ,如果小表大於預設值,就採用reduce——join(其中map——join是先把小表載入到記憶體中),組裝時候就是輸入一些引數:比如:你的輸入資料在哪裡,你的表資料的分隔符是什麼,你的檔案格式是什麼:然而這些東西是我們建表的時候就指定了,所以這些都知道了,程式就可以正常的跑起來。

Hive有了Driver之後,還需要藉助Metastore,Metastore裡邊記錄了hive中所建的:庫,表,分割槽,分桶的資訊,描述資訊都在Metastore,如果用了MySQL作為hive的Metastore:需要注意的是:你建的表不是直接建在MySQL裡,而是把這個表的描述資訊放在了MySQL裡,而tables表,欄位表是存在HDFS上的hive表上,hive會自動把他的目錄規劃/usr/hive/warehouse/庫檔案/庫目錄/表目錄,你的資料就在目錄下

7、 內外表

內部表在刪除表的時候,會刪除元資料和資料;外部表在刪除表的時候,只刪除元資料,不刪除資料        

內部表和外部表使用場景:

1.     一般情況來說,如果資料只交給hive處理,那麼一般直接使用內部表;

2.     如果資料需要多個不同的元件進行處理,那麼最好用外部表,一個目錄的資料需要被spark、hbase等其他元件使用,並且hive也要使用,那麼該份資料通過建立一張臨時表為外部表,然後通過寫HQL語句轉換該份資料到hive內部表中

8、 分桶

分桶操作:按照使用者建立表時指定的分桶欄位進行hash雜湊,跟MapReduce中的HashPartitioner的原理一模一樣。

MapReduce中:按照key的hash值去模除以reductTask的個數;Hive中:按照分桶欄位的hash值去模除以分桶的個數

hive分桶操作的效果:把一個檔案按照某個特定的欄位和桶數 雜湊成多個檔案

好處:1、方便抽樣;2、提高join查詢效率  

9、 Hive分割槽

做統計的時候少統計,把我們的資料放在多個資料夾裡邊,我們統計時候,可以指定分割槽,這樣範圍就會小一些,這樣就減少了執行的時間。

10、      Hive 的所有跟資料相關的概念

db: myhive,   table: student     元資料:hivedb

Hive的元資料指的是 myhive 和 student等等的庫和表的相關的各種定義資訊,該元資料都是儲存在mysql中的:

1.       myhive是hive中的一個數據庫的概念,其實就是HDFS上的一個資料夾,跟mysql沒有多大的關係;

2.       myhive是hive中的一個數據庫,那麼就會在元資料庫hivedb當中的DBS表中儲存一個記錄,這一條記錄就是myhive這個hive中資料的相關描述資訊。

3.       hive中建立一個庫,就相當於是在hivedb中DBS(資料庫)中插入一張表, 並且在HDFS上建立相應的目錄—主目錄;

4.       hive中建立一個表,就相當於在hivedb中TBLS(資料庫中的表)表中插入一條記錄,並且在HDFS上專案的庫目錄下建立一個子目錄;

5.       一個hive資料倉庫就依賴於一個RDBMS(關係資料庫管理系統)中的一個數據庫,一個數據庫例項對應於一個Hive資料倉庫;

6.       儲存於該hive資料倉庫中的所有資料的描述資訊,都統統儲存在元資料庫hivedb中。

11、      源資料與元資料

1.       Hive元資料 :描述和管理這些block資訊的資料,由namenode管理,一定指跟 hivedb相關,跟mysql相關;

2.       Hive源資料-- block塊: HDFS上的對應表的目錄下的檔案HDFS上的資料和元資料。

myhive 和  hivedb的區別:

1.       myhive是hive中的資料庫: 用來儲存真實資料—源資料;

2.       hivedb是mysql中的資料庫: 用來多個類似myhive庫的真實資料的描述資料—元資料;

1)      Hive基本命令整理
建立表:
hive> CREATE TABLE pokes (foo INT, bar STRING);
        Creates a table called pokes with two columns, the first being an integer and the other a string

建立一個新表,結構與其他一樣
hive> create table new_table like records;

建立分割槽表:
hive> create table logs(ts bigint,line string) partitioned by (dt String,country String);

載入分割槽表資料:
hive> load data local inpath '/home/hadoop/input/hive/partitions/file1' into table logs partition (dt='2001-01-01',country='GB');

展示表中有多少分割槽:
hive> show partitions logs;

展示所有表:
hive> SHOW TABLES;
        lists all the tables
hive> SHOW TABLES '.*s';

lists all the table that end with 's'. The pattern matching follows Java regular
expressions. Check out this link for documentation

顯示錶的結構資訊
hive> DESCRIBE invites;
        shows the list of columns

更新表的名稱:
hive> ALTER TABLE source RENAME TO target;

新增新一列
hive> ALTER TABLE invites ADD COLUMNS (new_col2 INT COMMENT 'a comment');
刪除表:
hive> DROP TABLE records;
刪除表中資料,但要保持表的結構定義
hive> dfs -rmr /user/hive/warehouse/records;

從本地檔案載入資料:
hive> LOAD DATA LOCAL INPATH '/home/hadoop/input/ncdc/micro-tab/sample.txt' OVERWRITE INTO TABLE records;

顯示所有函式:
hive> show functions;

檢視函式用法:
hive> describe function substr;

檢視陣列、map、結構
hive> select col1[0],col2['b'],col3.c from complex;

其他同oracle相同