Lanson

V1

2022/12/27阅读:13主题:丘比特忙

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

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。例如:创建内容表如下:

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:

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中:

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'
)
  • 向表中插入数据
#插入一条数据
[cm3:21000default> insert into t_test (id,name,age) values (1,"zhangsan",18)

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

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

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

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

  • DML-向表中批量插入数据
#在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:21000default> insert into t_test2 (id,name,age) values (10,"maliu",100),(20,"tianqi",200);

#向表t_test中批量插入数据
[cm3:21000default> 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-更新数据
#更新表t_test中的id为1的age为180
[cm3:21000default> 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-删除数据
#删除表中id 为20的数据
[cm3:21000defaultdelete from t_test where id = 20;

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

#查看impala中的表信息
[cm3:21000default> show tables;
+---------------+
| name            |
+---------------+
| t_impala_kudu |
| t_test1        |
| t_test2        |
+---------------+
  • DDL-修改Impala映射底层的Kudu表
#在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:21000default> alter table t_kudu_map set TBLPROPERTIES('kudu.table_name'='personInfo1');

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

分类:

后端

标签:

大数据

作者介绍

Lanson
V1

CSDN大数据领域博客专家