Impala
2021-04-12 08:56:43 0 举报
AI智能生成
登录查看完整内容
为你推荐
查看更多
Impala笔记
作者其他创作
大纲/内容
Impala
基础信息
发展背景
impala是参照谷歌的新三篇论文当中的Dremel--交互式分析工具实现
Impala介绍
impala是cloudera提供的一款高效率的sql查询工具,性能比hive快10到100倍
特点
impala是基于hive并使用内存计算,能够对PB级数据进行交互式实时查询、分析
C++编写,LLVM统一编译运行
LLVM:编译器,比较稳定,效率高
兼容HiveSQL
具有数据仓库的特性,可对hive数据直接做数据分析
支持Data Local
数据本地化:无需数据移动,减少数据的传输,就是说将数据和计算分配到同一个计算机上运行,减少网络开销
支持列式存储
可以和Hbase整合:因为Hive可以和Hbasez整合
支持JDBC/ODBC远程访问
Impala劣势
对内存依赖大
官方建议内存设定128G
完全依赖hive
稳定性不如hive
内存不够会出现问题
Impala不提供任何对序列化和反序列化的支持
Impala只能读取文本文件,而不能读取自定义二进制文件。
新的记录/文件被添加到HDFS中的数据目录时,该表需要手动刷新;(hive窗口中插入数据、新建数据库或表,在impala当中是不可直接查询,需要执行invalidate metadata以通知元数据的更新)
Impala与Hive关系
impala是基于hive的大数据分析查询引擎,直接使用hive的元数据库metadata;impala元数据都存储在hive的metastore当中;impala兼容hive的绝大多数sql语法;安装启动Impala前,需要安装并启动hive的metastore服务。
Hive元数据包含database、table等元信息,元数据存储在关系型数据库中,如Derby、MySQL等。
客户端并行连接metastore服务,metastore再去连接MySQL数据库来存取元数据(无需知道MySql用户密码,连接metastore即可)。
Hive适合于长时间的批处理查询分析,而Impala适合于实时交互式SQL查询。可以先使用hive进行数据转换处理,之后使用Impala在Hive处理后的结果数据集上进行快速的数据分析。
Impala与Hive异同
Impala使用的优化技术
充分利用可用的硬件指令(SSE4.2)
Impala支持多种存储格式
最大使用内存,中间结果不写磁盘,及时通过网络以stream的方式传递。
执行计划
Hive将Query编译成Mapreduce任务执行,由于Mapreduce框架的特点,所以执行效率低
Impala将Query解析编译成执行计划树,并且分发到其他Impalad节点并发执行,没有shuffle,结果保存在内存,执行效率高
数据流
Hive: 采用推的方式
计算节点计算完成后将数据主动推给后续节点
Impala: 采用拉的方式
后续节点通过getNext主动向前面节点要数据,以此方式数据可以流式的返回给客户端
内存使用
Hive: 内存放不下所有数据,则会使用外存
Impala:内存放不下,版本1.0.1是直接返回错误
调度
Hive: 任务调度依赖于Hadoop的调度策略
Impala: 调度由自己完成simple-schedule。扫描数据的进程尽量靠近数据本身所在的物理机器
容错
Hive: 依赖于Hadoop的容错能力。
Impala: 查询过程中,没有容错逻辑
适用场景
Hive:复杂的批处理查询任务
Impala:font color=\"#fdb813\
Impala架构
Impalad
Catalog
分发表的元数据信息到各个impalad中;接收来自statestore的所有请求。
Statestore
负责收集分布在集群中各个impalad进程的资源信息;各节点健康状况,同步节点信息;负责query的协调调度。
CLI:查询处理接口(client)
Impala-shell
Hue界面
ODBC / JDBC驱动程序
外部依赖
Hive Metastore
HDFS
运行流程
查询流程
impalad分为java前端(接受解析sql编译成执行计划树),c++后端(负责具体的执行计划树操作)
impala sql---->impalad(Coordinator)---->调用java前端编译sql成计划树------>以Thrift数据格式返回给C++后端------>根据执行计划树、数据位于路径(libhdfs和hdfs交互)、impalad状态分配执行计划 查询----->汇总查询结果----->返回给java前端---->用户cli
Impala集群安装
1. impala集群安装规划- node-3 :impalad 、impala state store、impala catalogd、impala-shell- node-2:impalad - node-1:impalad 2. impala安装- impala没有提供tar包 只有rpm包 这个rpm包只有cloudera公司- 要么自己去官网下载impala rpm包和其相关的依赖 要么自己制作本地yum源- 特别注意本地yum源的安装 需要Apache server对外提供web服务 使得各个机器都可以访问下载yum源- 在指定的每个机器上根据规划 yum安装指定的服务- 保证hadoop hive服务正常,开启相关的服务 - hive metastore hiveserver2 - hadoop hdfs-site.xml 开启本地读取数据的功能 - 要把配置文件scp给其他机器 重启- 修改impala配置文件- 修改bigtop 指定java路径- 根据规划分别启动对应的impala进程- 如果出错 排查的依据就是去,日志默认都在/var/log/impala3. 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-shell命令参数
impala-shell外部命令
impala-shell –h
查看帮助手册
impala-shell –r
刷新impala元数据,与建立连接后执行 refresh 语句效果相同
impala-shell –f 文件路径
执行指的的sql查询文件
impala-shell –i
指定连接运行 impalad 守护进程的主机。默认端口是 21000。
impala-shell –o
保存执行结果到文件当中去
impala-shell内部命令
help;
connect hostname;
连接到指定的机器impalad上去执行
refresh dbname.tablename;
增量刷新,刷新某一张表的元数据,主要用于刷新hive当中数据表里面的数据改变的情况。
invalidate metadata;
全量刷新,性能消耗较大,主要用于hive当中新建数据库或者数据库表的时候来进行刷新。
quit/exit命令
explain 命令
查看sql语句的执行计划
profile 命令
执行sql语句之后执行,可以打印出更加详细的执行步骤,主要用于查询结果的查看,集群的调优等
Impala sql语法
语法与hive相似
Impala数据导入方式
load data
加载数据load data inpath '/user/impala/' into table user;
insert into values
insert into select
create as select
Impala的java开发
下载impala jdbc依赖
下载路径:https://www.cloudera.com/downloads/connectors/impala/jdbc/2-5-28.html因为cloudera属于商业公司性质,其提供的jar并不会出现在开源的maven仓库中,如果在企业中需要使用,请添加到企业maven私服。
创建java工程
创建普通java工程,把依赖添加到工程lib。
java api
public static void test(){ Connection con = null; ResultSet rs = null; PreparedStatement ps = null; 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 my_db.employee;\"); rs = ps.executeQuery(); while (rs.next()){ 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(); } } } public static void main(String[] args) { test(); }
0 条评论
回复 删除
下一页