Impala+kudu(工作笔记)
Impala+kudu(工作笔记)Impala是什么?Impala是用于处理存储在Hadoop集群中的大量数据的MPP(大规模并行处理)SQL查询引擎。 它是一个用C ++和Java编写的开源软件。 与其他Hadoop的SQL引擎相比,它提供了高性能和低延迟。换句话说,Impala是性能最高的SQL引擎(提供类似RDBMS的体验),它提供了访问存储在Hadoop分布式文件系统中的数据的最快方法。I
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
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)