1. 程式人生 > >Hive執行機制與使用

Hive執行機制與使用

hive介紹
hive是基於Hadoop的一個數據倉庫工具,可以將結構化的資料檔案對映為一張資料庫表,並提供簡單的sql查詢功能,可以將sql語句轉換為MapReduce任務進行執行。其優點是學習成本低,可以通過類SQL語句快速實現簡單的MapReduce統計,不必開發專門的MapReduce應用,十分適合資料倉庫的統計分析。

hive的執行機制
圖示
這裡寫圖片描述
假設我在hive命令列客戶端使用建立了一個數據庫(database)myhive,接著又在該資料庫中建立了一張表emp。

create database myhive;
use myhive;
create table emp(id int
,name string);

那麼hive會將元資料儲存在資料庫中。Hive 中的元資料包括表的名字,表的列和分割槽及其屬性,表的屬性(是否為外部表等),表的資料所在目錄等。
hive是基於hadoop的,所以資料庫和表均表現在hdfs上的目錄,資料資訊當然也是儲存在hdfs上。
對於上面的庫和表來說,會在hdfs上建立/user/hive/warehouse/myhive.db這樣的目錄結構,而表的資訊則可以自己上傳個檔案比如圖中的emp.data到/user/hive/warehouse/myhive.db目錄下。那麼就可以寫sql進行查詢了(注:寫查詢語句寫的是myhive這張表不刪emp.data,如select * from myhive,但是查詢到的是emp.data中的資訊,兩者結合可以理解為傳統資料庫的某張表),而這些元資料資訊都會儲存到外部的資料庫中(如mysql,當然也可以使用內嵌的derby,不推薦使用derby畢竟是內嵌的不能共享資訊)。
然後我再寫個查詢語句

select id,name from emp where id>2 order by id desc;

那麼是怎麼執行的呢?查詢語句交給hive,hive利用解析器、優化器等(圖中表示Compiler),呼叫mapreduce模板,形成計劃,生成的查詢計劃儲存在 HDFS 中,隨後由Mapreduce程式呼叫,提交給job放在Yarn上執行。

hive與mapreduce關係
這裡寫圖片描述

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類似,不過其資料存放位置可以在任意指定路徑
普通表: 刪除表後, hdfs上的檔案都刪了
External外部表刪除後, hdfs上的檔案沒有刪除, 只是把檔案刪除了
partition:在hdfs中表現為table目錄下的子目錄
bucket:桶, 在hdfs中表現為同一個表目錄下根據hash雜湊之後的多個檔案, 會根據不同的檔案把資料放到不同的檔案中

理論總讓人頭昏,下面介紹hive的初步使用上面的自然就明白了。

hive的使用
雖然可以使用hive與shell互動的方式啟動hive

[[email protected] ~]# cd apps/hive/bin
[[email protected] bin]# ll
總用量 32
-rwxr-xr-x. 1 root root 1031 430 2015 beeline
drwxr-xr-x. 3 root root 4096 10月 17 12:38 ext
-rwxr-xr-x. 1 root root 7844 58 2015 hive
-rwxr-xr-x. 1 root root 1900 430 2015 hive-config.sh
-rwxr-xr-x. 1 root root  885 430 2015 hiveserver2
-rwxr-xr-x. 1 root root  832 430 2015 metatool
-rwxr-xr-x. 1 root root  884 430 2015 schematool
[[email protected] bin]# ./hive
hive> 

但是介面並不好看,而hive也可以釋出為服務(Hive thrift服務),然後可以使用hive自帶的beeline去連線。如下

視窗1,開啟服務

[[email protected] ~]# cd apps/hive/bin
[[email protected] bin]# ll
總用量 32
-rwxr-xr-x. 1 root root 1031 430 2015 beeline
drwxr-xr-x. 3 root root 4096 10月 17 12:38 ext
-rwxr-xr-x. 1 root root 7844 58 2015 hive
-rwxr-xr-x. 1 root root 1900 430 2015 hive-config.sh
-rwxr-xr-x. 1 root root  885 430 2015 hiveserver2
-rwxr-xr-x. 1 root root  832 430 2015 metatool
-rwxr-xr-x. 1 root root  884 430 2015 schematool
[[email protected] bin]# ./hiveserver2

視窗2,作為客戶端連線

[root@mini1 bin]# ./beeline 
Beeline version 1.2.1 by Apache Hive
beeline> [root@mini1 bin]# 
[root@mini1 bin]# ./beeline 
Beeline version 1.2.1 by Apache Hive
beeline> !connect jdbc:hive2://localhost:10000
Connecting to jdbc:hive2://localhost:10000
Enter username for jdbc:hive2://localhost:10000: root
Enter password for jdbc:hive2://localhost:10000: ******
Connected to: Apache Hive (version 1.2.1)
Driver: Hive JDBC (version 1.2.1)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://localhost:10000> 

下面進行簡單使用,感覺下使用sql的舒適吧
1、檢視資料庫

0: jdbc:hive2://localhost:10000> show databases;
+----------------+--+
| database_name  |
+----------------+--+
| default        |
+----------------+--+
1 row selected (1.456 seconds)

2、建立並使用資料庫,查看錶

0: jdbc:hive2://localhost:10000> create database myhive;
No rows affected (0.576 seconds)
0: jdbc:hive2://localhost:10000> show databases;
+----------------+--+
| database_name  |
+----------------+--+
| default        |
| myhive         |
+----------------+--+
0: jdbc:hive2://localhost:10000> use myhive;
No rows affected (0.265 seconds)
0: jdbc:hive2://localhost:10000> show tables;
+-----------+--+
| tab_name  |
+-----------+--+
+-----------+--+

3、建立表

0: jdbc:hive2://localhost:10000> create table emp(id int,name string);
No rows affected (0.29 seconds)
0: jdbc:hive2://localhost:10000> show tables;
+-----------+--+
| tab_name  |
+-----------+--+
| emp       |
+-----------+--+
1 row selected (0.261 seconds)

上傳資料到該目錄下,從頁面看的話是個目錄,如下
這裡寫圖片描述
裡面沒有檔案當然沒有資料,那麼我們需要上傳個檔案到該目錄下。

[root@mini1 ~]# cat sz.data 
1,zhangsan
2,lisi
3,wangwu
4,furong
5,fengjie
[root@mini1 ~]# hadoop fs -put sz.data /user/hive/warehouse/myhive.db/emp

再檢視
這裡寫圖片描述

4、查看錶資訊

0: jdbc:hive2://localhost:10000> select * from emp;
+---------+-----------+--+
| emp.id  | emp.name  |
+---------+-----------+--+
| NULL    | NULL      |
| NULL    | NULL      |
| NULL    | NULL      |
| NULL    | NULL      |
| NULL    | NULL      |
+---------+-----------+--+

結果肯定都是null,因為建立表的時候根本沒指定根據”,”來切分,而檔案中的欄位分隔用了逗號。那麼刪除該表,重新上傳檔案,重新建表語句如下

0: jdbc:hive2://localhost:10000> drop table emp;
No rows affected (1.122 seconds)
0: jdbc:hive2://localhost:10000> show tables;
+-----------+--+
| tab_name  |
+-----------+--+
+-----------+--+
0: jdbc:hive2://localhost:10000> create table emp(id int,name string)
0: jdbc:hive2://localhost:10000> row format delimited
0: jdbc:hive2://localhost:10000> fields terminated by ',';
No rows affected (0.265 seconds)
0: jdbc:hive2://localhost:10000> 

[[email protected] ~]# hadoop fs -put sz.data /user/hive/warehouse/myhive.db/emp
0: jdbc:hive2://localhost:10000> select * from emp;
+---------+-----------+--+
| emp.id  | emp.name  |
+---------+-----------+--+
| 1       | zhangsan  |
| 2       | lisi      |
| 3       | wangwu    |
| 4       | furong    |
| 5       | fengjie   |
+---------+-----------+--+

6、條件查詢

0: jdbc:hive2://localhost:10000> select id,name from emp where id>2 order by id desc;
INFO  : Number of reduce tasks determined at compile time: 1
INFO  : In order to change the average load for a reducer (in bytes):
INFO  :   set hive.exec.reducers.bytes.per.reducer=<number>
INFO  : In order to limit the maximum number of reducers:
INFO  :   set hive.exec.reducers.max=<number>
INFO  : In order to set a constant number of reducers:
INFO  :   set mapreduce.job.reduces=<number>
INFO  : number of splits:1
INFO  : Submitting tokens for job: job_1508216103995_0004
INFO  : The url to track the job: http://mini1:8088/proxy/application_1508216103995_0004/
INFO  : Starting Job = job_1508216103995_0004, Tracking URL = http://mini1:8088/proxy/application_1508216103995_0004/
INFO  : Kill Command = /root/apps/hadoop-2.6.4/bin/hadoop job  -kill job_1508216103995_0004
INFO  : Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 1
INFO  : 2017-10-18 00:35:39,865 Stage-1 map = 0%,  reduce = 0%
INFO  : 2017-10-18 00:35:46,275 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 1.33 sec
INFO  : 2017-10-18 00:35:51,487 Stage-1 map = 100%,  reduce = 100%, Cumulative CPU 2.34 sec
INFO  : MapReduce Total cumulative CPU time: 2 seconds 340 msec
INFO  : Ended Job = job_1508216103995_0004
+-----+----------+--+
| id  |   name   |
+-----+----------+--+
| 5   | fengjie  |
| 4   | furong   |
| 3   | wangwu   |
+-----+----------+--+
3 rows selected (18.96 seconds)

看到這就能明白了,寫的sql最後是被解析為了mapreduce程式放到yarn上來跑的,hive其實是提供了眾多的mapreduce模板。
7、建立外部表

0: jdbc:hive2://localhost:10000> create external table emp2(id int,name string)
0: jdbc:hive2://localhost:10000> row format delimited fields terminated by ','//指定逗號分割
0: jdbc:hive2://localhost:10000> stored as textfile//文字儲存方式
0: jdbc:hive2://localhost:10000> location '/company';
No rows affected (0.101 seconds)//儲存在/company目錄下
0: jdbc:hive2://localhost:10000> dfs -ls /;
+----------------------------------------------------------------------------------------+--+
|                                       DFS Output                                       |
+----------------------------------------------------------------------------------------+--+
| Found 16 items                                                                         |
| -rw-r--r--   2 angelababy mygirls             7 2017-10-01 20:22 /canglaoshi_wuma.avi  |
| -rw-r--r--   2 root       supergroup         22 2017-10-03 21:12 /cangmumayi.avi       |
| drwxr-xr-x   - root       supergroup          0 2017-10-18 00:55 /company              |
| drwxr-xr-x   - root       supergroup          0 2017-10-13 04:44 /flowcount            |
| drwxr-xr-x   - root       supergroup          0 2017-10-17 03:44 /friends              |
| drwxr-xr-x   - root       supergroup          0 2017-10-17 06:19 /gc                   |
| drwxr-xr-x   - root       supergroup          0 2017-10-07 07:28 /liushishi.log        |
| -rw-r--r--   3 12706      supergroup         60 2017-10-04 21:58 /liushishi.love       |
| drwxr-xr-x   - root       supergroup          0 2017-10-17 07:32 /logenhance           |
| -rw-r--r--   2 root       supergroup         26 2017-10-16 20:49 /mapjoin              |
| drwxr-xr-x   - root       supergroup          0 2017-10-16 21:16 /mapjoincache         |
| drwxr-xr-x   - root       supergroup          0 2017-10-13 13:15 /mrjoin               |
| drwxr-xr-x   - root       supergroup          0 2017-10-16 23:35 /reverse              |
| drwx------   - root       supergroup          0 2017-10-17 13:10 /tmp                  |
| drwxr-xr-x   - root       supergroup          0 2017-10-17 13:13 /user                 |
| drwxr-xr-x   - root       supergroup          0 2017-10-14 01:33 /wordcount            |
+----------------------------------------------------------------------------------------+--+
0: jdbc:hive2://localhost:10000> create external table t_sz_ext(id int,name string)
0: jdbc:hive2://localhost:10000> row format delimited fields terminated by '\t'
0: jdbc:hive2://localhost:10000> stored as textfile
0: jdbc:hive2://localhost:10000>  location '/company';
No rows affected (0.135 seconds)
0: jdbc:hive2://localhost:10000> show tables;
+-----------+--+
| tab_name  |
+-----------+--+
| emp       |
| emp2      |
| t_sz_ext  |
+-----------+--+

能發現多了目錄/company和兩張表,不過這個時候/company下是沒任何東西的。

8、載入檔案資訊到表中
前面使用了hadoop命令將檔案上傳到了表對應的目錄下,但是也可以在命令列下直接匯入檔案資訊

0: jdbc:hive2://localhost:10000> load data local inpath '/root/sz.data' into table emp2;(也可以用hadoo直接上傳)
INFO  : Loading data to table myhive.emp2 from file:/root/sz.data
INFO  : Table myhive.emp2 stats: [numFiles=0, totalSize=0]
No rows affected (0.414 seconds)
0: jdbc:hive2://localhost:10000> select * from emp2;
+----------+------------+--+
| emp2.id  | emp2.name  |
+----------+------------+--+
| 1        | zhangsan   |
| 2        | lisi       |
| 3        | wangwu     |
| 4        | furong     |
| 5        | fengjie    |
+----------+------------+--+

9、表分割槽,分割槽欄位為school,匯入資料到2個不同的分割槽中

0: jdbc:hive2://localhost:10000> create table stu(id int,name string)
0: jdbc:hive2://localhost:10000> partitioned by(school string)
0: jdbc:hive2://localhost:10000> row format delimited fields terminated by ',';
No rows affected (0.319 seconds)
0: jdbc:hive2://localhost:10000> show tables;
+-----------+--+
| tab_name  |
+-----------+--+
| emp       |
| emp2      |
| stu       |
| t_sz_ext  |
+-----------+--+
0: jdbc:hive2://localhost:10000> load data local inpath '/root/sz.data' into table stu partition(school='scu');
INFO  : Loading data to table myhive.stu partition (school=scu) from file:/root/sz.data
INFO  : Partition myhive.stu{school=scu} stats: [numFiles=1, numRows=0, totalSize=46, rawDataSize=0]
No rows affected (0.607 seconds)
0: jdbc:hive2://localhost:10000> select * from stu;
+---------+-----------+-------------+--+
| stu.id  | stu.name  | stu.school  |
+---------+-----------+-------------+--+
| 1       | zhangsan  | scu         |
| 2       | lisi      | scu         |
| 3       | wangwu    | scu         |
| 4       | furong    | scu         |
| 5       | fengjie   | scu         |
+---------+-----------+-------------+--+
5 rows selected (0.286 seconds)
0: jdbc:hive2://localhost:10000> load data local inpath '/root/sz2.data' into table stu partition(school='hfut');
INFO  : Loading data to table myhive.stu partition (school=hfut) from file:/root/sz2.data
INFO  : Partition myhive.stu{school=hfut} stats: [numFiles=1, numRows=0, totalSize=46, rawDataSize=0]
No rows affected (0.671 seconds)
0: jdbc:hive2://localhost:10000> select * from stu;
+---------+-----------+-------------+--+
| stu.id  | stu.name  | stu.school  |
+---------+-----------+-------------+--+
| 1       | Tom       | hfut        |
| 2       | Jack      | hfut        |
| 3       | Lucy      | hfut        |
| 4       | Kitty     | hfut        |
| 5       | Lucene    | hfut        |
| 6       | Sakura    | hfut        |
| 1       | zhangsan  | scu         |
| 2       | lisi      | scu         |
| 3       | wangwu    | scu         |
| 4       | furong    | scu         |
| 5       | fengjie   | scu         |
+---------+-----------+-------------+--+

注:hive是不遵循三正規化的,別去考慮主鍵了。
10、新增分割槽

0: jdbc:hive2://localhost:10000> alter table stu add partition (school='Tokyo');

為了更直觀,去頁面檢視
這裡寫圖片描述

這裡寫圖片描述
這裡寫圖片描述

相關推薦

大資料11-Hive執行機制使用

hive介紹 hive是基於Hadoop的一個數據倉庫工具,可以將結構化的資料檔案對映為一張資料庫表,並提供簡單的sql查詢功能,可以將sql語句轉換為MapReduce任務進行執行。其優點是學習成本低,可以通過類SQL語句快速實現簡單的MapReduce統計,不必開發專門的MapReduce應

Hive執行機制使用

hive介紹 hive是基於Hadoop的一個數據倉庫工具,可以將結構化的資料檔案對映為一張資料庫表,並提供簡單的sql查詢功能,可以將sql語句轉換為MapReduce任務進行執行。其優點是學習成本低,可以通過類SQL語句快速實現簡單的MapReduce統計

PHP 底層的執行機制原理解析(轉載)

我的另一篇文章:PHP底層工作原理  兩篇結合起來看,會更加好理解。 由於本人資料結構方面知識,淺薄,後面的尚未研究 關於 hash table ,這有個文章可以學習:HashTable原理和底層實現 關於 zval 可以研讀這個:入理解PHP7核心之zval  

https的執行機制配置

超文字傳輸安全協議(縮寫:HTTPS,英語:Hypertext Transfer Protocol Secure)是超文字傳輸協議和SSL/TLS的組合,用以提供加密通訊及對網路伺服器身份的鑑定。 (1) 所有資訊都是加密傳播,第三方無法竊聽。 (2) 具有校驗機制,一旦被篡改,通訊雙方會立刻發現。 (

Zookeeper執行機制選舉機制

Zookeeper的執行機制 1.在伺服器開啟後向zookeeper註冊資訊 2.通過process來註冊監聽,獲取伺服器列表 3.此時如果有伺服器下線 4.下線通知 5.重新通過process來註冊監聽,獲取伺服器列表 Zookeeper的選舉機制 1.叢集

PHP底層的執行機制原理

PHP是一種適用於web開發的動態語言。具體點說,就是一個用C語言實現包含大連元件的軟體框架。是一個強大的UI框架。 瞭解PHP底層實現的目的是什麼?動態語言要像用好首先得了解它,記憶體管理、框架模型值得我們借鑑,通過擴充套件開發實現更多更強大的功能,優化我們程式的效能。

Servlet執行機制生命週期

轉載自:http://blog.csdn.net/suwu150/article/details/51487398 Servlet的執行機制和生命週期 一、Servlet的執行機制            當瀏覽器傳送給伺服器一個Servlet的請求時,如果這個Serv

淺析PHP執行機制流程

一、PHP設計理念及特點 1、多程序模型:由於PHP是多程序模型,不同請求間互不干涉,這樣保證了一個請求掛掉不會對全盤服務造成影響。 2、弱型別語言:一個變數的型別並不是一開始就確定不變,執行中才會確定並可能發生隱式或顯式的型別轉換,這種機制的靈活性在web

java執行機制垃圾回收機制

一、java機制 1.1、執行機制 高階語言執行機制 編譯型:原始碼–>特定平臺機器碼(效率高,脫離開發環境,移植性低) 解釋型:原始碼–>特定平臺的直譯器–>特定平臺的機

關於PHP底層執行機制原理的思考之建立一個簡單的PHP核心架構圖

    提到這個PHP底層的執行原理和機制,如果要用一張圖來描述的話,相信大家的腦海裡都會浮現下面的這張圖:    誠然,PHP的核心架構確實是如上圖所示。不管是讓誰來說,也差不多就是這麼多。但是,我今

圖解hive執行機制

Hive是構建在Hadoop之上的資料倉庫平臺,它的創造是為了讓非Java程式設計師更方便使用MapReduce 它的架構如下圖所示: 它的執行流程如下圖: Hive建立的表的元資訊存在於結構型資料庫之內(這個資料庫可以是自帶的Derby資料庫也可以是使用者自己安裝的資

ElasticSearch教程——filter執行原理深度剖析(bitset機制caching機制

ElasticSearch彙總請檢視:ElasticSearch教程——彙總篇 (1)在倒排索引中查詢搜尋串,獲取document list date來舉例 word          doc1    &nb

maptask執行機制小檔案的優化合並TextInputFormat

maptask並行度與決定機制     1)一個job任務map階段並行度由客戶端提交的任務所決定     2)每一個split分配一個maptask並行處理     3)預設情況下,split大小=block

研究JS執行機制之重新認識JavaScript(1) ———— 認識Js執行上下文執行機制

關於這個系列 javascript語言有很多奧祕,譬如其執行機制,內部原理,在歷史的這一段日子裡,它不僅帶來了複雜的互動效果和充分的效能效益,而且吸引了越來越多的開發者加入其中,但是隨著時間程序的發展,很多時候開發者們因為花樣繁複的JS庫與框架而忽略了JS本身的內部機制。無可厚非,這樣做是增加了效率,但是隨著

Java方法的靜態繫結動態繫結講解(向上轉型的執行機制詳解)

   今天看設計模式-模板方法模式時發現一個實現父類呼叫子類方法的效果的程式碼,不理解其中的原理,然後詢問大佬之後,發現這原來是動態繫結的知識,所以惡補了一下。 package com.practice; /** * 父類呼叫子類的方法 * * @author li

ccflow表結構執行機制(二次開發必看)

馳騁工作流引擎,工作流程管理系統,表結構與執行機制。 ------------------------------------------------------- 前言:       1, ccflow 有自動修復資料表功能, 所以表的欄位的

【JavaScript高階】16、執行機制事件機制筆記

執行緒與程序 程序: 程式的一次執行, 它佔有一片獨有的記憶體空間 可以通過windows工作管理員檢視程序 執行緒: 是程序內的一個獨立執行單元 是程式執行的一個完整流程 是CPU的最小的排

2_ElatisSearch filter執行原理 bitset機制caching機制

2_ElatisSearch filter執行原理 bitset機制與caching機制更多幹貨1、倒排索引在倒排索引中查詢搜尋串,獲取document list用時間型別date作為filter來舉例

Netty學習之旅------原始碼分析Netty執行緒本地分配機制PooledByteBuf執行緒級物件池原理分析

final PoolArena<byte[]> heapArena; //使用輪叫輪詢機制,每個執行緒從heapArena[]中獲取一個,用於記憶體分配。 final PoolArena<ByteBuffer> directArena;

handoop job工作執行機制原理詳解

宣告:本博文的圖片來自於董西城《hadoop技術內幕》;HDFS原理以及MapReduce的簡單原理請移步我之前的部落格,也歡迎關注我的大資料專欄,這是我入門學習大資料的完整歷程,歡迎提出建議以及知識交流。 上圖是hadoop MapReduce的作業生命