Ⅰ. Why Impala ?
- Hive底层执行使用的是MapReduce引擎,仍然是一个批处理过程,难以满足查询的交互性
- 省掉了MapReduce作业启动的开销。MapReduce启动task的速度很慢(默认每个心跳间隔是3秒钟),Impala直接通过相应的服务进程来进行作业调度,速度快了很多。
- Impala完全抛弃了MapReduce这个不太适合做SQL查询的范式,而是像Dremel一样借鉴了MPP并行数据库的思想另起炉灶,因此可做更多的查询优化,从而省掉不必要的shuffle、sort等开销。
- Impala支持内存中数据处理,它访问/分析存储在Hadoop数据节点上的数据,而无需数据移动,省掉了大量的I/O开销。
- 使用类SQL查询访问数据。
- Impala为HDFS或HBase中的数据提供了更快的访问。
缺点:
- 不提供任何对序列化和反序列化的支持;
- 只能读取文本文件,而不能读取自定义二进制文件;
- 每当新的记录/文件被添加到
HDFS
中的数据目录时,该表需要被刷新。
关系数据库和Impala
Impala使用类似于SQL和HiveQL的Query语言。 下表描述了SQL和Impala查询语言之间的一些关键差异。
Impala | 关系型数据库 |
---|---|
Impala使用类似于HiveQL的类似SQL的查询语言。 | 关系数据库使用SQL语言。 |
在Impala中,您无法更新或删除单个记录。 | 在关系数据库中,可以更新或删除单个记录。 |
Impala不支持事务。 | 关系数据库支持事务。 |
Impala不支持索引。 | 关系数据库支持索引。 |
Impala存储和管理大量数据(PB)。 | 与Impala相比,关系数据库处理的数据量较少(TB)。 |
Impala与hive相同点
- 数据储存:使用相同的数据存储池,都可以将数据的储存在HDFS或HBase中。
- 元数据:两者使用相同的元数据
- SQL解释处理:比较相似的就是都是通过词法分析生成执行计划。
- 查询计划树
Ⅱ. Impala架构组成
- Impala daemon(守护进程):每个节点上接受接口查询,将工作分发到impala集群
- Impala Statestore(存储状态):检查守护进程状态
- Impala元数据或metastore(元数据即元存储):类似MySql等传统数据库存储表和列信息
Ⅲ. Impala接口
- Impala-shell :命令窗口中键入
impala-shell
命令来启动Impala shell
; - Hue(Hadoop user experience)界面 :您可以使用
Hue
浏览器处理Impala
查询; - ODBC / JDBC驱动程序 :与其他数据库一样,
Impala
提供ODBC / JDBC
驱动程序。
Ⅳ. Impala语句
1. 数据库操作
CREATE DATABASE IF NOT EXISTS database_name;
DROP DATABASE IF EXISTS sample_database;
USE db_name;
2. 表操作
create table IF NOT EXISTS database_name.table_name (
column1 data_type,
………
columnN data_type
);
insert into table_name (column1,...columnN) values (value1,...valueN);
insert overwrite table_name values (value1,...valueN);
SELECT column1, column2, columnN from table_name;
describe table_name; --表描述
show tables --显示表
-- 重命名
ALTER TABLE [old_db_name.]old_table_name RENAME TO [new_db_name.]new_table_name
DROP table database_name.table_name;
truncate table_name; --截断表
--创建视图
Create View IF NOT EXISTS view_name as Select statement from table
--修改视图
ALTER VIEW database_name.view_name as (Select ...)
DROP VIEW database_name.view_name;
3. 条件查询
-- with子句
with x as (select 1), y as (select 2) (select * from x union y);
-- limit限制
select * from table_name order by id limit numerical_expression;
-- 排序
Select * from customers ORDER BY id asc; --asc/desc
4. 分区表
create table stu_par(id int, name string)
partitioned by (month string)
row format delimited fields terminated by '\t';
Python连接Impala
pip install impyla #安装
#导入包
from impala.dbapi import connect
#连接impala
conn=connect(host='XXX.XX.XX.XX',port=21050)
#定义一个执行者
cur=conn.cursor()
#执行语句并测试连接是否成功
cur.execute('SHOW DATABASES')
#将执行结果给fetchall并打印结果
print(cur.fetchall())
# 先关闭执行者
cur.close()
# 再关断开连接
conn.close()