第1章 Impala的基本概念
1.1 什么是Impala
Cloudera公司推出,提供對HDFS、Hbase數據的高性能、低延遲的交互式SQL查詢功能。
基於Hive,使用內存計算,兼顧數據倉庫、具有實時、批處理、多並發等優點。
是CDH平台首選的PB級大數據實時查詢分析引擎。
1.2 Impala優缺點
1.3 Impala組成
1.4 Impala運行原理
從上圖可以看出,Impala自身包含三個模塊:Impalad(impala daemon),Statestore,Catalog,除此之外,他還依賴Hive Metastore和HDFS。
Impalad:接收client的請求、query執行並返回給中心協調節點;子節點上的守護進程,負責向statestore保持通信,匯報工作。
Catalog:分發表的元數據信息到各個impalad中;接收來自statestore的所有請求。
Statestore:負責收集分布在集群中各個impala進程的資源信息、各個節點健康狀態,同步節點信息;負責query的協調調度。
Impala執行查詢的具體過程:
1)當用戶提交查詢前,Impala先創建一個負責協調客戶端提交的查詢的Impalad進程,該進程會向Impala State Store提交注冊訂閱信息,State Store會創建一個statestored進程,statestored進程通過創建多個線程來處理Impalad的注冊訂閱信息。
2)用戶通過CLI客戶端提交一個查詢到impalad進程,Impalad的Query Planner對SQL語句進行解析,生成解析樹;然后,Planner把這個查詢的解析樹變成若干PlanFragment,發送到Query Coordinator.
3)Coordinator通過從元數據庫中獲取元數據,從HDFS的名稱節點中獲取數據地址,以得到存儲這個查詢相關數據的所有數據節點。
4)Coordinator初始化相應impalad上的任務執行,即把查詢任務分配給所有存儲這個查詢相關數據的數據節點。
5)Query Executor通過流式交換中間輸出,並由Query Coordinator匯聚來自各個impalad的結果。
Coordinator把匯總后的結果返回給CLI客戶端。
第2章 Impala的安裝
2.1 Impala的地址
1.Impala的官網
http://impala.apache.org/
2.Impala文檔查看
http://impala.apache.org/impala-docs.html
3.下載地址
http://impala.apache.org/downloads.html
2.2 Impala的安裝方式
Impala有兩種安裝方式:
- 手動安裝。
- CDH安裝(推薦)。
下面我們使用Cloudera Manager安裝Impala:
1)在主頁中點擊添加服務
2.3 Impala 的監護管理
可以通過下面的鏈接來訪問Impala的監護管理頁面:
1.查看StateStore
2.查看Catalog
http://hadoop102:25010/
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.向表中導入數據
[hadoop103:21000] > load data inpath '/student.txt' into table student;
注意:
1) 關閉(修改hdfs的配置dfs.permissions為false)或修改hdfs的權限,否則impala沒有寫的權限
[hdfs@hadoop103 ~]$ hadoop fs -chmod 777 /
2) Impala不支持將本地文件導入到表中
7.查詢
[hadoop103:21000] > select * from student;
8.退出impala
[hadoop103:21000] > quit;
第3章 Impala的shell命令
3.1 impala-shell的外部命令參數語法
不需要進入到impala-shell交互命令行當中即可執行的命令參數
impala-shell后面執行的時候可以帶很多參數:
-h 查看幫助文檔
impala-shell -h
-r 刷新整個元數據,數據量大的時候,比較消耗服務器性能
impala-shell -r
-B 去格式化,查詢大量數據可以提高性能
--print_header 去格式化顯示列名
--output_delimiter 指定分隔符
-v 查看對應版本
impala-shell -v -V
-f 執行查詢文件
--query_file 指定查詢文件
cd /export/servers
vim impala-shell.sql
use weblog;
select * from ods_click_pageviews limit 10;
通過-f 參數來執行查詢文件
impala-shell -f impala-shell.sql
-i 連接到impalad
--impalad 指定impalad去執行任務
-o 保存執行結果到文件當中去
--output_file 指定輸出文件名
impala-shell -f impala-shell.sql -o hello.txt
-p 顯示查詢計划
impala-shell -f impala-shell.sql -p
-q 不使用impala-shell進行查詢
3.2 impala-shell的內部命令參數語法
進入impala-shell命令行之后可以執行的語法
help命令
幫助文檔
connect命令
connect hostname 連接到某一台機器上面去執行
refresh 命令
refresh dbname.tablename 增量刷新,刷新某一張表的元數據,主要用於刷新hive當中數據表里面的數據改變的情況
refresh mydb.stu;
invalidate metadata 命令:
invalidate metadata全量刷新,性能消耗較大,主要用於hive當中新建數據庫或者數據庫表的時候來進行刷新
explain 命令:
用於查看sql語句的執行計划
explain select * from stu;
explain的值可以設置成0,1,2,3等幾個值,其中3級別是最高的,可以打印出最全的信息
set explain_level=3;
profile命令:
執行sql語句之后執行,可以打印出更加詳細的執行步驟,
主要用於查詢結果的查看,集群的調優等
select * from stu;
profile;
第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 創建數據庫
1.創建命令
CREATE DATABASE [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path];
注:Impala不支持WITH DBPROPERTIE…語法
2. 錯誤演示
[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章 查詢
1.基本的語法跟hive的查詢語句大體一樣
2.Impala不支持CLUSTER BY, DISTRIBUTE BY, SORT BY
3.Impala中不支持分桶表
4.Impala不支持COLLECT_SET(col)和explode(col)函數
5.Impala支持開窗函數
[hadoop103:21000] > select name,orderdate,cost,sum(cost) over(partition by month(orderdate)) from business;
第8章 自定義函數
- 創建一個maven工程Hive
- maven依賴:
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>1.2.0</version>
</dependency>
3.創建一個類
import org.apache.hadoop.hive.ql.exec.UDF; import java.security.MessageDigest; public class MD5 extends UDF{ public static String evaluate(String value) { StringBuilder sb = new StringBuilder(); try { MessageDigest messageDigest = MessageDigest.getInstance("MD5"); byte[] bytes = messageDigest.digest(value.getBytes()); for (int i = 0; i < bytes.length; i++) { int tempInt = bytes[i] & 0xff; if (tempInt < 16) { sb.append(0); } sb.append(Integer.toHexString(tempInt)); } } catch (Exception e) { System.out.println(e.getMessage()); } return sb.toString(); } public static void main(String[] args) { String hello = "123456789"; System.out.println("MD5加密后的結果:" + evaluate(hello)); } }
4.達成jar包上傳到服務器/opt/module/jars/hive_udf-0.0.1-SNAPSHOT.jar
5.將jar包上傳到hdfs的指定目錄
Hadoop fs -put hive_udf-0.0.1-SNAPSHOT.jar /user/impala/user_function/
6.創建函數,impala-shell中執行,需要指定返回值(returns)
Create function md5(string) returns string location 'hdfs://nameservice/user/impala/user_function/hive_udf-0.0.1-SNAPSHOT.jar' symbol='com.business.bi.udf.MD5';
7.使用自定義函數
Show functions;
Select MD(name) from tbname;
第9章 壓縮和存儲
文件格式 |
壓縮編碼 |
Impala是否可直接創建 |
是否可直接插入 |
Parquet 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格式-RCFile
desc formated tablename;
創建parquet格式的表並插入數據進行查詢
[bigdata13:21000] >
create table student3(id int, name string)
row format delimited
fields terminated by '\t'
stored as PARQUET;
[bigdata13:21000] > insert into table student3 values(1001,'zhangsan');
[bigdata13:21000] > select * from student3;
在Hive和Impala上查看會自動進行轉換成可讀形式
第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.盡可能的做條件過濾
–c.使用limit字句
–d.輸出文件時,避免使用美化輸出
–e.盡量少用全量元數據的刷新
使用profile輸出底層信息計划,在做相應環境優