第1章 Impala的基本概念
1.1 什么是Impala
Cloudera公司推出,提供對HDFS、HBase數據的高性能、低延遲的交互式SQL查詢功能。
基於Hive,使用內存計算,兼顧數據倉庫、具有實時、批處理、多並發等優點。
是CDH平台首選的PB級大數據實時查詢分析引擎。
1.2 Impala的優缺點
1.2.1 優點
1)基於內存運算,不需要把中間結果寫入磁盤,省掉了大量的I/O開銷。
2)無需轉換為Mapreduce,直接訪問存儲在HDFS,HBase中的數據進行作業調度,速度快。
3)使用了支持Data locality的I/O調度機制,盡可能地將數據和計算分配在同一台機器上進行,減少了網絡開銷。
4)支持各種文件格式,如TEXTFILE 、SEQUENCEFILE 、RCFile、Parquet。
5)可以訪問hive的metastore,對hive數據直接做數據分析。
1.2.2 缺點
1)對內存的依賴大,且完全依賴於hive。
2)實踐中,分區超過1萬,性能嚴重下降。
3)只能讀取文本文件,而不能直接讀取自定義二進制文件。
4)每當新的記錄/文件被添加到HDFS中的數據目錄時,該表需要被刷新。
1.3 Impala的架構

從上圖可以看出,Impala自身包含三個模塊:Impalad、Statestore(存放Hive的元數據)和Catalog(拉取真實數據),除此之外它還依賴Hive Metastore和HDFS。
1)impalad:
接收client的請求、Query執行並返回給中心協調節點;
子節點上的守護進程,負責向statestore保持通信,匯報工作。
2)Catalog:
分發表的元數據信息到各個impalad中;
接收來自statestore的所有請求。
3)Statestore:
負責收集分布在集群中各個impalad進程的資源信息、各節點健康狀況,同步節點信息;
第1章 Impala的安裝
2.1 Impala的地址
1)Impala的官網
2)Impala文檔查看
http://impala.apache.org/impala-docs.html
3)下載地址
http://impala.apache.org/downloads.html
2.2 Impala的安裝方式
Cloudera Manager(CDH首推)
下面我們使用Cloudera Manager安裝Impala
1.在主頁中點擊添加服務

2.選擇Impala服務

- 進行角色分配

注意:最好將StateStore和CataLog Sever單獨部署在同一節點上。
2.配置Impala

3.啟動Impala

4.安裝成功

2.3 Impala 的監護管理
可以通過下面的鏈接來訪問Impala的監護管理頁面:
• 查看StateStore
• 查看Catalog
2.4 Impala的初體驗
1.啟動Impala
[root@hadoop102 ~]# impala-shell
2.查看數據庫
[hadoop102:21000] > show databases;
3.打開默認數據庫
[hadoop102:21000] > use default;
4.顯示數據庫中的表
[hadoop102:21000] > show tables;
5.創建一張student表
[hadoop102:21000] > create table student(id int, name string)
> row format delimited
> fields terminated by '\t';
6.向表中導入數據
[hadoop102:21000] > load data inpath '/student.txt' into table student;
注意:
1) 關閉(修改hdfs的配置dfs.permissions為false)或修改hdfs的權限,否則impala沒有寫的權限
[hdfs@hadoop102 ~]$ hadoop fs -chmod 777 /
2) Impala不支持將本地文件導入到表中
7.查詢
[hadoop102:21000] > select * from student;
8.退出impala
[hadoop102:21000] > quit;
第3章 Impala的操作命令
3.1 Impala的外部shell
| 選項 |
描述 |
| -h, --help |
顯示幫助信息 |
| -v or --version |
顯示版本信息 |
| -i hostname, --impalad=hostname |
指定連接運行 impalad 守護進程的主機。默認端口是 21000。 |
| -q query, --query=query |
從命令行中傳遞一個shell 命令。執行完這一語句后 shell 會立即退出。 |
| -f query_file, --query_file= query_file |
傳遞一個文件中的 SQL 查詢。文件內容必須以分號分隔 |
| -o filename or --output_file filename |
保存所有查詢結果到指定的文件。通常用於保存在命令行使用 -q 選項執行單個查詢時的查詢結果。 |
| -c |
查詢執行失敗時繼續執行 |
| -d default_db or --database=default_db |
指定啟動后使用的數據庫,與建立連接后使用use語句選擇數據庫作用相同,如果沒有指定,那么使用default數據庫 |
| -r or --refresh_after_connect |
建立連接后刷新 Impala 元數據 |
| -p, --show_profiles |
對 shell 中執行的每一個查詢,顯示其查詢執行計划 |
| -B(--delimited) |
去格式化輸出 |
| --output_delimiter=character |
指定分隔符 |
| --print_header |
打印列名 |
- 連接指定hadoop103的impala主機
[root@hadoop102 datas]# impala-shell -i hadoop103
- 使用-q查詢表中數據,並將數據寫入文件中
[hdfs@hadoop103 ~]$ impala-shell -q 'select * from student' -o output.txt
- 查詢執行失敗時繼續執行
[hdfs@hadoop103 ~]$ vim impala.sql
select * from student;
select * from stu;
select * from student;
[hdfs@hadoop103 ~]$ impala-shell -f impala.sql;
(加上-c 失敗會繼續執行)
[hdfs@hadoop103 ~]$ impala-shell -c -f impala.sql;
- 在hive中創建表后,使用-r刷新元數據
hive> create table stu(id int, name string);
[hadoop103:21000] > show tables;
Query: show tables
+---------+
| name |
+---------+
| student |
+---------+
[hdfs@hadoop103 ~]$ impala-shell -r
[hadoop103:21000] > show tables;
Query: show tables
+---------+
| name |
+---------+
| stu |
| student |
+---------+
- 顯示查詢執行計划
[hdfs@hadoop103 ~]$ impala-shell -p
[hadoop103:21000] > select * from student;
- 去格式化輸出
[root@hadoop103 ~]# impala-shell -q 'select * from student' -B --output_delimiter="\t" -o output.txt
[root@hadoop103 ~]# cat output.txt
1001 tignitgn
1002 yuanyuan
1003 haohao
1004 yunyun
3.2 Impala的內部shell
| 選項 |
描述 |
| help |
顯示幫助信息 |
| explain <sql> |
顯示執行計划 |
| profile |
(查詢完成后執行) 查詢最近一次查詢的底層信息 |
| shell <shell> |
不退出impala-shell執行shell命令 |
| version |
顯示版本信息(同於impala-shell -v) |
| connect |
連接impalad主機,默認端口21000(同於impala-shell -i) |
| refresh <tablename> |
增量刷新元數據庫 |
| invalidate metadata |
全量刷新元數據庫(同於 impala-shell -r) |
| history |
歷史命令 |
- 查看執行計划
explain select * from student;
- 查詢最近一次查詢的底層信息
[hadoop103:21000] > select count(*) from student;
[hadoop103:21000] > profile;
- 查看hdfs及linux文件系統
[hadoop103:21000] > shell hadoop fs -ls /;
[hadoop103:21000] > shell ls -al ./;
- 刷新指定表的元數據
hive> load data local inpath '/opt/module/datas/student.txt' into table student;
[hadoop103:21000] > select * from student;
[hadoop103:21000] > refresh student;
[hadoop103:21000] > select * from student;
- 查看歷史命令
[hadoop103:21000] > history;
第4章 Impala的數據類型
| Hive數據類型 |
Impala數據類型 |
長度 |
| TINYINT |
TINYINT |
1byte有符號整數 |
| SMALINT |
SMALINT |
2byte有符號整數 |
| INT |
INT |
4byte有符號整數 |
| BIGINT |
BIGINT |
8byte有符號整數 |
| BOOLEAN |
BOOLEAN |
布爾類型,true或者false |
| FLOAT |
FLOAT |
單精度浮點數 |
| DOUBLE |
DOUBLE |
雙精度浮點數 |
| STRING |
STRING |
字符系列。可以指定字符集。可以使用單引號或者雙引號。 |
| TIMESTAMP |
TIMESTAMP |
時間類型 |
| BINARY |
不支持 |
字節數組 |
注意:Impala雖然支持array,map,struct復雜數據類型,但是支持並不完全,一般處理方法,將復雜類型轉化為基本類型,通過hive創建表。
第5章 DDL數據定義
5.1 創建數據庫
CREATE DATABASE [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path];
注:Impala不支持WITH DBPROPERTIE…語法
[hadoop103:21000] > create database db_hive
> WITH DBPROPERTIES('name' = 'ttt');
Query: create database db_hive
WITH DBPROPERTIES('name' = 'ttt')
ERROR: AnalysisException: Syntax error in line 2:
WITH DBPROPERTIES('name' = 'ttt')
^
Encountered: WITH
Expected: COMMENT, LOCATION
5.2 查詢數據庫
5.2.1 顯示數據庫
[hadoop103:21000] > show databases;
[hadoop103:21000] > show databases like 'hive*';
Query: show databases like 'hive*'
+---------+---------+
| name | comment |
+---------+---------+
| hive_db | |
+---------+---------+
[hadoop103:21000] > desc database hive_db;
Query: describe database hive_db
+---------+----------+---------+
| name | location | comment |
+---------+----------+---------+
| hive_db | | |
+---------+----------+---------+
5.2.2 刪除數據庫
[hadoop103:21000] > drop database hive_db;
[hadoop103:21000] > drop database hive_db cascade;
注:Impala不支持alter database語法,當數據庫被 USE 語句選中時,無法刪除======
5.3 創建表
5.3.1 管理表
[hadoop103:21000] > create table if not exists student2(
> id int, name string
> )
> row format delimited fields terminated by '\t'
> stored as textfile
> location '/user/hive/warehouse/student2';
[hadoop103:21000] > desc formatted student2;
5.3.2 外部表
[hadoop103:21000] > create external table stu_external(
> id int,
> name string)
> row format delimited fields terminated by '\t' ;
5.4 分區表
5.4.1 創建分區表
[hadoop103:21000] > create table stu_par(id int, name string)
> partitioned by (month string)
> row format delimited
> fields terminated by '\t';
5.4.2 向表中導入數據
[hadoop103:21000] > alter table stu_par add partition (month='201810');
[hadoop103:21000] > load data inpath '/student.txt' into table stu_par partition(month='201810');
[hadoop103:21000] > insert into table stu_par partition (month = '201811')
> select * from student;
注意:
如果分區沒有,load data導入數據時,不能自動創建分區。
5.4.3 查詢分區表中的數據
[hadoop103:21000] > select * from stu_par where month = '201811';
5.4.4 增加多個分區
[hadoop103:21000] > alter table stu_par add partition (month='201812') partition (month='201813');
5.4.5 刪除分區
[hadoop103:21000] > alter table stu_par drop partition (month='201812');
5.4.5 查看分區
[hadoop103:21000] > show partitions stu_par;
第6章 DML數據操作
6.1 數據導入(基本同hive類似)
注意:impala不支持load data local inpath…
6.2 數據的導出
1.impala不支持insert overwrite…語法導出數據
2.impala 數據導出一般使用 impala -o
[root@hadoop103 ~]# impala-shell -q 'select * from student' -B --output_delimiter="\t" -o output.txt
[root@hadoop103 ~]# cat output.txt
1001 tignitgn
1002 yuanyuan
1003 haohao
1004 yunyun
Impala 不支持export和import命令
第7章 查詢
- 基本的語法跟hive的查詢語句大體一樣
- Impala不支持CLUSTER BY, DISTRIBUTE BY, SORT BY
- Impala中不支持分桶表
- Impala不支持COLLECT_SET(col)和explode(col)函數
- Impala支持開窗函數
[hadoop103:21000] > select name,orderdate,cost,sum(cost) over(partition by month(orderdate)) from business;
第3章 函數
第8章 函數
8.1 自定義函數
1.創建一個Maven工程Hive
2.導入依賴
| <dependencies> <!-- https://mvnrepository.com/artifact/org.apache.hive/hive-exec --> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-exec</artifactId> <version>1.2.1</version> </dependency> </dependencies> |
3.創建一個類
| package com.atguigu.hive; import org.apache.hadoop.hive.ql.exec.UDF;
public class Lower extends UDF {
public String evaluate (final String s) {
if (s == null) { return null; }
return s.toLowerCase(); } } |
4.打成jar包上傳到服務器/opt/module/jars/udf.jar
5. 將jar包上傳到hdfs的指定目錄
hadoop fs -put hive_udf-0.0.1-SNAPSHOT.jar /
6. 創建函數
[hadoop103:21000] > create function mylower(string) returns string location '/hive_udf-0.0.1-SNAPSHOT.jar' symbol='com.atguigu.hive_udf.Hive_UDF';
7. 使用自定義函數
[hadoop103:21000] > select ename, mylower(ename) from emp;
8.通過show functions查看自定義的函數
[hadoop103:21000] > show functions;
Query: show functions
+-------------+-----------------+-------------+---------------+
| return type | signature | binary type | is persistent |
+-------------+-----------------+-------------+---------------+
| STRING | mylower(STRING) | JAVA | false |
+-------------+-----------------+-------------+---------------+
第9章 存儲和壓縮
| 文件格式 |
壓縮編碼 |
Impala是否可直接創建 |
是否可直接插入 |
| Parquet |
Snappy(默認), GZIP; |
Yes |
支持:CREATE TABLE, INSERT, 查詢 |
| Text |
LZO,gzip,bzip2,snappy |
Yes. 不指定 STORED AS 子句的 CREATE TABLE 語句,默認的文件格式就是未壓縮文本 |
支持:CREATE TABLE, INSERT, 查詢。如果使用 LZO 壓縮,則必須在 Hive 中創建表和加載數據 |
| RCFile |
Snappy, GZIP, deflate, BZIP2 |
Yes. |
僅支持查詢,在 Hive 中加載數據 |
| SequenceFile |
Snappy, GZIP, deflate, BZIP2 |
Yes. |
僅支持查詢,在 Hive 中加載數據 |
注:impala不支持ORC格式
1.創建parquet格式的表並插入數據進行查詢
[hadoop104:21000] > create table student2(id int, name string)
row format delimited
fields terminated by '\t'
stored as PARQUET;
[hadoop104:21000] > insert into table student2 values(1001,'zhangsan');
[hadoop104:21000] > select * from student2;
2.創建sequenceFile格式的表,插入數據時報錯
[hadoop104:21000] > insert into table student3 values(1001,'zhangsan');
Query: insert into table student3 values(1001,'zhangsan')
Query submitted at: 2018-10-25 20:59:31 (Coordinator: http://hadoop104:25000)
Query progress can be monitored at: http://hadoop104:25000/query_plan?query_id=da4c59eb23481bdc:26f012ca00000000
WARNINGS: Writing to table format SEQUENCE_FILE is not supported. Use query option ALLOW_UNSUPPORTED_FORMATS to override.
第10章 優化
1、 盡量將StateStore和Catalog部署到同一個節點,保證他們正常通行。
2、 通過對Impala Daemon內存限制(默認256M)及StateStore工作線程數,來提高Impala的執行效率。
3、 SQL優化,使用之前調用執行計划。
4、 選擇合適的文件格式進行存儲,提高查詢效率。
5、 避免產生很多小文件(如果有其他程序產生的小文件,可以使用中間表,將小文件數據存放到中間表。然后通過insert…select…方式中間表的數據插入到最終表中)
6、 使用合適的分區技術,根據分區粒度測算
7、 使用compute stats進行表信息搜集,當一個內容表或分區明顯變化,重新計算統計相關數據表或分區。因為行和不同值的數量差異可能導致impala選擇不同的連接順序時,表中使用的查詢。
[hadoop104:21000] > compute stats student;
Query: compute stats student
+-----------------------------------------+
| summary |
+-----------------------------------------+
| Updated 1 partition(s) and 2 column(s). |
+-----------------------------------------+
8、 網絡io的優化:
a.盡可能的做條件過濾
b.使用limit字句
c.輸出文件時,避免使用美化輸出
d.盡量少用全量元數據的刷新
