1 Impala
Impala是Cloudera公司主導開發的新型查詢系統,它提供SQL語義,能查詢存儲在Hadoop的HDFS和HBASE中的PB級大數據。已有的Hive系統雖然也提供了SQL語義,但由於Hive底層執行使用的是MapReduce引擎,仍然是一個批處理過程,難以滿足查詢的交互性。相比之下,Impala的最大特點也是最大賣點就是它的快速。
Impala到底是什麼?
Impala是用於處理存儲在Hadoop集羣中的大量數據的MPP(大規模並行處理)SQL查詢引擎。 它是一個用C ++和Java編寫的開源軟件。 與其他Hadoop的SQL引擎相比,它提供了高性能和低延遲。
換句話說,Impala是性能最高的SQL引擎(提供類似RDBMS的體驗),它提供了訪問存儲在Hadoop分佈式文件系統中的數據的最快方法。
1.1 Impala介紹
1.1.1 優點
- Impala不需要把中間結果寫入磁盤,省掉了大量的I/O開銷。
- 省掉了MapReduce作業啓動的開銷。MapReduce啓動task的速度很慢(默認每個心跳間隔是3秒鐘),Impala直接通過相應的服務進程來進行作業調度,速度快了很多。
- Impala完全拋棄了MapReduce這個不太適合做SQL查詢的範式,而是像Dremel一樣借鑑了MPP(大規模並行處理)並行數據庫的思想另起爐竈,因此可做更多的查詢優化,從而省掉不必要的shuffle、sort等開銷。
- 通過使用LLVM來統一編譯運行時代碼,避免了爲支持通用編譯而帶來的不必要開銷。
- 用C++實現,做了很多有針對性的硬件優化,例如使用SSE指令。
- 使用了支持Data locality的I/O調度機制,儘可能地將數據和計算分配在同一臺機器上進行,減少了網絡開銷。
- 基於Hive使用內存計算,兼顧數據倉庫、具有實時、批處理、多併發等優點。
- 是CDH平臺首選的PB級大數據實時查詢分析引擎。
Impala的特點
Impala快的原因:1、2、3、6
1.基於內存進行計算,能夠對PB級數據進行交互式實時查詢、分析。
2.無需轉換爲MR,直接讀取HDFS及Hbase數據,從而大大降低了延遲。
Impala沒有MapReduce批處理,而是通過使用與商用並行關係數據庫中類似的分佈式查詢引擎(由Query Planner、Query Coordinator和Query Exec Engine三部分組成)
3.LLVM統一編譯運行(在底層對硬件進行優化,LLVM:編譯器,比較穩定,效率高)
4.兼容HiveSQL
支持hive基本的一些查詢等,hive中的一些複雜結構是不支持的。
5.具有數據倉庫的特徵,可對hive數據直接做數據分析。
6.支持Data Local (數據本地化:無需數據移動,減少數據的傳輸)
7.支持列式存儲(可以和Hbase整合:因爲Hive可以和Hbase整合)
8.支持JDBC/ODBC遠程訪問。
1.1.2 Impala劣勢
1.對內存依賴大
只在內存中計算,官方建議128G(一般64基本滿足)、可優化:各個節點彙總的節點(服務器)內存選用大的,不彙總節點可小點。
2、C++編寫 開源?
對java,C++可能不是很瞭解
3、完全依賴hive
4、實踐過程中分區超過1w,性能嚴重下下降。
定期刪除沒有必要的分區,保證分區的個數不要太大。
5、穩定性不如hive
因爲全在內存中計算,內存不夠,會出現問題,hive內存不夠,可以使用外存。
1.2 Impala的缺點
Impala不提供任何對序列化和反序列化的支持。
Impala只能讀取文本文件,而不能讀取自定義二進制文件。
每當新的記錄/文件被添加到HDFS中的數據目錄中,該表需要被刷新。
1.2.1 功能
Impala可以根據Apache許可證作爲開源免費提供。
Impala支持內存中數據處理,它訪問/分析存儲在Hadoop數據節點上的數據,而無需數據移動。
使用類SQL查詢訪問數據。
Impala爲HDFS中的數據提供了更快的訪問。
可以將數據存儲在Impala存儲系統中,如Apache HBase和Amazon s3。
Impala支持各種文件格式,如LZO,序列文件,Avro,RCFile和Parquet。
1.2.2 關係數據庫和Impala
Impala使用類似於SQL和HiveQL的Query語言。 下表描述了SQL和Impala查詢語言之間的一些關鍵差異。
1.2.3 Hive,Hbase和Impala
雖然Cloudera Impala使用與Hive相同的查詢語言,元數據和用戶界面,但在某些方面它與Hive和HBase不同。 下表介紹了HBase,Hive和Impala之間的比較分析。
所有這三個數據庫 -
• 是NOSQL數據庫。
• 可用作開源。
• 支持服務器端腳本。
• 按照ACID屬性,如Durability和Concurrency。
• 使用分片進行分區。
1.3 Impala架構
Impala是在Hadoop集羣中的許多系統上運行的MPP(大規模並行處理)查詢執行引擎。 與傳統存儲系統不同,impala與其存儲引擎解耦。 它有三個主要組件,即Impala daemon(Impalad),Impala Statestore和Impala元數據或metastore.
1.3.1 Impala的核心組件
Statestore Daemon
• Name Service,負責收集分佈在集羣中各個impalad進程的資源信息、各節點健康狀況,同步節點信息。在集羣中運行一個StateStroe daemon進程。多數的生產環境上將它部署在namenode節點上。
Catalog Daemon
Metadata的通信服務,用於廣播impala ddl和DML語句的變更到所有的受影響的impala節點。因此新的表,新的load的數據,等等的等等通過任何Impala節點提交的查詢都可以立即看到這些信息。(在Impala 1.2之前,你必須運行REFRESH 或INVALIDATE METADATA 陳述,在每個節點上同步變更的元數據信息,現在,只有通過外部機制(如Hive)或將數據上載到Amazon S3文件系統來執行DDL或DML時,才需要這些語句),在你的集羣上運行有一個這樣的後臺進程,最好與狀態守護進程位於同一主機上。
Impala Daemon(impalad)
Impala的後臺進程。基於HDFS、HBASE和Amazon S3上的數據計劃和執行查詢。在集羣上的每個DataNode節點上運行一個impalad進程。
• 接收client、hue、jdbc或者odbc的各種接口的查詢、Query執行並返回給中心協調節點。
• 子節點上的守護進程,負責向statestore保持通信,彙報工作。
每當將查詢提交到特定節點上的impalad時,該節點充當該查詢的“協調器節點”。 Impalad還在其他節點上運行多個查詢。 接受查詢後,Impalad讀取和寫入數據文件,並通過將工作分發到Impala集羣中的其他Impala節點來並行化查詢。 當查詢處理各種Impalad實例時,所有查詢都將結果返回到中央協調節點。
根據需要,可以將查詢提交到專用Impalad或以負載平衡方式提交到集羣中的另一Impalad。
impala-shell:
命令行接口,用於向Impala守護進程發出查詢。您可以在網絡上的任何地方的一臺或多臺主機上安裝此功能,不一定是datanode,甚至與Impala在同一個集羣中。它可以遠程連接到Impala守護進程的任何實例。
考慮集羣性能問題,一般將StateStoreDaemon與 Catalog Daemon放在統一節點上,因之間要做通信。
1.3.2 整體架構流程
1:客戶端向某一個Impalad發送一個query(SQL)
Impalad會與StateStore保持連接(通信),確定Impala集羣哪些Impalad是否健康可工作,與NameNode得到數據元數據(數據的位置等);每個Impalad通過Catalog可知表元數據數據信息。
2: Impalad將query解析爲具體的執行計劃Planner, 交給當前機器Coordinator即爲中心協調節點。
Impalad通過jni,將query傳送給java前端,由java前端完成語法分析和生成執行計劃(Planner),並將執行計劃封裝成thrift格式返回,執行計劃分爲多個階段,每一個階段叫做一個(計劃片段)PlanFragment,每一個PlanFragment在執行時可以由多個Impalad實例並行執行(有些PlanFragmeng只能由一個Impalad實例執行)。
3.Coordinator(中心協調節點)根據執行計劃Planner,通過本機Executor執行,並轉發給其它有數據的impalad用Executor進行執行。
4.impalad的Executor之間可進行通信,可能需要一些數據的處理。
5.各個impalad的Executor執行完成後,將結果返回給中心協調節點。
用戶調用GetNext()方法獲取計算結果,如果是insert語句,則將計算結果寫回hdfs
當所有輸入數據被消耗光,執行結束(完成)。
在執行過程中,如果有任何故障發生,則整個執行失敗。
6.有中心節點Coordinator將匯聚的查詢結果返回給客戶端。
1.3.3 Impala與Hive的異同
數據存儲:
使用相同的存儲數據池都支持把數據存儲於HDFS, HBase。
元數據:
兩者使用相同的元數據。
SQL解釋處理:
比較相似都是通過詞法分析生成執行計劃。
執行計劃:
Hive: 依賴於MapReduce執行框架,執行計劃分成 map->shuffle->reduce->map->shuffle->reduce…的模型。如果一個Query會 被編譯成多輪MapReduce,則會有更多的寫中間結果。由於MapReduce執行框架本身的特點,過多的中間過程會增加整個Query的執行時間。
Impala: 把執行計劃表現爲一棵完整的執行計劃樹,可以更自然地分發執行計劃到各個Impalad執行查詢,而不用像Hive那樣把它組合成管道型的 map->reduce模式,以此保證Impala有更好的併發性和避免不必要的中間sort與shuffle。
數據流:
• Hive: 採用推的方式,每一個計算節點計算完成後將數據主動推給後續節點。
• Impala: 採用拉的方式,後續節點通過getNext主動向前面節點要數據,以此方式數據可以流式的返回給客戶端,且只要有1條數據被處理完,就可以立即展現出來,而不用等到全部處理完成,更符合SQL交互式查詢使用。
內存使用:
• Hive: 在執行過程中如果內存放不下所有數據,則會使用外存,以保證Query能順序執行完。每一輪MapReduce結束,中間結果也會寫入HDFS中,同樣由於MapReduce執行架構的特性,shuffle過程也會有寫本地磁盤的操作。
• Impala: 在遇到內存放不下數據時,當前版本1.0.1是直接返回錯誤,而不會利用外存,以後版本應該會進行改進。這使用得Impala目前處理Query會受到一 定的限制,最好還是與Hive配合使用。Impala在多個階段之間利用網絡傳輸數據,在執行過程不會有寫磁盤的操作(insert除外)
調度
• Hive任務的調度依賴於Hadoop的調度策略。
• Impala的調度由自己完成,目前的調度算法會盡量滿足數據的局部性,即掃描數據的進程應儘量靠近數據本身所在的物理機器。但目前調度暫時還沒有考慮負載均衡的問題。從Cloudera的資料看,Impala程序的瓶頸是網絡IO,目前Impala中已經存在對Impalad機器網絡吞吐進行統計,但目前還沒有利用統計結果進行調度。
容錯
• Hive任務依賴於Hadoop框架的容錯能力,可以做到很好的failover
• Impala中不存在任何容錯邏輯,如果執行過程中發生故障,則直接返回錯誤。當一個Impalad失敗時,在這個Impalad上正在運行的所有query都將失敗。但由於Impalad是對等的,用戶可以向其他Impalad提交query,不影響服務。當StateStore失敗時,也不會影響服務,但由於Impalad已經不能再更新集羣狀態,如果此時有其他Impalad失敗,則無法及時發現。這樣調度時,如果有一個已經失效的Impalad調度了一個任務,則整個query無法執行。
1.3.4 Impala的查詢流程
1.4 Impala安裝
安裝CDH6,裏面自帶Impala,CDH6的參考文檔:https://blog.csdn.net/tototuzuoquan/article/details/85111018
安裝後的效果:
1.5 Impala Shell
1.5.1 Impala shell外部shell
命令
Impala shell的命令分爲一般命令,查詢特定選項以及表和數據庫特定選項,如下所述。
通用命令
• help
• version
• history
• shell (or) !
• connect
• exit | quit
查詢特定的選項
• Set/unset
• Profile
• Explain
表和數據庫特定選項
• Alter
• describe
• drop
• insert
• select
• show
• use
基本數據類型
Sr.No | 數據類型及說明 |
---|---|
1 | BIGINT 此數據類型存儲數值,此數據類型的範圍爲-9223372036854775808至9223372036854775807.此數據類型在create table和alter table語句中使用。 |
2 | BOOLEAN 此數據類型只存儲true或false值,它用於create table語句的列定義。 |
3 | CHAR 此數據類型是固定長度的存儲,它用空格填充,可以存儲最大長度爲255。 |
4 | DECIMAL 此數據類型用於存儲十進制值,並在create table和alter table語句中使用。 |
5 | DOUBLE 此數據類型用於存儲正值或負值4.94065645841246544e-324d -1.79769313486231570e + 308範圍內的浮點值。 |
6 | ** FLOAT ** 此數據類型用於存儲正或負1.40129846432481707e-45 … 3.40282346638528860e + 38範圍內的單精度浮點值數據類型。 |
7 | ** INT ** 此數據類型用於存儲4字節整數,範圍從-2147483648到2147483647。 |
8 | ** SMALLINT ** 此數據類型用於存儲2字節整數,範圍爲-32768到32767。 |
9 | ** STRING ** 這用於存儲字符串值。 |
10 | ** TIMESTAMP ** 此數據類型用於表示時間中的點。 |
11 | ** TINYINT ** 此數據類型用於存儲1字節整數值,範圍爲-128到127。 |
12 | ** VARCHAR ** 此數據類型用於存儲可變長度字符,最大長度爲65,535。 |
13 | ** ARRAY ** 這是一個複雜的數據類型,它用於存儲可變數量的有序元素。 |
14 | ** Map ** 這是一個複雜的數據類型,它用於存儲可變數量的鍵值對。 |
15 | ** Struct ** 這是一種複雜的數據類型,用於表示單個項目的多個字段。 |
Impla-shell相關參數
下面是Impala的外部Shell的一些參數:
-h (--help) 幫助
-v (--version) 查詢版本信息
-V (--verbose) 啓用詳細輸出
--quiet 關閉詳細輸出
-p 顯示執行計劃
-i hostname (--impalad=hostname) 指定連接主機格式hostname:port 默認端口21000, impalad shell 默認連接本機impalad
- r(--refresh_after_connect)刷新所有元數據
-q query (--query=query) 從命令行執行查詢,不進入impala-shell
-d default_db (--database=default_db) 指定數據庫
-B(--delimited)去格式化輸出
--output_delimiter=character 指定分隔符
--print_header 打印列名
-f query_file(--query_file=query_file)執行查詢文件,以分號分隔
-o filename (--output_file filename) 結果輸出到指定文件
-c 查詢執行失敗時繼續執行
-k (--kerberos) 使用kerberos安全加密方式運行impala-shell
-l 啓用LDAP認證
-u 啓用LDAP時,指定用戶名
示例:
編寫外部sql文件outersql.sql,文件內容如下:
[root@hadoop2 impala]# cat outersql.sql
use default;
select * from tab2;
通過impala-shell執行外部sql文件:
[root@hadoop2 impala]# impala-shell -i hadoop2 -f outersql.sql
Starting Impala Shell without Kerberos authentication
Connected to hadoop2:21000
Server version: impalad version 3.0.0-cdh6.0.1 RELEASE (build 9a74a5053de5f7b8dd983802e6d75e58d31472db)
Query: use default
Query: select * from tab2
Query submitted at: 2019-09-16 10:01:29 (Coordinator: http://hadoop2:25000)
Query progress can be monitored at: http://hadoop2:25000/query_plan?query_id=58415ef715ff66dc:7f6bd85600000000
+----+-------+---------------+
| id | col_1 | col_2 |
+----+-------+---------------+
| 1 | true | 12789.123 |
| 2 | false | 1243.5 |
| 3 | false | 24453.325 |
| 4 | false | 2423.3254 |
| 5 | true | 243.325 |
| 60 | false | 243565423.325 |
| 70 | true | 243.325 |
| 80 | false | 243423.325 |
| 90 | true | 243.325 |
+----+-------+---------------+
Fetched 9 row(s) in 4.67s
在如直接在impala-shell的後面執行sql語句:
[root@hadoop2 impala]# impala-shell -i hadoop2 -q 'select count(0) from tab2';
Starting Impala Shell without Kerberos authentication
Connected to hadoop2:21000
Server version: impalad version 3.0.0-cdh6.0.1 RELEASE (build 9a74a5053de5f7b8dd983802e6d75e58d31472db)
Query: select count(0) from tab2
Query submitted at: 2019-09-16 10:21:36 (Coordinator: http://hadoop2:25000)
Query progress can be monitored at: http://hadoop2:25000/query_plan?query_id=60409a284c3015ac:5892e5bc00000000
+----------+
| count(0) |
+----------+
| 9 |
+----------+
Fetched 1 row(s) in 0.12s
[root@hadoop2 impala]#
1.5.2 Impala內部shell
不進入Impala內部,直接執行的impala-shell
例如:
[root@hadoop2 ~]# impala-shell -i hadoop3 --quiet -- 通過外部Shell查看Impala幫助
[hadoop3:21000] default>
[hadoop3:21000] default> select version();
+-----------------------------------------------------------------------------------------+
| version() |
+-----------------------------------------------------------------------------------------+
| impalad version 3.0.0-cdh6.0.1 RELEASE (build 9a74a5053de5f7b8dd983802e6d75e58d31472db) |
| Built on Wed Sep 19 11:27:37 PDT 2018 |
+-----------------------------------------------------------------------------------------+
[hadoop3:21000] default> show databases;
+------------------+----------------------------------------------+
| name | comment |
+------------------+----------------------------------------------+
| _impala_builtins | System database for Impala builtin functions |
| default | Default Hive database |
+------------------+----------------------------------------------+
[hadoop3:21000] default> create database test2;
+----------------------------+
| summary |
+----------------------------+
| Database has been created. |
+----------------------------+
[hadoop3:21000] default> show databases;
+------------------+----------------------------------------------+
| name | comment |
+------------------+----------------------------------------------+
| _impala_builtins | System database for Impala builtin functions |
| default | Default Hive database |
| test2 | |
+------------------+----------------------------------------------+
[hadoop3:21000] test2>
再如:
[hadoop2:21000] default> show databases;
Query: show databases
+------------------+----------------------------------------------+
| name | comment |
+------------------+----------------------------------------------+
| _impala_builtins | System database for Impala builtin functions |
| data_center | |
| default | Default Hive database |
| test2 | |
+------------------+----------------------------------------------+
Fetched 4 row(s) in 0.21s
[hadoop2:21000] default> show tables in data_center;
Query: show tables in data_center
+---------------+
| name |
+---------------+
| tb_agent_area |
| tb_shop |
+---------------+
Fetched 2 row(s) in 0.11s
[hadoop2:21000] data_center> describe tb_member_card;
Query: describe tb_member_card
+------------------+---------------+-------------------------------------------------+
| name | type | comment |
+------------------+---------------+-------------------------------------------------+
| userid | varchar(40) | 會員id |
| areacode | varchar(10) | 區域code(從tb_shop表中獲取) |
| areaname | varchar(30) | 區域中文名稱(從tb_shop表中獲取) |
| agentid | varchar(40) | 代理商id(從tb_shop表中獲取) |
| agentname | varchar(20) | 代理商中文名稱(從tb_shop表中獲取) |
| rootcategoryid | varchar(40) | 一級類目ID |
| parentcategoryid | varchar(40) | 二級類目ID |
| industryid | varchar(40) | 經營類目id(從tb_shop表中獲取) |
| industryname | varchar(20) | 經營類目中文名稱(從tb_shop表中獲取) |
| cardid | varchar(40) | 會員卡號Id |
| shopid | varchar(40) | 店鋪Id,主鍵唯一 |
| rechargefee | decimal(10,2) | 充值金額 |
| givefee | decimal(10,2) | 贈送金額 |
| usefee | decimal(10,2) | 消耗金額 |
| refundfee | decimal(10,2) | 退款金額 |
| addtime | bigint | 創建時間,也是上面充值時間,退款時間等 |
| createdate | bigint | 創建天,時間格式爲yyyyMMdd的integer值,分區時間 |
| pt_createdate | int | 創建天,時間格式爲yyyyMMdd的integer值,分區時間 |
+------------------+---------------+-------------------------------------------------+
Fetched 18 row(s) in 4.46s
[hadoop2:21000] data_center> desc tb_member_card;
Query: describe tb_member_card
+------------------+---------------+-------------------------------------------------+
| name | type | comment |
+------------------+---------------+-------------------------------------------------+
| userid | varchar(40) | 會員id |
| areacode | varchar(10) | 區域code(從tb_shop表中獲取) |
| areaname | varchar(30) | 區域中文名稱(從tb_shop表中獲取) |
| agentid | varchar(40) | 代理商id(從tb_shop表中獲取) |
| agentname | varchar(20) | 代理商中文名稱(從tb_shop表中獲取) |
| rootcategoryid | varchar(40) | 一級類目ID |
| parentcategoryid | varchar(40) | 二級類目ID |
| industryid | varchar(40) | 經營類目id(從tb_shop表中獲取) |
| industryname | varchar(20) | 經營類目中文名稱(從tb_shop表中獲取) |
| cardid | varchar(40) | 會員卡號Id |
| shopid | varchar(40) | 店鋪Id,主鍵唯一 |
| rechargefee | decimal(10,2) | 充值金額 |
| givefee | decimal(10,2) | 贈送金額 |
| usefee | decimal(10,2) | 消耗金額 |
| refundfee | decimal(10,2) | 退款金額 |
| addtime | bigint | 創建時間,也是上面充值時間,退款時間等 |
| createdate | bigint | 創建天,時間格式爲yyyyMMdd的integer值,分區時間 |
| pt_createdate | int | 創建天,時間格式爲yyyyMMdd的integer值,分區時間 |
+------------------+---------------+-------------------------------------------------+
Fetched 18 row(s) in 0.03s
[hadoop2:21000] data_center> select count(*) from tb_member_card;
Query: select count(*) from tb_member_card
Query submitted at: 2019-09-15 22:51:19 (Coordinator: http://hadoop2:25000)
Query progress can be monitored at: http://hadoop2:25000/query_plan?query_id=74a30bb25fbf783:24bf49f00000000
+----------+
| count(*) |
+----------+
| 0 |
+----------+
Fetched 1 row(s) in 0.47s
[localhost:21000] > select count(distinct c_birth_month) from customer;
+-------------------------------+
| count(distinct c_birth_month) |
+-------------------------------+
| 12 |
+-------------------------------+
[localhost:21000] > select count(*) from customer where c_email_address is null;
+----------+
| count(*) |
+----------+
| 0 |
+----------+
[localhost:21000] > select distinct c_salutation from customer limit 10;
+--------------+
| c_salutation |
+--------------+
| Mr. |
| Ms. |
| Dr. |
| |
| Miss |
| Sir |
| Mrs. |
+--------------+
[hadoop2:21000] data_center> show tables;
Connection lost, reconnecting...
Query: use `data_center`
Query: show tables
+----------------+
| name |
+----------------+
| tb_agent_area |
| tb_member_card |
| tb_shop |
+----------------+
Fetched 3 row(s) in 0.02s
[hadoop2:21000] data_center> alter table tb_shop rename to shop;
Query: alter table tb_shop rename to shop
+--------------------------+
| summary |
+--------------------------+
| Renaming was successful. |
+--------------------------+
Fetched 1 row(s) in 5.52s
[hadoop2:21000] data_center> show tables;
Query: show tables
+----------------+
| name |
+----------------+
| shop |
| tb_agent_area |
| tb_member_card |
+----------------+
Fetched 3 row(s) in 0.02s
[hadoop2:21000] data_center> create table t1(x int);
Query: create table t1(x int)
+-------------------------+
| summary |
+-------------------------+
| Table has been created. |
+-------------------------+
Fetched 1 row(s) in 0.26s
[hadoop2:21000] data_center> insert into t1 values(1),(3),(2),(4);
Query: insert into t1 values(1),(3),(2),(4)
Query submitted at: 2019-09-16 00:09:56 (Coordinator: http://hadoop2:25000)
Query progress can be monitored at: http://hadoop2:25000/query_plan?query_id=874ed9b5a0c973a6:5b9ea0fc00000000
Modified 4 row(s) in 6.52s
[hadoop2:21000] data_center> select x from t1 order by x desc;
Query: select x from t1 order by x desc
Query submitted at: 2019-09-16 00:16:10 (Coordinator: http://hadoop2:25000)
Query progress can be monitored at: http://hadoop2:25000/query_plan?query_id=ed473c678702d9aa:96ab138700000000
+---+
| x |
+---+
| 4 |
| 3 |
| 2 |
| 1 |
+---+
[hadoop2:21000] data_center> select min(x),max(x),sum(x),avg(x) from t1;
Query: select min(x),max(x),sum(x),avg(x) from t1
Query submitted at: 2019-09-16 00:21:15 (Coordinator: http://hadoop2:25000)
Query progress can be monitored at: http://hadoop2:25000/query_plan?query_id=b74aa0dc8354b2f4:843e1aad00000000
+--------+--------+--------+--------+
| min(x) | max(x) | sum(x) | avg(x) |
+--------+--------+--------+--------+
| 1 | 4 | 10 | 2.5 |
+--------+--------+--------+--------+
Fetched 1 row(s) in 0.33s
[hadoop2:21000] data_center> insert into t2 values(1,'one'),(3,'three'),(5,'five');
Query: insert into t2 values(1,'one'),(3,'three'),(5,'five')
Query submitted at: 2019-09-16 00:23:28 (Coordinator: http://hadoop2:25000)
Query progress can be monitored at: http://hadoop2:25000/query_plan?query_id=c043b83ea895c2ae:3e68fac500000000
Modified 3 row(s) in 4.99s
[hadoop2:21000] data_center> select word from t1 join t2 on(t1.x = t2.id);
Query: select word from t1 join t2 on(t1.x = t2.id)
Query submitted at: 2019-09-16 00:24:51 (Coordinator: http://hadoop2:25000)
Query progress can be monitored at: http://hadoop2:25000/query_plan?query_id=4945efba241c9e41:f6cc18d800000000
+-------+
| word |
+-------+
| one |
| three |
+-------+
Fetched 2 row(s) in 0.35s
顯示錶中的文件信息
[hadoop2:21000] data_center> show table stats t1;
Query: show table stats t1
+-------+--------+------+--------------+-------------------+--------+-------------------+-----------------------------------------------------------+
| #Rows | #Files | Size | Bytes Cached | Cache Replication | Format | Incremental stats | Location |
+-------+--------+------+--------------+-------------------+--------+-------------------+-----------------------------------------------------------+
| -1 | 1 | 8B | NOT CACHED | NOT CACHED | TEXT | false | hdfs://hadoop2:8020/user/hive/warehouse/data_center.db/t1 |
+-------+--------+------+--------------+-------------------+--------+-------------------+-----------------------------------------------------------+
Fetched 1 row(s) in 0.03s
[hadoop2:21000] data_center>
顯示錶中文件:
[hadoop2:21000] data_center> SHOW FILES IN t1;
Query: SHOW FILES IN t1
+----------------------------------------------------------------------------------------------------------------+------+-----------+
| Path | Size | Partition |
+----------------------------------------------------------------------------------------------------------------+------+-----------+
| hdfs://hadoop2:8020/user/hive/warehouse/data_center.db/t1/874ed9b5a0c973a6-5b9ea0fc00000000_1276072409_data.0. | 8B | |
+----------------------------------------------------------------------------------------------------------------+------+-----------+
Fetched 1 row(s) in 0.02s
[hadoop2:21000] data_center>
再查看錶的信息:
[hadoop2:21000] data_center> DESCRIBE FORMATTED t1;
Query: describe FORMATTED t1
+------------------------------+------------------------------------------------------------+----------------------+
| name | type | comment |
+------------------------------+------------------------------------------------------------+----------------------+
| # col_name | data_type | comment |
| | NULL | NULL |
| x | int | NULL |
| | NULL | NULL |
| # Detailed Table Information | NULL | NULL |
| Database: | data_center | NULL |
| Owner: | root | NULL |
| CreateTime: | Mon Sep 16 00:09:23 CST 2019 | NULL |
| LastAccessTime: | UNKNOWN | NULL |
| Retention: | 0 | NULL |
| Location: | hdfs://hadoop2:8020/user/hive/warehouse/data_center.db/t1 | NULL |
| Table Type: | MANAGED_TABLE | NULL |
| Table Parameters: | NULL | NULL |
| | transient_lastDdlTime | 1568563763 |
| | NULL | NULL |
| # Storage Information | NULL | NULL |
| SerDe Library: | org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe | NULL |
| InputFormat: | org.apache.hadoop.mapred.TextInputFormat | NULL |
| OutputFormat: | org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat | NULL |
| Compressed: | No | NULL |
| Num Buckets: | 0 | NULL |
| Bucket Columns: | [] | NULL |
| Sort Columns: | [] | NULL |
+------------------------------+------------------------------------------------------------+----------------------+
Fetched 23 row(s) in 0.07s
[hadoop2:21000] data_center>
NDV() 方法返回不重複數據的數據條數。
[hadoop2:21000] data_center> show create table t1;
Query: show create table t1
+----------------------------------------------------------------------+
| result |
+----------------------------------------------------------------------+
| CREATE TABLE data_center.t1 ( |
| x INT |
| ) |
| STORED AS TEXTFILE |
| LOCATION 'hdfs://hadoop2:8020/user/hive/warehouse/data_center.db/t1' |
| |
+----------------------------------------------------------------------+
1.6 Load CSV Data From Local Files
這個章節介紹如何從本地文件中加載CSV 數據。在本地Linux環境中,執行以下命令:
[root@hadoop2 ~]# hdfs dfs -mkdir -p /user/username/sample_data/tab1 /user/username/ sample_data/tab2
接下來爲TAB1和TAB2準備一些數據。拷貝下面的內容到你本地的.csv文件中。
tab1.csv的內容如下:
1,true,123.123,2012-10-24 08:55:00
2,false,1243.5,2012-10-25 13:40:00
3,false,24453.325,2008-08-22 09:33:21.123
4,false,243423.325,2007-05-12 22:32:21.33454
5,true,243.325,1953-04-22 09:11:33
tab2.csv的內容如下:
1,true,12789.123
2,false,1243.5
3,false,24453.325
4,false,2423.3254
5,true,243.325
60,false,243565423.325
70,true,243.325
80,false,243423.325
90,true,243.325
使用如下的命令,分別將.csv文件放到獨立的HDFS目錄中。
[root@hadoop2 impala]# hdfs dfs -put tab1.csv /user/username/sample_data/tab1
[root@hadoop2 impala]# hdfs dfs -ls /user/username/sample_data/tab1
Found 1 items
-rw-r--r-- 3 root supergroup 192 2019-09-16 09:08 /user/username/sample_data/tab1/tab1.csv
[root@hadoop2 impala]# hdfs dfs -put tab2.csv /user/username/sample_data/tab2
[root@hadoop2 impala]# hdfs dfs -cat /user/username/sample_data/tab2/tab2.csv
1,true,12789.123
2,false,1243.5
3,false,24453.325
4,false,2423.3254
5,true,243.325
60,false,243565423.325
70,true,243.325
80,false,243423.325
90,true,243.325
每個數據文件的名稱是沒有意義的。事實上,當Impala第一次檢查數據目錄下的文件的時候,它認爲在目錄下的所有文件組成了表的數據,而不是多少文件,也不管文件的名字是什麼。
創建tab1表:
[hadoop2:21000] default> DROP TABLE IF EXISTS tab1;
Query: DROP TABLE IF EXISTS tab1
+-------------------------+
| summary |
+-------------------------+
| Table has been dropped. |
+-------------------------+
Fetched 1 row(s) in 0.12s
[hadoop2:21000] default> CREATE EXTERNAL TABLE tab1
> (
> id INT,
> col_1 BOOLEAN,
> col_2 DOUBLE,
> col_3 TIMESTAMP
> )
> ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
> LOCATION '/user/username/sample_data/tab1';
Query: CREATE EXTERNAL TABLE tab1
(
id INT,
col_1 BOOLEAN,
col_2 DOUBLE,
col_3 TIMESTAMP
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/user/username/sample_data/tab1'
+-------------------------+
| summary |
+-------------------------+
| Table has been created. |
+-------------------------+
WARNINGS: Impala does not have READ_WRITE access to path 'hdfs://hadoop2:8020/user/username/sample_data'
Fetched 1 row(s) in 0.11s
[hadoop2:21000] default> select * from tab1;
Query: select * from tab1
Query submitted at: 2019-09-16 09:37:33 (Coordinator: http://hadoop2:25000)
Query progress can be monitored at: http://hadoop2:25000/query_plan?query_id=4f44222f65a4cbf6:a624798000000000
+----+-------+------------+-------------------------------+
| id | col_1 | col_2 | col_3 |
+----+-------+------------+-------------------------------+
| 1 | true | 123.123 | 2012-10-24 08:55:00 |
| 2 | false | 1243.5 | 2012-10-25 13:40:00 |
| 3 | false | 24453.325 | 2008-08-22 09:33:21.123000000 |
| 4 | false | 243423.325 | 2007-05-12 22:32:21.334540000 |
| 5 | true | 243.325 | 1953-04-22 09:11:33 |
+----+-------+------------+-------------------------------+
Fetched 5 row(s) in 5.93s
[hadoop2:21000] default> DROP TABLE IF EXISTS tab2;
Query: DROP TABLE IF EXISTS tab2
+-----------------------+
| summary |
+-----------------------+
| Table does not exist. |
+-----------------------+
Fetched 1 row(s) in 0.01s
[hadoop2:21000] default> CREATE EXTERNAL TABLE tab2
> (
> id INT,
> col_1 BOOLEAN,
> col_2 DOUBLE
> )
> ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
> LOCATION '/user/username/sample_data/tab2';
Query: CREATE EXTERNAL TABLE tab2
(
id INT,
col_1 BOOLEAN,
col_2 DOUBLE
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/user/username/sample_data/tab2'
+-------------------------+
| summary |
+-------------------------+
| Table has been created. |
+-------------------------+
WARNINGS: Impala does not have READ_WRITE access to path 'hdfs://hadoop2:8020/user/username/sample_data'
Fetched 1 row(s) in 0.09s
[hadoop2:21000] default> DROP TABLE IF EXISTS tab3;
Query: DROP TABLE IF EXISTS tab3
+-----------------------+
| summary |
+-----------------------+
| Table does not exist. |
+-----------------------+
Fetched 1 row(s) in 0.01s
[hadoop2:21000] default> CREATE TABLE tab3
> (
> id INT,
> col_1 BOOLEAN,
> col_2 DOUBLE,
> month INT,
> day INT
> )
> ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
Query: CREATE TABLE tab3
(
id INT,
col_1 BOOLEAN,
col_2 DOUBLE,
month INT,
day INT
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
+-------------------------+
| summary |
+-------------------------+
| Table has been created. |
+-------------------------+
Fetched 1 row(s) in 0.41s
[hadoop2:21000] default>
要注意的是,上面的tab1和tab2指定了LOCATION,它的地址爲最開始的時候創建的csv文件所在的目錄位置。
1.7 分區表創建、refresh表、獲取數據的元數據
創建分區表,並插入數據:
create database external_partitions;
use external_partitions;
create table logs (field1 string, field2 string, field3 string)
partitioned by (year string, month string , day string, host string)
row format delimited fields terminated by ',';
insert into logs partition (year="2013", month="07", day="28", host="host1") values ("foo","foo","foo");
insert into logs partition (year="2013", month="07", day="28", host="host2") values ("foo","foo","foo");
insert into logs partition (year="2013", month="07", day="29", host="host1") values ("foo","foo","foo");
insert into logs partition (year="2013", month="07", day="29", host="host2") values ("foo","foo","foo");
insert into logs partition (year="2013", month="08", day="01", host="host1") values ("foo","foo","foo");
查看hdfs中數據目錄:
添加分區:
alter table logs add partition (year="2013",month="07",day="28",host="host1");
alter table log_type add partition (year="2013",month="07",day="28",host="host2");
alter table log_type add partition (year="2013",month="07",day="29",host="host1");
alter table log_type add partition (year="2013",month="08",day="01",host="host1");
當數據文件中的數據被手動修改(如添加、移動或者改變了)了之後,使用refresh語句更新表。例如:
refresh log_type;
select * from log_type limit 100;
+--------+--------+--------+------+-------+-----+-------+
| field1 | field2 | field3 | year | month | day | host |
+--------+--------+--------+------+-------+-----+-------+
| bar | baz | bletch | 2013 | 07 | 28 | host1 |
| bar | baz | bletch | 2013 | 08 | 01 | host1 |
| bar | baz | bletch | 2013 | 07 | 29 | host1 |
| bar | baz | bletch | 2013 | 07 | 28 | host2 |
+--------+--------+--------+------+-------+-----+-------+
在hive中創建一個db,然後切回到impala-shell中,發現數據庫並沒有顯示,若想讓它顯示,可以使用如下命令刷新數據,並獲得最新數據:
INVALIDATE METADATA;
1.8 參考資料
https://www.w3cschool.cn/impala/impala_overview.html
https://blog.csdn.net/flyingsk/article/details/8590000
https://blog.csdn.net/qiyongkang520/article/details/51067803