天天看點

Impala入門學習與使用詳解一、Impala的基本概念二、Impala的安裝三、Impala的操作指令四、Impala的資料類型五、DDL資料定義六、DML資料操作七、查詢八、函數九、存儲和壓縮十、優化

目錄

一、Impala的基本概念

1.1 什麼是Impala

1.2 Impala的優缺點

1.2.1 優點

1.2.2 缺點

1.3 Impala的架構

二、Impala的安裝

2.1 Impala的位址

2.2 Impala的安裝方式

2.3 Impala 的監護管理

2.4 Impala的初體驗

三、Impala的操作指令

3.1 Impala的外部shell

3.2 Impala的内部shell

四、Impala的資料類型

五、DDL資料定義

5.1 建立資料庫

5.2查詢資料庫

5.2.1顯示資料庫

5.2.2删除資料庫

5.3建立表

5.3.1 管理表

5.3.2 外部表

5.4分區表

5.4.1 建立分區表

5.4.2 向表中導入資料

5.4.3 查詢分區表中的資料

5.4.4 增加多個分區

5.4.5 删除分區

5.4.5檢視分區

六、DML資料操作

6.1 資料導入(基本同hive類似)

6.2 資料的導出

七、查詢

八、函數

8.1 自定義函數

九、存儲和壓縮

十、優化

一、Impala的基本概念

1.1 什麼是Impala

Cloudera公司推出,提供對HDFS、Hbase資料的高性能、低延遲的互動式SQL查詢功能。

基于Hive,使用記憶體計算,兼顧資料倉庫、具有實時、批處理、多并發等優點。

是CDH平台首選的PB級大資料實時查詢分析引擎。

Impala入門學習與使用詳解一、Impala的基本概念二、Impala的安裝三、Impala的操作指令四、Impala的資料類型五、DDL資料定義六、DML資料操作七、查詢八、函數九、存儲和壓縮十、優化

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資料直接做資料分析。
Impala入門學習與使用詳解一、Impala的基本概念二、Impala的安裝三、Impala的操作指令四、Impala的資料類型五、DDL資料定義六、DML資料操作七、查詢八、函數九、存儲和壓縮十、優化

1.2.2 缺點

  1. 對記憶體的依賴大,且完全依賴于hive。
  2. 實踐中,分區超過1萬,性能嚴重下降。
  3. 隻能讀取文本檔案,而不能直接讀取自定義二進制檔案。
  4. 每當新的記錄/檔案被添加到HDFS中的資料目錄時,該表需要被重新整理。

1.3 Impala的架構

Impala入門學習與使用詳解一、Impala的基本概念二、Impala的安裝三、Impala的操作指令四、Impala的資料類型五、DDL資料定義六、DML資料操作七、查詢八、函數九、存儲和壓縮十、優化

從上圖可以看出,Impala自身包含三個子產品:Impalad、Statestore和Catalog,除此之外它還依賴Hive Metastore和HDFS。

  1. Impalad:

接收client的請求、Query執行并傳回給中心協調節點;

子節點上的守護程序,負責向statestore保持通信,彙報工作。

  1. Catalog:

分發表的中繼資料資訊到各個impalad中;

接收來自statestore的所有請求。

  1. Statestore:

負責收集分布在叢集中各個impalad程序的資源資訊、各節點健康狀況,同步節點資訊;

負責query的協調排程。

二、Impala的安裝

2.1 Impala的位址

  1. Impala的官網

http://impala.apache.org/

  1. Impala文檔檢視

http://impala.apache.org/impala-docs.html

  1. 下載下傳位址

http://impala.apache.org/downloads.html

2.2 Impala的安裝方式

  1. Cloudera Manager(CDH首推)
  2. 手動安裝

下面我們使用Cloudera Manager安裝Impala

1.在首頁中點選添加服務

Impala入門學習與使用詳解一、Impala的基本概念二、Impala的安裝三、Impala的操作指令四、Impala的資料類型五、DDL資料定義六、DML資料操作七、查詢八、函數九、存儲和壓縮十、優化

2.選擇Impala服務

Impala入門學習與使用詳解一、Impala的基本概念二、Impala的安裝三、Impala的操作指令四、Impala的資料類型五、DDL資料定義六、DML資料操作七、查詢八、函數九、存儲和壓縮十、優化

3.進行角色配置設定

Impala入門學習與使用詳解一、Impala的基本概念二、Impala的安裝三、Impala的操作指令四、Impala的資料類型五、DDL資料定義六、DML資料操作七、查詢八、函數九、存儲和壓縮十、優化

注意:最好将StateStore和CataLog Sever單獨部署在同一節點上。

4.配置Impala

Impala入門學習與使用詳解一、Impala的基本概念二、Impala的安裝三、Impala的操作指令四、Impala的資料類型五、DDL資料定義六、DML資料操作七、查詢八、函數九、存儲和壓縮十、優化

5.啟動Impala

Impala入門學習與使用詳解一、Impala的基本概念二、Impala的安裝三、Impala的操作指令四、Impala的資料類型五、DDL資料定義六、DML資料操作七、查詢八、函數九、存儲和壓縮十、優化

6.安裝成功

Impala入門學習與使用詳解一、Impala的基本概念二、Impala的安裝三、Impala的操作指令四、Impala的資料類型五、DDL資料定義六、DML資料操作七、查詢八、函數九、存儲和壓縮十、優化

2.3 Impala 的監護管理

可以通過下面的連結來通路Impala的監護管理頁面:

• 檢視StateStore

http://hadoop102:25020/

 • 檢視Catalog

http://hadoop102:25010/

2.4 Impala的初體驗

1.啟動Impala

[[email protected] ~]# 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;
           

注意:

  • 關閉(修改hdfs的配置dfs.permissions為false)或修改hdfs的權限,否則impala沒有寫的權限
[[email protected] ~]$ hadoop fs -chmod -R 777 /
           
  • Impala不支援将本地檔案導入到表中

7.查詢

[hadoop103:21000] > select * from student;
           

8.退出impala

[hadoop103:21000] > quit;
           

三、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 列印列名

1.連接配接指定hadoop103的impala主機

[[email protected] datas]# impala-shell -i hadoop103
           

2.使用-q查詢表中資料,并将資料寫入檔案中

[[email protected] ~]$ impala-shell -q 'select * from student' -o output.txt
           

3.查詢執行失敗時繼續執行

[[email protected] ~]$ vim impala.sql

select * from student;

select * from stu;

select * from student;

[[email protected] ~]$ impala-shell -f impala.sql;

[[email protected] ~]$ impala-shell -c -f impala.sql;
           

4.在hive中建立表後,使用-r重新整理中繼資料

hive> create table stu(id int, name string);

[hadoop103:21000] > show tables;

Query: show tables

+---------+

| name    |

+---------+

| student |

+---------+

[[email protected] ~]$ impala-shell -r

[hadoop103:21000] > show tables;

Query: show tables

+---------+

| name    |

+---------+

| stu     |

| student |

+---------+
           

5.顯示查詢執行計劃

[[email protected] ~]$ impala-shell -p

[hadoop103:21000] > select * from student;
           

6.去格式化輸出

[[email protected] ~]# impala-shell -q 'select * from student' -B --output_delimiter="\t" -o output.txt

[[email protected] ~]# 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 曆史指令

1.檢視執行計劃

explain select * from student;
           

2.查詢最近一次查詢的底層資訊

[hadoop103:21000] > select count(*) from student;

[hadoop103:21000] > profile;
           

3.檢視hdfs及linux檔案系統

[hadoop103:21000] > shell hadoop fs -ls /;

[hadoop103:21000] > shell ls -al ./;
           

4.重新整理指定表的中繼資料

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;
           

5.檢視曆史指令

[hadoop103:21000] > history;
           

四、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建立表。

五、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;
           

六、DML資料操作

6.1 資料導入(基本同hive類似)

注意:impala不支援load data local inpath…

6.2 資料的導出

1.impala不支援insert overwrite…文法導出資料

2.impala 資料導出一般使用 impala -o

[[email protected] ~]# impala-shell -q 'select * from student' -B --output_delimiter="\t" -o output.txt

[[email protected] ~]# cat output.txt

1001    tignitgn

1002    yuanyuan

1003    haohao

1004    yunyun
           

Impala 不支援export和import指令

七、查詢

  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.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.xsluo.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/ hive_udf-0.0.1-SNAPSHOT.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.xsluo.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         |

+-------------+-----------------+-------------+---------------+
           

九、存儲和壓縮

檔案格式 壓縮編碼 Impala是否可直接建立 是否可直接插入
Parquet Snappy(預設), GZIP; Yes 支援:CREATE TABLE, INSERT, 查詢
TextFile LZO,gzip,bzip2,snappy Yes. 不指定 STORED AS 子句的 CREATE TABLE 語句,預設的檔案格式就是未壓縮文本 支援:CREATE TABLE, INSERT, 查詢。如果使用 LZO 壓縮,則必須在 Hive 中建立表和加載資料
RCFile Snappy, GZIP, deflate, BZIP2 Yes. 支援CREATE,查詢,在 Hive 中加載資料
SequenceFile Snappy, GZIP, deflate, BZIP2 Yes. 支援:CREATE TABLE, INSERT, 查詢。需設定

注: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] > create table student3(id int, name string)

                  > row format delimited

                  > fields terminated by '\t'

                  > stored as 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.

[hadoop104:21000] > set ALLOW_UNSUPPORTED_FORMATS=true;

[hadoop104:21000] > insert into table student3 values(1001,'zhangsan');
           

十、優化

1.盡量将StateStore和Catalog單獨部署到同一個節點,保證他們正常通信。

2.通過對Impala Daemon記憶體限制(預設256M)及StateStore工作線程數,來提高Impala的執行效率。

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

4.選擇合适的檔案格式進行存儲,提高查詢效率。

5.避免産生很多小檔案(如果有其他程式産生的小檔案,可以使用中間表,将小檔案資料存放到中間表。然後通過insert…select…方式中間表的資料插入到最終表中)

6.使用合适的分區技術,根據分區粒度測算

7.使用compute stats進行表資訊搜集,當一個内容表或分區明顯變化,重新計算統計相關資料表或分區。因為行和不同值的數量差異可能導緻impala選擇不同的連接配接順序時進行查詢。

[hadoop104:21000] > show table stats student;

Query: show table stats student

+-------+--------+------+--------------+-------------------+--------+-------------------+---------------------------------------------------+

| #Rows | #Files | Size | Bytes Cached | Cache Replication | Format | Incremental stats | Location                                          |

+-------+--------+------+--------------+-------------------+--------+-------------------+---------------------------------------------------+

| -1    | 1      | 67B  | NOT CACHED   | NOT CACHED        | TEXT   | false             | hdfs://hadoop102:8020/user/hive/warehouse/student |

+-------+--------+------+--------------+-------------------+--------+-------------------+---------------------------------------------------+

[hadoop104:21000] > compute stats student;

Query: compute stats student

+-----------------------------------------+

| summary                                 |

+-----------------------------------------+

| Updated 1 partition(s) and 2 column(s). |

+-----------------------------------------+

[hadoop104:21000] > show table stats student;

Query: show table stats student

+-------+--------+------+--------------+-------------------+--------+-------------------+---------------------------------------------------+

| #Rows | #Files | Size | Bytes Cached | Cache Replication | Format | Incremental stats | Location                                          |

+-------+--------+------+--------------+-------------------+--------+-------------------+---------------------------------------------------+

| 6     | 1      | 67B  | NOT CACHED   | NOT CACHED        | TEXT   | false             | hdfs://hadoop102:8020/user/hive/warehouse/student |

+-------+--------+------+--------------+-------------------+--------+-------------------+---------------------------------------------------+
           

8.網絡io的優化:

      –a.避免把整個資料發送到用戶端

      –b.盡可能的做條件過濾

      –c.使用limit字句

      –d.輸出檔案時,避免使用美化輸出

      –e.盡量少用全量中繼資料的重新整理

9.使用profile輸出底層資訊計劃,再做相應環境優化。