前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >大数据Kudu(八):Kudu与Impala整合

大数据Kudu(八):Kudu与Impala整合

原创
作者头像
Lansonli
发布2022-12-21 08:49:57
1.1K0
发布2022-12-21 08:49:57
举报
文章被收录于专栏:Lansonli技术博客

?Kudu与Impala整合

Impala是cloudera提供的一款高效率的sql查询工具,使用内存进行计算提供实时的SQL查询,impala强依赖于Hive 的MetaStore,直接使用hive的元数据,意味着impala元数据都存储在hive的MetaStore当中,并且impala兼容hive的绝大多数sql语法,具有实时,批处理,多并发等优点。

Kudu不支持标准SQL操作,可以将Kudu与Apache Impala紧密集成,impala天然就支持兼容kudu,允许开发人员使用Impala的SQL语法从Kudu的tablets 插入,查询,更新和删除数据,Kudu与Impala整合本质上就是为了可以使用Hive表来操作Kudu,主要支持SQL操作。

一、Kudu与Impala整合配置

先安装Impala后安装Kudu,Impala默认与Kudu没有形成依赖,这里需要首先在Impala中开启Kudu依赖支持,打开Impala->“配置”->“Kudu服务”:

以上配置完成之后,重启Impala即可。

二、??????????????内部表

使用 Impala 创建新的 Kudu 表时,可以将表创建为内部表或外部表。内部表由Impala管理,当您从Impala中删除时,数据和表确实被删除。当您使用 Impala 创建新表时,通常是内部表。

使用impala创建内部表时,必须先列出主键列,主键默认就是不能为NULL。例如:创建内容表如下:

代码语言:javascript
复制
CREATE TABLE t_impala_kudu(
id int ,
name string,
age int,
primary key (id)
)
PARTITION BY HASH PARTITIONS 5
STORED AS KUDU
TBLPROPERTIES(
'kudu.master_address'='cm1:7051,cm2:7051'
)

在impala-shell中执行以上命令,可以查看impala中对应的表创建成功:

登录Kudu页面,也可以看到在Kudu中表创建成功。

内部表由impala管理,当创建表时,'kudu.master_address'指定Kudu集群,在ClouderaManager中impala配置了支持Kudu,也可以不指定;不能设置属性'kudu.table_name'指定Kudu中表的名字,表名默认就是“impala::xxx.xx”,当删除表时,对应的表在impala中和kudu中都会删除。

注意:Kudu不支持Impala建表关键字PARTITIONED、LOCATION、ROW FORMAT。

三、外部表

外部表(由CREATE EXTERNAL TABLE创建)不受 Impala 管理,并且删除此表不会将表从其源位置(此处为 Kudu)丢弃。相反,它只会去除Impala和Kudu之间的映射。这是 Kudu 提供的用于将现有表映射到 Impala 的语法。

使用Java api 在Kudu中创建表personInfo,创建好之后,可以通过Kudu WebUI中发现对应的在Impala中创建外表映射Kudu表的语句:

在Impala中执行创建Impala外表的语句,可以在Impala中创建的表名称与Kudu中表的名称不一致,在Impala-shell中执行如下创建外表语句,将personInfo映射到Impala:

代码语言:javascript
复制
CREATE EXTERNAL TABLE `t_kudu_map` STORED AS KUDU
TBLPROPERTIES(
	'kudu.table_name' = 'personInfo',
	'kudu.master_addresses' = 'cm1:7051,cm2:7051'
)

执行完成之后,可以查看Impala中的表如下:

以上就是在Impala中创建的外部表,外部表映射Kudu中的表,当删除Impala中的t_kudu_map表时,在Impala中表被删除,在Kudu中表personInfo不会被删除。生产环境中建议使用外部表。

四、??????????????Impala SQL操作Kudu

在Impala中创建内部表 t_test,存储在Kudu中:

代码语言:javascript
复制
CREATE TABLE t_test(
id int ,
name string,
age int,
primary key (id)
)
PARTITION BY HASH PARTITIONS 5
STORED AS KUDU
TBLPROPERTIES(
'kudu.master_address'='cm1:7051,cm2:7051'
)
  • 向表中插入数据
代码语言:javascript
复制
#插入一条数据
[cm3:21000] default> insert into t_test (id,name,age) values (1,"zhangsan",18)

#查询数据
[cm3:21000] default> select * from t_test;
+----+----------+-----+
| id | name     | age |
+----+----------+-----+
| 1   | zhangsan | 18  |
+----+----------+-----+

#插入多条数据
[cm3:21000] default> insert into t_test (id,name,age) values (2,"lisi",19),(3,"王五",20);

#查询结果
[cm3:21000] default> select * from t_test;
+----+----------+-----+
| id | name     | age |
+----+----------+-----+
| 2   | lisi      | 19  |
| 1   | zhangsan | 18  |
| 3   | 王五       | 20  |
+----+----------+-----+

以上表使用Java api 查询Kudu中的数据也一样可以查询出来。

  • DML-向表中批量插入数据
代码语言:javascript
复制
#在Impala中再创建一个表 t_test2表,与表t_test结构一样
CREATE TABLE t_test2(
id int ,
name string,
age int,
primary key (id)
)
PARTITION BY HASH PARTITIONS 5
STORED AS KUDU
TBLPROPERTIES(
'kudu.master_address'='cm1:7051,cm2:7051'
)

#向表 t_test2中插入以下数据
[cm3:21000] default> insert into t_test2 (id,name,age) values (10,"maliu",100),(20,"tianqi",200);

#向表t_test中批量插入数据
[cm3:21000] default> insert into t_test select * from t_test2;

#查询表t_test中的数据:
+----+----------+-----+
| id | name     | age |
+----+----------+-----+
| 10 | maliu    | 100 |
| 2   | lisi     | 19  |
| 20 | tianqi   | 200 |
| 3   | 王五      | 20  |
| 1   | zhangsan | 18  |
+----+----------+-----+
  • DML-更新数据
代码语言:javascript
复制
#更新表t_test中的id为1的age为180
[cm3:21000] default> update t_test set age = 180 where id =1;

#查询t_test中id为1的数据更新结果
[cm3:21000] default> select * from t_test where id = 1;
+----+----------+-----+
| id | name     | age |
+----+----------+-----+
| 1   | zhangsan | 180 |
+----+----------+-----+
  • DML-删除数据
代码语言:javascript
复制
#删除表中id 为20的数据
[cm3:21000] default> delete from t_test where id = 20;

#查询t_test表中的结果
[cm3:21000] default> select * from t_test;
+----+----------+-----+
| id | name     | age |
+----+----------+-----+
| 2  | lisi      | 19  |
| 1  | zhangsan | 180 |
| 3  | 王五       | 20  |
| 10 | maliu     | 100 |
+----+----------+-----+
  • DDL-表重命名
代码语言:javascript
复制
#将表t_test重命名为t_test1
[cm3:21000] default> alter table t_test rename to  t_test1;

#查看impala中的表信息
[cm3:21000] default> show tables;
+---------------+
| name            |
+---------------+
| t_impala_kudu |
| t_test1        |
| t_test2        |
+---------------+
  • DDL-修改Impala映射底层的Kudu表
代码语言:javascript
复制
#在Impala中创建外表 t_kudu_map 映射Kudu表 personInfo
CREATE EXTERNAL TABLE `t_kudu_map` STORED AS KUDU
TBLPROPERTIES(
	'kudu.table_name' = 'personInfo',
	'kudu.master_addresses' = 'cm1:7051,cm2:7051'
)

#在Kudu中使用Java api 创建一张表 personInfo2,结构与表personInfo一样即可。

#修改Impala 外表 t_kudu_map 底层映射的personInfo为personInfo1表
[cm3:21000] default> alter table t_kudu_map set TBLPROPERTIES('kudu.table_name'='personInfo1');

注意:使用 “show create table t_kudu_map”查看表 t_kudu_map的建表语句,发现底层映射的Kudu表变成了 personInfo1。
  • DDL-将内部表转换成外部表
代码语言:javascript
复制
#将表 t_test1内部表转换成外部表
[cm3:21000] default> alter table t_test1 set tblproperties('EXTERNAL'='true');

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ?Kudu与Impala整合
    • 一、Kudu与Impala整合配置
      • 二、??????????????内部表
        • 三、外部表
          • 四、??????????????Impala SQL操作Kudu
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
          http://www.vxiaotou.com