• 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  ' ' 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 " ";

    准备数据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)+"	");
            }
            System.out.print("
    ");
        }
        preparedStatement.close();
        connection.close();
    }
    }
    复制代码

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

  • 相关阅读:
    PCM简介
    微波炉炖蛋
    python的命令行参数处理
    耳机标准
    SELinux杂谈
    Linux ssh服务器配置
    Centos 7安装nginx
    WPF TextBox属性IsReadOnlyCaretVisible
    [WPF打印]WPF 文档元素(Run TextBlock Paragraph)的文字对齐方式
    [SQLite3]connection string的连接池参数引发的错误
  • 原文地址:https://www.cnblogs.com/javalinux/p/14931617.html
Copyright © 2020-2023  润新知