1.1 kudu使用方法
(1)可通过Java client、C++ client、Python client操作kudu表,但要构建client并编写应用程序;
(2)可通过kudu-spark包集成kudu与spark,并编写spark应用程序来操作kudu表;
(3)可通过impala的shell对kudu表进行交互式的操作,因为impala2.8及以上的版本已经集成了对kudu的操作。下面主要讲述基于impala的使用方法。
1.2 基本要求
安装2.8及以上版本的impala,并安装hive,使用其metastore服务来存储impala的元数据。此处Hadoop、hive、impala的安装过程省略。
1.3 impala和kudu的相关配置
因为impala已经集成对kudu的操作,因此impala与kudu不需要做任何参数的配置,但为了方便,在impala的配置文件/etc/default/impala中给字段IMPALA_SERVER_ARGS增加参数-kudu_master_hosts= slave217:7051,如图:
最后通过impala-shell进入交互式命令行。
1.4 创建外部表
假设已经通过Java client等其他方式在kudu中创建了某个表,要想对该表进行操作,需要在impala中创建外部表,将其映射到impala当中,例如:
CREATE EXTERNAL TABLE my_mapping_table
STOREDAS KUDU
TBLPROPERTIES(
'kudu.table_name' = 'my_kudu_table');
1.5创建内部表
假设要通过impala创建一个新的kudu表,需要在impala中创建一个内部表,例如:
CREATE TABLE testinkudu(…………)
partition by hash partitions 8
STORED AS KUDU [AS SELECT * FROM OTHER_TABLE];
注:创建内部表时,类似partition by ………stored as kudu的分区声明语句是必须的。无论是 通过client创建的kudu表还是通过impala创建的表,都可以在master节点的UI界面的tables选项中查看,如下图:
1.6创建kudu表的partition声明
kudu表基于其partition方法被拆分成多个分区,每个分区就是一个tablet,一张kudu表所属的所有tablets均匀分布并存储在tablet servers的磁盘上。因此在创建kudu表的时候需要声明该表的partition方法,同时要指定primary key作为partition的依据。Kudu中的分区方法主要有两种:partition by hash和partition by range。
基于hash的分区方法的基本原理是:基于primary key的hash值将每个row划分到相应的tablet当中,分区的个数即tablet的个数必须在创建表语句中指定,建表语句示例如下:
create table testinkudu(
name string,
age int,
primary key(name))
partitionby hash(name) partitions 8
stored askudu;
可以在UI界面中查看该表的分区仿方式以及每个tablet分片的相关信息,如下图所示:
注:如果未指定基于某个字段的hash值进行分区,默认以主键的hash值进行分区。
基于range的分区方法的基本原理是:基于指定主键的取值范围将每个row划分到相应的tablet当中,用于range分区的主键以及各个取值范围都必须在建表语句中声明,建表语句示例如下:
create table testinkudu2(
classes int,
namestring,
ageint,
primarykey(classes,name))
partition by range(classes)(
partition value = 1,
partition value = 2,
partition value =3,
partitionvalue =4)
stored as kudu;
注:表testinkudu2有班级、姓名、年龄三个字段,表中的每个row将会根据其所在的班级划分成四个分区,每个分区就代表一个班级。
kudu表还可以采用基于hash和基于range相结合的分区方式,使用方法与上述类似,此处不再详述。
1.7 Insert语句
kudu表支持3种insert语句:
1. insertinto testinkudu values(‘a’, 12);
2. insertinto testinkudu values(‘a’, 12),(‘b’, 13),(‘c’, 14);
3. insertinto testinkudu select * from other_table;
1.8 update语句
kudu表的update操作不能更改主键的值,其他与标准sql语法相同。
1.9 upsert 语句
对于upsert into testinkudu values(‘a’, 12);如果指定的values中的主键在testinkudu中已经存在,则执行update语义,反之,执行insert语义。
1.10 delete语句
与标准sql语法相同。