Apache Impala学习笔记
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注意事项
-
Linux软件包安装有三种方式:二进制节码包
.tar.gz
, rpm包,yum工具(是rpm的前端工具,底层还是rpm,在安装的时候帮你自动找依赖下载) -
磁盘挂载分区的操作也可以通过扩展磁盘的方式来实现。
-
安装包可以通过 MobaXterm 提供的文件系统工具直接上传。
-
yum源的架构(在安装时,如果失败,可以考虑httpd服务有没启动):
-
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客户端
-
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 将执行的结果保存到文件里面去
-
impala-shell 客户端内部指令:
-
catalogd 更新的元数据,hive metastore可以读取到。hive更新的元数据,catalogd 无法读取到。如下两个命令用于解决该问题:
-
refresh dbname.tabname
增量刷新,此时必须在Impala中有这张表,如果没有就会报错。 -
invalidate metadata
全量刷新,hive当中新创建数据库或库表时,就需要在impala做全量刷新
-
-
explain sql
查看某个sql语句的执行计划 -
profile
主要用于打印出上一条sql语句的更加详细的执行计划 -
quit
/exit
退出
-
-
impala 的基本查询语句与hive的查询语句基本一致,需要注意的是impala操作时HDFS报权限不足的问题,可以对该文件夹修改权限。
-
加载数据的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();
}
}
}
}