Impala+kudu(工作笔记)

Impala是什么?

Impala是用于处理存储在Hadoop集群中的大量数据的MPP(大规模并行处理)SQL查询引擎。 它是一个用C ++和Java编写的开源软件。 与其他Hadoop的SQL引擎相比,它提供了高性能和低延迟。

换句话说,Impala是性能最高的SQL引擎(提供类似RDBMS的体验),它提供了访问存储在Hadoop分布式文件系统中的数据的最快方法。

Impala是建立在Hadoop生态圈的交互式SQL解析引擎,Impala的SQL语法与Hive高度兼容,并且提供标准的ODBC和JDBC接口。Impala本身不提供数据的存储服务,其底层数据可来自HDFS、Kudu、Hbase甚至亚马逊S3。

Impapa最早由Cloudera公司开发,于15年12月贡献给Apache基金会,目前其正式名字为Apache Impala(incubating)

Impala本身并不是Hive的完全替代品,对于一些大吞吐量长时间执行的请求,Hive仍然是最稳定最佳的选择,哪怕是SparkSQL,其稳定性也无法跟Hive媲美。

稳定性方面Impala不如Hive,但是在执行效率方面,Impala毫无疑问可以秒杀Hive。Impala采用内存计算模型,对于分布式Shuffle,可以尽可能的利用现代计算机的内存和CPU资源。同时,Impala也有预处理和分析技术,表数据插入之后可以用COMPUTE STATS指令来让Impala对行列数据深度分析。

Impala的优势

  • 和Hive高度相似的SQL语法,无需太多学习成本
  • 超大数据规模SQL解析的能力,高效利用内存与CPU利用,快速返回SQL查询结果。
  • 集成多个底层数据源,HDFS、Kudu、Hbase等数据皆可通过Impala共享,并且无需进行数据同步。
  • 与Hue深度集成,提供可视化的SQL操作以及work flow。
  • 提供标准JDBC和ODBC接口,方便下游业务方无缝接入。
  • 提供最多细化到列的权限管理,满足实际生产环境数据安全要求。

Kudu是什么?

Kudu是围绕Hadoop生态圈建立存储引擎,Kudu拥有和Hadoop生态圈共同的设计理念,它运行在普通的服务器上、可分布式规模化部署、并且满足工业界的高可用要求。其设计理念为fast analytics on fast data.。Kudu的大部分场景和Hbase类似,其设计降低了随机读写性能,提高了扫描性能,在大部分场景下,Kudu在拥有接近Hbase的随机读写性能的同时,还有远超Hbase的扫描性能。

区别于Hbase等存储引擎,Kudu有如下优势:

  • 快速的OLAP类查询处理速度
  • 与MapReduce、Spark等Hadoop生态圈常见系统高度兼容,其连接驱动由官方支持维护
  • 与Impala深度集成,相比HDFS+Parquet+Impala的传统架构,Kudu+Impala在绝大多数场景下拥有更好的性能。
  • 强大而灵活的一致性模型,允许用户对每个请求单独定义一致性模型,甚至包括强序列一致性。
  • 能够同时支持OLTP和OLAP请求,并且拥有良好的性能。
  • Kudu集成在ClouderaManager之中,对运维友好。
  • 高可用。采用Raft Consensus算法来作为master失败后选举模型,即使选举失败,数据仍然是可读的。
  • 支持结构化的数据,纯粹的列式存储,省空间的同时,提供更高效的查询速度。

Kudu+Impala应用

Kudu+Impala为实时数据仓库存储提供了良好的解决方案。这套架构在支持随机读写的同时还能保持良好的Scan性能,同时其对Spark等流式计算框架有官方的客户端支持。这些特性意味着数据可以从Spark实时计算中实时的写入Kudu,上层的Impala提供BI分析SQL查询,对于数据挖掘和算法等需求可以在Spark迭代计算框架上直接操作Kudu底层数据。

impala操作kudu

impala shell

[root@dc-03 ~]# impala-shell
Starting Impala Shell without Kerberos authentication
Opened TCP connection to dc-03:21000
Connected to dc-03:21000
Server version: impalad version 3.2.0-cdh6.2.1 RELEASE (build 525e372410dd2ce206e2ad0f21f57cae7380c0cb)
***********************************************************************************
Welcome to the Impala shell.
(Impala Shell v3.2.0-cdh6.2.1 (525e372) built on Wed Sep 11 01:30:44 PDT 2019)

To see more tips, run the TIP command.
***********************************************************************************
[dc-03:21000] default> show databases;
Query: show databases
+--------------------+----------------------------------------------+
| name               | comment                                      |
+--------------------+----------------------------------------------+
| _impala_builtins   | System database for Impala builtin functions |
| default            | Default Hive database                        |
| demo               |                                              |
| dx_data            |                                              |
+--------------------+----------------------------------------------+
Fetched 12 row(s) in 0.00s
[dc-03:21000] default> use dx_data;
Query: use dx_data
[dc-03:21000] dx_data> show tables;
Query: show tables
+-----------------------------------------------+
| name                                          |
+-----------------------------------------------+
| user_result_cluster_1372380648999882752       |
| user_result_cluster_1386652408108683264       |
+-----------------------------------------------+
Fetched 56 row(s) in 0.01s
[dc-03:21000] dx_data> show create table user_result_cluster_1386652408108683264;
Query: show create table user_result_cluster_1386652408108683264
+-------------------------------------------------------------------------------------------------+
| result                                                                                          |
+-------------------------------------------------------------------------------------------------+
| CREATE TABLE dx_data.user_result_cluster_1386652408108683264 (                                  |
|   cluster_no STRING NOT NULL ENCODING AUTO_ENCODING COMPRESSION DEFAULT_COMPRESSION,            |
|   user_id BIGINT NOT NULL ENCODING AUTO_ENCODING COMPRESSION DEFAULT_COMPRESSION,               |
|   tag_value STRING NULL ENCODING AUTO_ENCODING COMPRESSION DEFAULT_COMPRESSION,                 |
|   tag_value_num DOUBLE NULL ENCODING AUTO_ENCODING COMPRESSION DEFAULT_COMPRESSION,             |
|   tag_value_tm BIGINT NULL ENCODING AUTO_ENCODING COMPRESSION DEFAULT_COMPRESSION,              |
|   tag_value_bool BOOLEAN NULL ENCODING AUTO_ENCODING COMPRESSION DEFAULT_COMPRESSION,           |
|   PRIMARY KEY (cluster_no, user_id)                                                             |
| )                                                                                               |
| PARTITION BY RANGE (cluster_no) (...)                                                           |
| STORED AS KUDU                                                                                  |
| TBLPROPERTIES ('kudu.master_addresses'='192.168.0.97:7051,192.168.0.98:7051,192.168.0.99:7051') |
+-------------------------------------------------------------------------------------------------+
Fetched 1 row(s) in 0.00s
[dc-03:21000] dx_data> 

SQL

数据库语句

CREATE DATABASE IF NOT EXISTS database_name;
show databases; 
DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT | 
CASCADE] [LOCATION hdfs_path];
DROP DATABASE IF EXISTS sample_database;
USE db_name;

Table特定语句

-- 建表语句
-- 注意kudu库基本要指定分区,且分区字段属于主键值。一般分区数量需指定分区数。
CREATE TABLE IF NOT EXISTS database_a.user_result (
  cluster_no STRING NOT NULL ENCODING AUTO_ENCODING COMPRESSION DEFAULT_COMPRESSION,
  user_id BIGINT NOT NULL ENCODING AUTO_ENCODING COMPRESSION DEFAULT_COMPRESSION,
  tag_value STRING NULL ENCODING AUTO_ENCODING COMPRESSION DEFAULT_COMPRESSION,
  tag_value_num DOUBLE NULL ENCODING AUTO_ENCODING COMPRESSION DEFAULT_COMPRESSION,
  tag_value_tm BIGINT NULL ENCODING AUTO_ENCODING COMPRESSION DEFAULT_COMPRESSION,
  tag_value_bool BOOLEAN NULL ENCODING AUTO_ENCODING COMPRESSION DEFAULT_COMPRESSION,
  PRIMARY KEY (cluster_no, user_id)
)
PARTITION BY RANGE (cluster_no) (...)
STORED AS KUDU
TBLPROPERTIES ('kudu.master_addresses'='ip:port')

-- 查看建表语句
show create table user_result;
-- 查看表字段信息
describe user_result;
-- 给表 添加/删除 分区
ALTER TABLE  user_result  ADD RANGE PARTITION  VALUE = 'tag_20210429_3';
ALTER TABLE  user_result  drop RANGE PARTITION  VALUE = 'tag_20210429_3';

-- 添加数据 
-- 注意分区表在添加数据前需添加分区,否则数据insert不进去
insert into user_result(cluster_no,user_id,tag_value_num)
select xxx;
-- 删除数据
delete from user_result where cluster_no = 'tag_20210429_1';

-- 创建视图
Create View IF NOT EXISTS view_name as Select statement
-- 删除视图
DROP VIEW database_name.view_name;

案例

1 实现group by后取各分组的最新一条

mysql实现group by后取各分组的最新一条:
1)先order by之后再分组:
SELECT * FROM (SELECT * from tb_dept ORDER BY id desc LIMIT 10000) a GROUP BY parent_id;
2)利用max() 函数: 
SELECT * FROM tb_dept td,(SELECT max(id) id FROM tb_dept GROUP BY parent_id) md  where td.id = md.id;

impala:
1)使用last_value() over()开窗函数
select dx_user_id,dx_event_time,dx_screen_width ,
	last_value(dx_screen_width) over (partition by dx_user_id order by dx_event_time rows 
    between unbounded preceding and unbounded following) as first_end_value
from v_event;
2) 同mysql,利用max() 函数

2 impala with子句

with x as (select 1), y as (select 2) (select * from x union y);

with t1 as (select * from customers where age>25), t2 as (select * from employee where age>25) 
 (select * from t1 union select * from t2)

链接

impala官网链接

https://docs.cloudera.com/documentation/enterprise/5-8-x/topics/impala.html

impala学习链接

https://www.w3cschool.cn/impala/impala_architecture.html

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐