即席查詢--Impala


1章 Impala的基本概念

1.1 什么是Impala

Cloudera公司推出,提供對HDFSHbase數據的高性能、低延遲的交互式SQL查詢功能。

基於Hive,使用內存計算,兼顧數據倉庫、具有實時、批處理、多並發等優點。

CDH平台首選的PB級大數據實時查詢分析引擎。

1.2 Impala優缺點

 

1.3 Impala組成

 

 

 

 

1.4 Impala運行原理

 

從上圖可以看出,Impala自身包含三個模塊:Impaladimpala  daemon),StatestoreCatalog,除此之外,他還依賴Hive MetastoreHDFS

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進程,ImpaladQuery PlannerSQL語句進行解析,生成解析樹;然后,Planner把這個查詢的解析樹變成若干PlanFragment,發送到Query Coordinator.

3Coordinator通過從元數據庫中獲取元數據,從HDFS的名稱節點中獲取數據地址,以得到存儲這個查詢相關數據的所有數據節點。

4Coordinator初始化相應impalad上的任務執行,即把查詢任務分配給所有存儲這個查詢相關數據的數據節點。

5Query 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有兩種安裝方式:

  1. 手動安裝。
  2. CDH安裝(推薦)。

下面我們使用Cloudera Manager安裝Impala

1)在主頁中點擊添加服務

 

 

 

 

 

2.3 Impala 的監護管理

  可以通過下面的鏈接來訪問Impala的監護管理頁面:

1.查看StateStore

    http://hadoop102:25020/

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.permissionsfalse)或修改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雖然支持arraymapstruct復雜數據類型,但是支持並不完全,一般處理方法,將復雜類型轉化為基本類型,通過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 不支持exportimport命令

7章 查詢

1.基本的語法跟hive的查詢語句大體一樣

2.Impala不支持CLUSTER BY, DISTRIBUTE BY, SORT BY

3.Impala中不支持分桶表

4.Impala不支持COLLECT_SET(col)explodecol)函數

5.Impala支持開窗函數

[hadoop103:21000] > select name,orderdate,cost,sum(cost) over(partition by month(orderdate)) from business;

第8章 自定義函數

  1. 創建一個maven工程Hive
  2. 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

LZOgzipbzip2snappy

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;

HiveImpala上查看會自動進行轉換成可讀形式

10章 優化

1、盡量將StateStoreCatalog單獨部署到同一個節點,保證他們正常通行。

2、通過對Impala Daemon內存限制(默認256M)及StateStore工作線程數,來提高Impala的執行效率。

3SQL優化,使用之前調用執行計划

4、選擇合適的文件格式進行存儲,提高查詢效率。

5、避免產生很多小文件(如果有其他程序產生的小文件,可以使用中間表,將小文件數據存放到中間表。然后通過insertselect…方式中間表的數據插入到最終表中)

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輸出底層信息計划,在做相應環境優

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM