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 4月 30 2015 beeline
drwxr-xr-x. 3 root root 4096 10月 17 12:38 ext
-rwxr-xr-x. 1 root root 7844 5月 8 2015 hive
-rwxr-xr-x. 1 root root 1900 4月 30 2015 hive-config.sh
-rwxr-xr-x. 1 root root 885 4月 30 2015 hiveserver2
-rwxr-xr-x. 1 root root 832 4月 30 2015 metatool
-rwxr-xr-x. 1 root root 884 4月 30 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 4月 30 2015 beeline
drwxr-xr-x. 3 root root 4096 10月 17 12:38 ext
-rwxr-xr-x. 1 root root 7844 5月 8 2015 hive
-rwxr-xr-x. 1 root root 1900 4月 30 2015 hive-config.sh
-rwxr-xr-x. 1 root root 885 4月 30 2015 hiveserver2
-rwxr-xr-x. 1 root root 832 4月 30 2015 metatool
-rwxr-xr-x. 1 root root 884 4月 30 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的作業生命