impala 基礎知識及使用


第1章 Impala的基本概念

1.1 什么是Impala

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

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

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

1.2 Impala的優缺點

1.2.1 優點

1)基於內存運算,不需要把中間結果寫入磁盤,省掉了大量的I/O開銷。

2)無需轉換為Mapreduce直接訪問存儲在HDFSHBase中的數據進行作業調度,速度快

3)使用了支持Data localityI/O調度機制,盡可能地將數據和計算分配在同一台機器上進行,減少了網絡開銷

4)支持各種文件格式,如TEXTFILE SEQUENCEFILE 、RCFile、Parquet

5)可以訪問hivemetastore,對hive數據直接做數據分析

1.2.2 缺點

1)對內存的依賴大,且完全依賴於hive。

2)實踐中,分區超過1萬,性能嚴重下降。

3)只能讀取文本文件,而不能直接讀取自定義二進制文件。

4)每當新的記錄/文件被添加到HDFS中的數據目錄時,該表需要被刷新。

 

1.3 Impala的架構

 

 

 

 

 

 

從上圖可以看出,Impala自身包含三個模塊:ImpaladStatestore(存放Hive的元數據)Catalog(拉取真實數據),除此之外它還依賴Hive MetastoreHDFS

 

1impalad

 

接收client的請求、Query執行並返回給中心協調節點

 

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

 

2)Catalog:

分發表的元數據信息到各個impalad

接收來自statestore的所有請求

3)Statestore:

負責收集分布在集群中各個impalad進程的資源信息、各節點健康狀況,同步節點信息

第1章 Impala的安裝

2.1 Impala的地址

1Impala的官網

http://impala.apache.org/

2Impala文檔查看

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

3)下載地址

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

2.2 Impala的安裝方式

Cloudera ManagerCDH首推)

下面我們使用Cloudera Manager安裝Impala

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

 

 

 

2.選擇Impala服務

 

 

 

 

  1. 進行角色分配

 

 

 

注意:最好將StateStoreCataLog Sever單獨部署在同一節點上。

 2.配置Impala

 

  3.啟動Impala

  4.安裝成功

 

 

2.3 Impala 的監護管理

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

查看StateStore

http://hadoop102:25010/

 查看Catalog

http://hadoop102:25020/

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.permissionsfalse)或修改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

打印列名

  1. 連接指定hadoop103impala主機

[root@hadoop102 datas]# impala-shell -i hadoop103

  1. 使用-q查詢表中數據,並將數據寫入文件中

[hdfs@hadoop103 ~]$ impala-shell -q 'select * from student' -o output.txt

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

[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;

  1. 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 |

+---------+

  1. 顯示查詢執行計划

[hdfs@hadoop103 ~]$ impala-shell -p

[hadoop103:21000] > select * from student;

  1. 去格式化輸出

[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

歷史命令

  1. 查看執行計划

explain select * from student;

  1. 查詢最近一次查詢的底層信息

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

[hadoop103:21000] > profile;

  1. 查看hdfslinux文件系統

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

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

  1. 刷新指定表的元數據

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;

  1. 查看歷史命令

[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雖然支持arraymapstruct復雜數據類型,但是支持並不完全,一般處理方法,將復雜類型轉化為基本類型,通過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 不支持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;

第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,gzipbzip2snappy

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.盡量少用全量元數據的刷新

 

 


免責聲明!

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



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