Impala介紹,Impala架構,Impala安裝,impala Shell ,分區創建,refresh,load數據,獲取數據的元數據

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 優點

  1. Impala不需要把中間結果寫入磁盤,省掉了大量的I/O開銷。
  2. 省掉了MapReduce作業啓動的開銷。MapReduce啓動task的速度很慢(默認每個心跳間隔是3秒鐘),Impala直接通過相應的服務進程來進行作業調度,速度快了很多。
  3. Impala完全拋棄了MapReduce這個不太適合做SQL查詢的範式,而是像Dremel一樣借鑑了MPP(大規模並行處理)並行數據庫的思想另起爐竈,因此可做更多的查詢優化,從而省掉不必要的shuffle、sort等開銷。
  4. 通過使用LLVM來統一編譯運行時代碼,避免了爲支持通用編譯而帶來的不必要開銷。
  5. 用C++實現,做了很多有針對性的硬件優化,例如使用SSE指令。
  6. 使用了支持Data locality的I/O調度機制,儘可能地將數據和計算分配在同一臺機器上進行,減少了網絡開銷。
  7. 基於Hive使用內存計算,兼顧數據倉庫、具有實時、批處理、多併發等優點。
  8. 是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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章