Apache Impala

记一次impala的认识与学习。

概念
  • impala是一个实时的sql查询工具,类似于hive的操作方式,只不过执行的效率极高,号称当下大数据生态圈中执行效率最高的sql类软件。

  • impala来自于cloudera,后来贡献给了apache

  • impala工作底层执行以来于hive,与hive共用一套元数据存储,在使用impala的时候,必须保证hive服务是正常可用的,至少metastore开启。

  • impala最大的跟hive的不同在于,不在把sql编译成mr程序执行编译成执行计划树。

  • impala的sql语法几乎兼容hive的sql语句。

    • impala是一个适用于实时交互查询的sql软件,hive适合于批处理查询的SQL软件。通常是两个相互配合。
    • Impala可以集群部署
      • impala(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)
    • impala查询处理流程。
      • impala分为Java前端(接收解析sql编译成执行的计划树),C++后端(负责具体的执行计划树操作)。
      • impala SQL —>impalad(Coordinator)—>调用java前端编译sql成计划树---->以Thrift数据格式返回给C++后端---->根据执行计划树、数据位于的路径(libhdfs和hdfs交互)、impalad状态分配执行计划 查询 —>汇总查询结构---->返回给java前端---->用户CLI。
      • 与hive不同就在于整个执行中已经没有再用到MR了
impala与hive的异同点:

最大的不同:impala没有使用MR进行并行计算。

  • impala使用的优化技术

1. 使用LLVM产生运行代码,针对特定查询生成特定代码,同时使用Inline的方式减少函数调用的开销,加快执行效率。(C++特性)

充分利用可用的硬件调度指令。

更好的IO调度,Impalad知道数据块所在的磁盘位置能够更好的利用多磁盘的又是,同时Impala支持直接数据块读取和本地代码计算(checksum)。

通过选择合适数据存储格式可以得到最好性能(Impala支持多种存储格式)。

最大使用内存,中间结果不写磁盘,及时通过网络以stream的方式传递。

  • 执行计划

    hive:依赖于MR执行框架,执行计划分成map->shuffle->reduce->map->shuffle->reduce…模型。如果一个Query会被编译成多轮MR,则会由更多的写中间结果。由于MR执行框架本身的特点,过多的中间过程会增加Query的执行时间。

    Impala:把执行计划表现为一颗完整的执行计划树,可以更自然地分发执行计划到各个Impala的执行查询,而不用像Hive那样把它组合成管道型的map->reduce模式,以此保证Impala有更好的并发性和避免不必要的中间sort与shuffle。

  • 数据流

    hive:采用推的方式,每一个计算节点计算完成后将数据主动推给后续节点。

    Impala:采用拉的方式,后续节点通过getNext主动向前面的节点要数据,以此方式数据可以流式的返回给客户端,且只要有一条数据呗处理完就可以立即展现出来,而不用等到全部处理完成,更符合SQL交互式查询使用。

  • 适用面

    hive:复杂的批处理查询任务,数据转换任务。

    Impala:实时数据分析,因为不支持UDF,能处理的问题域有一定的限制,与hive配合使用,对hive的结果数据集进行实时分析。

Impala架构
主要由Impalad、StateStore、Catalogd和CLI组成
  • Impalad

    与DataNode运行在同一节点上,由Impalad进程表示,它接受客户端的查询请求(接受查询请求的Impalad为Coordinator,Coodinator通过JNI调用Java前端解释SQL查询语句,

  • Impala State Store

  • Catalogd

  • Impala查询处理过程


Impala安装部署
  • impala安装
    • impala没有提供tar包,这个rpm包只有cloudra公司
    • 要么自己去官网下载impala rpm包和相关的依赖和提供的web服务,使得各个机器都可以访问下载yum源。
  • 通过ps -ef | grep impala 判断启动的进程是否正常,如果出错,日志是你解决问题的唯一依据。
    • /var/log/impala

Impala-shell 命令参数
  • impala-shell -h 显示帮助菜单。

  • impala-shell -i + 主机地址 指定连接impala守护进程的主机。默认端口是21000.你可以连接到集群运行impalad的任意主机。

  • impala-shell -o 保存执行结果到文件当中去。

  • impala-shell -f +文件地址 执行SQL脚本文件

  • connect + 主机名 实现不同机子之间的连接转换。

  • refresh dbname.tablename 增量刷新,率先你某一张表的元数据,主要用于刷新hive当中的数据表里面的数据改变的情况。

  • invalidate metadata全量刷新,性能消耗较大,主要用于hive当中新建数据库或者数据库表的时候来进行刷新。

  • explain命令用于查看SQL语句的执行情况。

impala sql 语法(不支持自定义函数)
  • 需要在impala用户下进行去写SQL语法。
  • 出现权限不足现象解决方法:
    • 给HDFS指定的文件夹授予权限。
      • hdfs dfs -chmod -R 7777 hdfs://node–1:9000/user/hive
    • Hadoop配置文件中hdfs-site.xml中设置权限为false
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
  • 删除数据库

    • impala的drop database语句用于从impala中删除数据库。在删除数据库之前,建议从中删除所有表。
    • 如果使用级联删除,Impala会在删除指定数据库中的表之前删除它。
      • DROP database sample cascade.
  • 创建表

    • CREATE TABLE 语句用于在impala中的所需数据库中创建新库,需要指定表名字并定义其列和每列的数据类型。
    • impala支持的数据类型和hive相似,除了sql类型外,还支持java类型。
    • create table IF NOT EXISTS database_name.table_name(
      	column1 data_type,
      	column2 data_type,
      	column3 data_type,
      	…………
      	columnN data_type
      );
      
  • 插入操作

    • impala的INSERT语句有两个子句:into和overwrite。into用户插入新记录数据,overwrite用户覆盖已有的记录。
    • insert into table_name(column1,column2,column3.....columnN)
      values(value1,value2,value3......valueN);
      insert into table_name values(value1,value2,value3....)
      
      • 这里,column1,2,3…n是要插入数据的表中的列的名称。还可以添加值而不指定列名,但是,需要确保值得顺序与表中的列的顺序相同。
      • 举个例子
  • describe 语句

    • impala中describe语句用于查看提供表的描述。此语句的结果包含有关表的信息,例如列名称及其数据类型。
    • describe table_name
    • 此外,还可以使用hive的查询表元数据信息语句。
    • desc formatted table_name
  • alter table

    • impala中的Alter table语句用于对给定表执行更改。使用此语句,可以添加、删除或者修改现有表中的列,也可以重命名他们。
      • 表重命名
        • ALTER TABLE [OLD_DB_NAME] old_table_name RENAME TO [new_db_name] new_table_name;
      • 从表中添加列:
        • ALTER TABLE NAME ADD COLUMNS(COL_SPEC[,COL_SPEC…])
      • 从表中删除列
        • ALTER TABLE NAME DROP [COLUMN] COLUMN_NAME
      • 更改列的名称和类型:
        • ALTER TABLE NAME CHANGE COLUMN_NAME NEW_NAME NEW_TYPE
  • delete\truncate table

    • impala drop table 语句用于删除impala中的现有表。此语句还会删除内部表的底层HDFS文件。
      • 注意:使用此命令时必须小心,因为删除表后,表中可用的所有信息也将永远丢失。
      • DROP table database_name.table_name;
      • impala的Truncate Table语句用于现有表中删除记录。保留表结构。也可以时用DROP table命令删除一个完整的表,但它会从数据库中删除完整的表结构。若希望存储一些数据,需重新创建此表。
  • view 视图

    • 视图仅仅是存储在数据库中具有关联名的Impala查询语言的语句。它是以预定义的SQL查询的形式的表的组合。
    • 视图可以包含表的所有行或选定的行。
      • CREATE View if not exists view_name as Select statement
    • 创建视图VIEW、查询视图View
      • Create view if not exists employee_view AS select name,age from employee;
    • 修改视图
      • ALTER view database_name.view_name 为Select语句
    • 删除视图
      • DROP VIEW database_name.view_name;
  • order子句

    • impala ORDER BY 子句用于根据一个或多个列以升序或降序对数据进行排序。默认情况下,一些数据库按升序对查询结果进行排序。
      • select * from table_name ORDER BY col_name [ASC|DESC] [NULLS FIRST|NULLS LAST]
      • 可以使用关键字ASC或DESC分别按升序或降序排列表中的数据。
      • 如果我们使用NULLS FIRST,表中所有的空值都排列在项行;如果我们使用NULLS LAST,包含空值的行将最后排列。
  • having子句

    • impala中Having子句允许指定过滤哪些组结果显示在最终结果中的条件。
    • 一般来说,Having子句与groupby子句一起使用;它将条件防止在GROUP BY子句创建的组上。
  • limit、offset

    • impala中的limit子句用于将结果集的行数限制为所需的行数,即查询的结果集不包含超过指定限制的记录。
    • 一般来说,select 查询的resultset中的行从0开始,使用offset子句,可以决定从哪里考虑输出。
  • with子句

    • 如果查询太复杂,可以为复杂部分定义别名,并使用impala的with子句将他们包含在查询中。
    • with x as (select 1),y as (select 2) (select* from x union y);
  • distinct

    • impala中的distinct运算符用于通过删除重复值来获取唯一值。
      • select distinct column … from table_name;

impala 数据导入方式
  • load data (会将被加载文件进行一个移动,移动到该表对应的路径下)
    • 首先创建一个表:
      • create table user …
    • 加载数据
      • load data inpath ‘/user/…’ into table user;
    • 查询加载的数据
      • select * from user;
  • insert into values
    • 这种方式非常类似于RDBMS的数据插入方式。
    • create table t_test2(id int,name string);
    • insert into table t_test2 value(1,“zhangsan”);
  • insert into select
    • 插入一张表的数据来自于后面的select查询语句返回的结果。
  • create as select
    • 建表的字段个数、类型、数据来自于后续的select查询语句。

impala 的java开发
  • 下载jdbc connector的jar包。导入开发环境
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值