Impala的安裝和使用


通過本地yum源進行安裝impala

所有cloudera軟件下載地址

http://archive.cloudera.com/cdh5/cdh/5/

http://archive.cloudera.com/cdh5/

1、 impala的介紹

imala基本介紹

impala是cloudera提供的一款高效率的sql查詢工具,提供實時的查詢效果,官方測試性能比hive快3到10倍,其sql查詢比sparkSQL還要更加快速,號稱是當前大數據領域最快的查詢sql工具,

impala是參照谷歌的新三篇論文(Caffeine、Pregel、Dremel

)當中的Dremel實現而來,其中舊三篇論文分別是(BigTable,GFS,MapReduce)分別對應我們即將學的HBase和已經學過的HDFS以及MapReduce

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

impala與hive的關系

impala是基於hive的大數據分析查詢引擎,直接使用hive的元數據庫metadata,意味着impala元數據都存儲在hive的metastore當中,並且impala兼容hive的絕大多數sql語法。所以需要安裝impala的話,必須先安裝hive,保證hive安裝成功,並且還需要啟動hive的metastore服務

impala優點

1、 impala比較快,非常快,特別快,因為所有的計算都可以放入內存當中進行完成,只要你內存足夠大

2、 擯棄了MR的計算,改用C++來實現,有針對性的硬件優化

3、 具有數據倉庫的特性,對hive的原有數據做數據分析

4、支持ODBC,jdbc遠程訪問

impala的缺點

1、基於內存計算,對內存依賴性較大

2、改用C++編寫,意味着維護難度增大

3、基於hive,與hive共存亡,緊耦合

4、穩定性不如hive,不存在數據丟失的情況

 

 

impala的架構以及查詢計划

Impala的架構模塊:

impala-server  ==>啟動的守護進程,執行我們的查詢計划 從節點,官方建議與所有的datanode裝在一起,可以通過hadoop的短路讀取特性實現數據的快速查詢

impala-statestore  ==》 狀態存儲區  主節點

impalas-catalog   ==》元數據管理區  主節點

查詢執行

impalad分為frontend和backend兩個層次, frondend用java實現(通過JNI嵌入impalad), 負責查詢計划生成, 而backend用C++實現, 負責查詢執行。

 

frontend生成查詢計划分為兩個階段:

(1)生成單機查詢計划,單機執行計划與關系數據庫執行計划相同,所用查詢優化方法也類似。

(2)生成分布式查詢計划。 根據單機執行計划, 生成真正可執行的分布式執行計划,降低數據移動, 盡量把數據和計算放在一起。

 

上圖是SQL查詢例子, 該SQL的目標是在三表join的基礎上算聚集, 並按照聚集列排序取topN。

 

impala的查詢優化器支持代價模型: 利用表和分區的cardinality,每列的distinct值個數等統計數據, impala可估算執行計划代價, 並生成較優的執行計划。 上圖左邊是frontend查詢優化器生成的單機查詢計划, 與傳統關系數據庫不同, 單機查詢計划不能直接執行, 必須轉換成如圖右半部分所示的分布式查詢計划。 該分布式查詢計划共分成6個segment(圖中彩色無邊框圓角矩形), 每個segment是可以被單台服務器獨立執行的計划子樹。

 

impala支持兩種分布式join方式, 表廣播和哈希重分布:

表廣播方式保持一個表的數據不動, 將另一個表廣播到所有相關節點(圖中t3);

哈希重分布的原理是根據join字段哈希值重新分布兩張表數據(譬如圖中t1和t2)。

 

分布式計划中的聚集函數分拆為兩個階段執行。第一步針對本地數據進行分組聚合(Pre-AGG)以降低數據量, 並進行數據重分步, 第二步, 進一步匯總之前的聚集結果(mergeAgg)計算出最終結果。

 

與聚集函數類似, topN也是分為兩個階段執行, (1)本地排序取topN,以降低數據量; (2) merge sort得到最終topN結果。

 

Backend從frontend接收plan segment並執行, 執行性能非常關鍵,impala采取的查詢性能優化措施有向量執行。 一次getNext處理一批記錄, 多個操作符可以做pipeline。LLVM編譯執行, CPU密集型查詢效率提升5倍以上。IO本地化。 利用HDFS short-circuit local read功能,實現本地文件讀取Parquet列存,相比其他格式性能最高提升5倍。

 

 

2、impala的安裝環境准備

需要提前安裝好hadoop,hive,這二個框架,並且hive需要在所有的impala安裝的節點上面都要有,因為impala需要引用hive的依賴包,hadoop的框架需要支持C程序訪問接口,查看下圖,如果有該路徑下有這么些文件,就證明支持C接口

 

3、下載impala所有依賴包

由於impala沒有提供tar包供我們進行安裝,只提供了rpm包,所以我們在安裝impala的時候,需要使用rpm包來進行安裝,rpm包只有cloudera公司提供了,所以我們去cloudera公司網站進行下載rpm包即可,但是另外一個問題,impala的rpm包依賴非常多的其他的rpm包,可以一個個的將依賴找出來,也可以將所有的rpm包下載下來,制作成我們本地yum源來進行安裝。我們這里就選擇制作我們本地的yum源來進行安裝,所以首先我們需要下載到所有的rpm包,下載地址如下

http://archive.cloudera.com/cdh5/repo-as-tarball/5.14.0/cdh5.14.0-centos6.tar.gz

下載好了之后,保留下,留作備用。

4、上傳壓縮包並解壓

將我們5個G的壓縮文件上傳/data02目錄下,並進行解壓

1
2
3
cd  /data02/
 
tar  -zxvf cdh5.14.0-centos6. tar .gz

 

5、開始安裝impala

安裝規划

服務名稱

node01

node02

node03

impala-catalog

不安裝

不安裝

安裝

impala-state-store

不安裝

不安裝

安裝

impala-server

安裝

安裝

安裝

 

主節點node03執行以下命令進行安裝

1
2
3
4
5
6
7
8
9
yum   install   impala -y
 
yum  install  impala-server -y
 
yum  install  impala-state-store  -y
 
yum  install  impala-catalog  -y
 
yum   install   impala-shell -y

從節點node01與node02安裝以下服務

1
yum  install  impala-server -y

6、所有節點配置impala

第一步修改hive-site.xml

node03機器修改hive-site.xml內容如下

hive-site.xml配置

1
vim  /export/servers/hive-1 .1.0-cdh5.14.0 /conf/hive-site .xml

  

復制代碼
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>

        <property>

                <name>javax.jdo.option.ConnectionURL</name>

                <value>jdbc:mysql://node03.hadoop.com:3306/hive?createDatabaseIfNotExist=true</value>

        </property>

        <property>

            <name>javax.jdo.option.ConnectionDriverName</name>

                <value>com.mysql.jdbc.Driver</value>

        </property>

        <property>

                <name>javax.jdo.option.ConnectionUserName</name>

                <value>root</value>

        </property>

        <property>

             <name>javax.jdo.option.ConnectionPassword</name>

                <value>123456</value>

        </property>

        <property>

                <name>hive.cli.print.current.db</name>

                <value>true</value>

        </property>

        <property>

                <name>hive.cli.print.header</name>

                <value>true</value>

        </property>

        <property>

                <name>hive.server2.thrift.bind.host</name>

                <value>node03.hadoop.com</value>

        </property>

        <property>

                <name>hive.metastore.uris</name>

                <value>thrift://node03.hadoop.com:9083</value>

        </property>

 <property>

                <name>hive.metastore.client.socket.timeout</name>

                <value>3600</value>

        </property>

 

</configuration>
復制代碼

第二步:將hive安裝發送到node02node01機器

在node03機器上面執行

1
2
3
4
5
cd  /export/servers/
 
scp  -r hive-1.1.0-cdh5.14.0/ node02:$PWD
 
scp  -r hive-1.1.0-cdh5.14.0/ node01:$PWD

第三步:node03啟動hive的metastore服務

啟動hive的metastore服務

node03機器啟動hive的metastore服務

1
2
3
4
5
cd   /export/servers/hive-1 .1.0-cdh5.14.0
 
nohup  bin /hive  --service metastore &
 
nohup  bin /hive  -- service hiveserver2 &

注意:一定要保證mysql的服務正常啟動,否則metastore的服務不能夠啟動

第四步所有hadoop節點修改hdfs-site.xml添加以下內容

所有節點創建文件夾

1
mkdir  -p  /var/run/hdfs-sockets

修改所有節點的hdfs-site.xml添加以下配置,修改完之后重啟hdfs集群生效

vim  /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/hdfs-site.xml

 

復制代碼
<property>

<name>dfs.client.read.shortcircuit</name>

<value>true</value>

</property>

<property>

<name>dfs.domain.socket.path</name>

<value>/var/run/hdfs-sockets/dn</value>

</property>

<property>

<name>dfs.client.file-block-storage-locations.timeout.millis</name>

<value>10000</value>

</property>

<property>
<name>dfs.datanode.hdfs-blocks-metadata.enabled</name>
<value>true</value>

</property>
復制代碼

注意:root用戶不需要這一步操作了,實際工作當中普通用戶需要這一步操作

創建文件夾  /var/run/hadoop-hdfs/

給這個文件夾賦予權限,例如如果我們用的是普通用戶,那就直接賦予普通用戶的權限

例如:

1
chown   -R  hadoop:hadoop    /var/run/hdfs-sockets/

因為我這里直接用的root用戶,所以不需要賦權限了

第五步:重啟hdfs

重啟hdfs文件系統

node01服務器上面執行以下命令

1
2
3
4
5
cd  /export/servers/hadoop-2 .6.0-cdh5.14.0/
 
sbin /stop-dfs .sh
 
sbin /start-dfs .sh

第六步:創建hadoop與hive的配置文件的連接

impala的配置目錄為  /etc/impala/conf

這個路徑下面需要把core-site.xml,hdfs-site.xml以及hive-site.xml拷貝到這里來,但是我們這里使用軟連接的方式會更好

所有節點執行以下命令創建鏈接到impala配置目錄下來

1
2
3
4
5
ln  -s  /export/servers/hadoop-2 .6.0-cdh5.14.0 /etc/hadoop/core-site .xml  /etc/impala/conf/core-site .xml
 
ln  -s  /export/servers/hadoop-2 .6.0-cdh5.14.0 /etc/hadoop/hdfs-site .xml  /etc/impala/conf/hdfs-site .xml
 
ln  -s  /export/servers/hive-1 .1.0-cdh5.14.0 /conf/hive-site .xml  /etc/impala/conf/hive-site .xml

第七步修改impala的配置文件

所有節點修改impala默認配置

所有節點更改impala默認配置文件以及添加mysql的連接驅動包

1
vim  /etc/default/impala
1
2
3
4
5
  
 
IMPALA_CATALOG_SERVICE_HOST=node03
 
IMPALA_STATE_STORE_HOST=node03

所有節點創建mysql的驅動包的軟連接

1
ln  -s  /export/servers/hive-1 .1.0-cdh5.14.0 /lib/mysql-connector-java-5 .1.38.jar  /usr/share/java/mysql-connector-java .jar

所有節點修改bigtop的java路徑

修改bigtop的java_home路徑

1
2
3
vim  /etc/default/bigtop-utils
 
export  JAVA_HOME= /export/servers/jdk1 .8.0_141

第八步:啟動impala服務

啟動impala服務

主節點node03啟動以下三個服務進程

1
2
3
4
5
service impala-state-store start
 
service impala-catalog start
 
service impala-server start

從節點啟動node01與node02啟動impala-server

1
service  impala-server  start

查看impala進程是否存在

1
ps  -ef |  grep  impala

注意:啟動之后所有關於impala的日志默認都在/var/log/impala 這個路徑下,node03機器上面應該有三個進程,node02與node01機器上面只有一個進程,如果進程個數不對,去對應目錄下查看報錯日志

瀏覽器頁面訪問:

訪問impalad的管理界面

http://node03:25000/

訪問statestored的管理界面

http://node03:25010/

7、impala的使用

7.1、impala-shell語法

7.1.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進行查詢

 

7.1.2、impala-shell的內部命令行參數語法

進入impala-shell命令行之后可以執行的語法

help命令

幫助文檔

 

connect命令

connect  hostname 連接到某一台機器上面去執行

 

refresh 命令

refresh dbname.tablename  增量刷新,刷新某一張表的元數據,主要用於刷新hive當中數據表里面的數據改變的情況

1
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語句之后執行,可以打印出更加詳細的執行步驟,

主要用於查詢結果的查看,集群的調優等

1
2
3
select  from  stu;
 
profile;

注意:在hive窗口當中插入的數據或者新建的數據庫或者數據庫表,在impala當中是不可直接查詢到的,需要刷新數據庫,在impala-shell當中插入的數據,在impala當中是可以直接查詢到的,不需要刷新數據庫,其中使用的就是catalog這個服務的功能實現的,catalog是impala1.2版本之后增加的模塊功能,主要作用就是同步impala之間的元數據。

7.2、創建數據庫

impala-shell進入到impala的交互窗口

7.1.2查看所有數據庫

1
show databases;

7.1.3創建與刪除數據庫

創建數據庫

1
2
3
CREATE  DATABASE  IF  NOT  EXISTS mydb1;
 
drop  database   if exists  mydb;

創建數據庫表並指定數據庫表數據存放hdfs的位置(與hive建表語法類似)

1
2
3
hdfs dfs -mkdir -p /input/impala
 
create   external  table   t3(id  int  , name  string ,age  int  )  row  forma
1
CREATE TABLE IF NOT EXISTS mydb1.student (name STRING, age INT, contact INT );

delimited fields terminated  by  '\t' location  '/input/impala/external';

7.3、 創建數據庫表

創建student表

1
CREATE  TABLE  IF  NOT  EXISTS mydb1.student ( name  STRING, age  INT , contact  INT  );

創建employ表

1
create table employee (Id INT, name STRING, age INT,address STRING, salary BIGINT);

7.3.1、 數據庫插入數據

1
2
3
4
5
6
7
8
9
10
11
insert into employee (ID,NAME,AGE,ADDRESS,SALARY)VALUES (1,  'Ramesh' , 32,  'Ahmedabad' , 20000 );
 
insert into employee values (2,  'Khilan' , 25,  'Delhi' , 15000 );
 
Insert into employee values (3,  'kaushik' , 23,  'Kota' , 30000 );
 
Insert into employee values (4,  'Chaitali' , 25,  'Mumbai' , 35000 );
 
Insert into employee values (5,  'Hardik' , 27,  'Bhopal' , 40000 );
 
Insert into employee values (6,  'Komal' , 22,  'MP' , 32000 );

數據的覆蓋

1
Insert overwrite employee values (1,  'Ram' , 26,  'Vishakhapatnam' , 37000 );

執行覆蓋之后,表中只剩下了這一條數據了

另外一種建表語句

1
create table customer as  select  * from employee;

7.3.2、 數據的查詢

1
2
3
select  * from employee;
 
select  name,age from employee;

7.3.3、 刪除

1
DROP table  mydb1.employee;

7.3.4、 清空表數據

1
truncate  employee;

7.3.5、 創建視圖

1
CREATE VIEW IF NOT EXISTS employee_view AS  select  name, age from employee;

7.3.6、 查看視圖數據

1
select  * from employee_view;

7.4、 order  by語句

基礎語法

1
2
3
select  * from table_name ORDER BY col_name [ASC|DESC] [NULLS FIRST|NULLS LAST]
 
Select * from employee ORDER BY  id  asc;

7.5、group  by  語句

1
Select name,  sum (salary) from employee Group BY name;

7.6、 having 語句

基礎語法

1
select  * from table_name ORDER BY col_name [ASC|DESC] [NULLS FIRST|NULLS LAST]

按年齡對表進行分組,並選擇每個組的最大工資,並顯示大於20000的工資

1
select  max(salary) from employee group by age having max(salary) > 20000;

7.7、 limit語句

1
select  * from employee order by  id  limit 4;

8、impala當中的數據表導入幾種方式

第一種方式,通過load  hdfs的數據到impala當中去

1
create table user( id  int ,name string,age int ) row  format  delimited fields terminated by  "\t" ;

准備數據user.txt並上傳到hdfs的 /user/impala路徑下去

復制代碼
1       hello   15

2       zhangsan        20

3       lisi    30

4       wangwu  50
復制代碼

加載數據

1
load data inpath  '/user/impala/'  into table user;

查詢加載的數據

1
select   *  from  user;

如果查詢不不到數據,那么需要刷新一遍數據表

1
refresh  user;

第二種方式:

1
create  table  user2   as    select  * from  user;

第三種方式:

1
insert  into

第四種:

1
insert  into   select

9、impala的java開發

在實際工作當中,因為impala的查詢比較快,所以可能有會使用到impala來做數據庫查詢的情況,我們可以通過java代碼來進行操作impala的查詢

第一步:導入jar包

復制代碼
  <repositories>

        <repository>

            <id>cloudera</id>

            <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>

        </repository>

        <repository>

            <id>central</id>

            <url>http://repo1.maven.org/maven2/</url>

            <releases>

                <enabled>true</enabled>

            </releases>

            <snapshots>

                <enabled>false</enabled>

            </snapshots>

        </repository>

    </repositories>

 

 

 

    <dependencies>

        <dependency>

            <groupId>org.apache.hadoop</groupId>

            <artifactId>hadoop-common</artifactId>

            <version>2.6.0-cdh5.14.0</version>

        </dependency>

        <dependency>

            <groupId>org.apache.hive</groupId>

            <artifactId>hive-common</artifactId>

            <version>1.1.0-cdh5.14.0</version>

        </dependency>

        <dependency>

            <groupId>org.apache.hive</groupId>

            <artifactId>hive-metastore</artifactId>

            <version>1.1.0-cdh5.14.0</version>

        </dependency>

 

        <dependency>

            <groupId>org.apache.hive</groupId>

            <artifactId>hive-service</artifactId>

            <version>1.1.0-cdh5.14.0</version>

        </dependency>

        <dependency>

            <groupId>org.apache.hive</groupId>

            <artifactId>hive-jdbc</artifactId>

            <version>1.1.0-cdh5.14.0</version>

        </dependency>

        <dependency>

            <groupId>org.apache.hive</groupId>

            <artifactId>hive-exec</artifactId>

            <version>1.1.0-cdh5.14.0</version>

        </dependency>

 

        <!-- https://mvnrepository.com/artifact/org.apache.thrift/libfb303 -->

        <dependency>

            <groupId>org.apache.thrift</groupId>

            <artifactId>libfb303</artifactId>

            <version>0.9.0</version>

            <type>pom</type>

        </dependency>

 

        <!-- https://mvnrepository.com/artifact/org.apache.thrift/libthrift -->

        <dependency>

            <groupId>org.apache.thrift</groupId>

            <artifactId>libthrift</artifactId>

            <version>0.9.0</version>

            <type>pom</type>

        </dependency>

 

        <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->

        <dependency>

            <groupId>org.apache.httpcomponents</groupId>

            <artifactId>httpclient</artifactId>

            <version>4.2.5</version>

        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpcore -->

        <dependency>

            <groupId>org.apache.httpcomponents</groupId>

            <artifactId>httpcore</artifactId>

            <version>4.2.5</version>

        </dependency>

 

    </dependencies>
復制代碼

 

第二步impala的java代碼查詢開發

復制代碼
public class ImpalaJdbc {
    public static void main(String[] args) throws Exception {
    //定義連接驅動類,以及連接url和執行的sql語句
    String driver = "org.apache.hive.jdbc.HiveDriver";
    String driverUrl = "jdbc:hive2://192.168.52.120:21050/mydb1;auth=noSasl";
    String sql = "select * from student";

    //通過反射加載數據庫連接驅動
    Class.forName(driver);
    Connection connection = DriverManager.getConnection(driverUrl);
    PreparedStatement preparedStatement = connection.prepareStatement(sql);
    ResultSet resultSet = preparedStatement.executeQuery();
    //通過查詢,得到數據一共有多少列
    int col = resultSet.getMetaData().getColumnCount();
    //遍歷結果集
    while (resultSet.next()){
        for(int i=1;i<=col;i++){
            System.out.print(resultSet.getString(i)+"\t");
        }
        System.out.print("\n");
    }
    preparedStatement.close();
    connection.close();
}
}
復制代碼

 轉自:https://www.cnblogs.com/alexzhang92/p/10942854.html


免責聲明!

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



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