欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Apache Impala学习笔记

程序员文章站 2022-06-26 11:34:01
...

Apache Impala:实时的sql查询工具

1.Impala与Hive关系

  • impla是个实时的sql查询工具,类似于hive的操作方式,只不过执行的效率极高,号称当下大数据生态圈中执行效率最高的sql类软件
  • impala来自于cloudera,后来贡献给了apache
  • impala工作底层执行依赖于hive 与hive共用一套元数据存储在使用impala的时候,必须保证hive服务是正常可靠的,至少metastore开启。
  • impala最大的跟hive的不同在于不再把sql编译成MapReduce程序执行,而是编译成执行计划树
  • impala的sql语法几乎兼容hive的sql语句。
  • impala是一个适用于实时交互查询的sql软件 hive适合于批处理查询的sql软件。通常是两个互相配合。

2.Impala架构

2.1.Impala集群节点

  • Impalad(impala server):可以部署多个不同机器上,通常与datanode部署在同一个节点,方便数据本地计算,负责具体执行本次查询sql的impalad称之为Coordinator。每个impala server都可以对外提供服务。
  • impala state store:主要是保存impalad的状态信息 监视其健康状态
  • impala catalogd:metastore维护的网关 负责跟hive 的metastore进行交互 同步hive的元数据到impala自己的元数据中。
  • CLI:用户操作impala的方式(impala shell、jdbc、hue)

2.2.impala 查询处理流程(重点)

  • impalad分为java前端(接受解析sql编译成执行计划树),c++后端(负责具体的执行计划树操作)
  • impala sql---->impalad(Coordinator)---->调用java前端编译sql成计划树------>以Thrift数据格式返回给C++后端------>根据执行计划树、获取数据所在路径(libhdfs和hdfs交互)、Coordinator根据impalad状态分配执行计划发给其他impalad 查询----->Coordinator汇总查询结果----->返回给java前端---->用户cli(如果是 insert语句,则将数据写入到HDFS中,注销本次查询。)
  • 跟hive不同就在于整个执行中已经没有了mapreduce程序的存在

3.Impala集群安装规划

  • node-3 :impalad 、impala state store、impala catalogd、impala-shell
  • node-2:impalad
  • node-1:impalad

3.1.impala安装

3.1.1步骤

  • impala没有提供tar包 只有rpm包 这个rpm包只有cloudera公司提供

  • 要么自己去官网下载impala rpm包和其相关的依赖 要么自己制作本地yum源

  • 特别注意本地yum源的安装,需要Apache server对外提供web服务,确保 linux 的 Selinux 关闭,防火墙已关闭,使得各个机器都可以访问下载yum源

  • 在指定的每个机器上根据规划 yum安装指定的服务

  • 保证hadoop hive服务正常,开启相关的服务

    • hive metastore hiveserver2
    • hadoop hdfs-site.xml 开启本地读取数据的功能
    • 要把配置文件scp给其他机器 重启
  • 修改impala配置文件

  • 修改bigtop 指定java路径

  • 根据规划分别启动对应的impala进程

  • 如果出错 排查的依据就是去,日志默认都在/var/log/impala

  • 注意:要保证Impala集群的机器时间同步,否则hive与Impala无法同步元数据信息

3.1.2注意事项

  1. Linux软件包安装有三种方式:二进制节码包 .tar.gz , rpm包,yum工具(是rpm的前端工具,底层还是rpm,在安装的时候帮你自动找依赖下载)

  2. 磁盘挂载分区的操作也可以通过扩展磁盘的方式来实现。

  3. 安装包可以通过 MobaXterm 提供的文件系统工具直接上传。

  4. yum源的架构(在安装时,如果失败,可以考虑httpd服务有没启动):

Apache Impala学习笔记

  1. impala的配置文件(hive-site.xml):

    <!-- 绑定运行 hiveServer2 启动在哪台机器 就配置那个机器的IP --> 
    <property> 
        <name>hive.server2.thrift.bind.host</name> 
        <value>node-1</value> 
    </property> 
    <!-- 指定 hive metastore 服务请求的 uri 地址,启动在哪台机器 就配置那个机器的IP --> 
    <property> 
        <name>hive.metastore.uris</name> 
        <value>thrift://node-1:9083</value> 
    </property>
    

    启动 impala之前一定要确保有9083这个端口。

3.2.impala集群的启动关闭

  • 主节点 按照顺序启动以下服务

    service impala-state-store start
    service impala-catalog start
    service impala-server start
    
  • 从节点

    service impala-server start
    
  • 如果需要关闭impala 把上述命令中start 改为stop

  • 通过ps -ef|grep impala 判断启动的进程是否正常 如果出错 日志是你解决问题的唯一依据。

    /var/log/impala
    
  • impala启动失败:

    • 检验 hadoop 启动

    • 检验 mysql 服务启动

    • 检验 hive metastore-RUNJar(9083) hiveserver2-RunJar(10000)

    • 检验 impala 启动了没 有没启动成功看进程和日志

      -- 1.查看服务状态
      chkconfig --list | grep impala
      service impala-state-store status
      service impala-catalog status
      service impala-server status
      
      -- 2.查看进程是否活着  impala的进程已经不是java进程。
      ps -ef | grep impala   可以查看任何在linux下的进程
      jps 只能查看java进程
      
      -- 查看对应节点的日志 /var/log/impala
      
  • 建议每个节点都安装 impala-shell,这样就哪个客户端都可以与 impala 进行交互。

3.3Impala卸载

  • 因为 impala 安装的时候需要依赖其他的软件,所以默认会将引用软件也下下来,并设置环境。那么在Impala卸载的时候,就需要将依赖的软件也卸载掉。
# 卸载yum安装的impala全家桶:
yum remove -y impala hadoop bigtop avro hbase hive parquet sentry solr zookeeper

# 删除本地磁盘上跟impala相关的文件夹
rm -rf $(find / -name "*impala*")

# 测试
source /etc/profile
which hadoop

4. impala的shell客户端

  1. impala-shell 类似于hive工具,hive有-e -f -hiveconf 参数,同样impala-shell也有:

    • impala-shell -h 参见impala的帮助文档
    • impala-shell -q “sql” 在shell客户端直接运行SQL命令
    • impala-shell -f query.sql 执行sql脚本
    • impala-shell -r 进入impala-shell并且刷新整个impala的元数据
    • impala-shell -o 将执行的结果保存到文件里面去
  2. impala-shell 客户端内部指令:

    • catalogd 更新的元数据,hive metastore可以读取到。hive更新的元数据,catalogd 无法读取到。如下两个命令用于解决该问题:

      • refresh dbname.tabname 增量刷新,此时必须在Impala中有这张表,如果没有就会报错。
      • invalidate metadata 全量刷新,hive当中新创建数据库或库表时,就需要在impala做全量刷新
    • explain sql 查看某个sql语句的执行计划

    • profile 主要用于打印出上一条sql语句的更加详细的执行计划

    • quit / exit 退出

  3. impala 的基本查询语句与hive的查询语句基本一致,需要注意的是impala操作时HDFS报权限不足的问题,可以对该文件夹修改权限。

  4. 加载数据的4种方式:

    load data inpath '/user/impala/' into table user; //只能加载HDFS上的数据
    create  table  user2   as   select * from  user;
    insert  into user3 valus(1,'zhangsan');
    insert  into user4 select * from user3;
    

5. impala的Java客户端

​ 生产环境中更多的是利用 impala提供的 java 客户端连接工具,开发的流程与我们学习过的 JDBC 十分类似,本节通过简单的查询业务介绍如何使用 Impala Java 客户端。

public static void main(String[] args){
        Connection con = null;
        ResultSet rs = null;
        PreparedStatement ps = null;
    	//定义连接驱动类,以及连接url和执行的sql语句
        String JDBC_DRIVER = "com.cloudera.impala.jdbc41.Driver";
        String CONNECTION_URL = "jdbc:impala://node-3:21050";
        try
        {
            //贾(加载驱动)琏(获取连接对象)欲(创建预处理对象)执(执行查询)事(释放内存)
            Class.forName(JDBC_DRIVER);
            con = (Connection) DriverManager.getConnection(CONNECTION_URL);
            ps = con.prepareStatement("select * from impala.employee;");
            rs = ps.executeQuery();
            //遍历结果集
            while (rs.next())
            {
                //注意获取字段数据的索引是从0开始的
                System.out.println(rs.getString(1));
                System.out.println(rs.getString(2));
                System.out.println(rs.getString(3));
            }
        } catch (Exception e)
        {
            e.printStackTrace();
        } finally
        {
            try {
                rs.close();
                ps.close();
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}