Apache Kudu是一个为了Hadoop系统环境而打造的列存储管理器,与通常的Hadoop生态环境中的其余应用同样,具备能在通用硬件上运行、水平扩展性佳和支持高可用性操做等功能。算法
在Kudu出现以前,Hadoop生态环境中的储存主要依赖HDFS和HBase,追求高吞吐批处理的用例中使用HDFS,追求低延时随机读取用例下用HBase,而Kudu正好能兼顾这二者。shell
Kudu的主要优势:设计模式
常见的应用场景:api
列数据存储 Columnar Data Store服务器
Kudu是一种列数据储存结构,以强类型的列(strong-type column)储存数据。网络
高效读取架构
可选择单个列或者某个列的一部分来访问,能够在知足自己查询须要的状态下,选择最少的磁盘或者存储块来访问,相对于基于行的存储,更节省访问资源,更高效。框架
数据比较oop
因为给定的某一个列当中都是一样类型的数据,因此对于同一个量级的数据比较时,这种存储方式比混合类型存储的更具优点。设计
表Table
同理,一种数据设计模式schema,根据primary key来排序组织。一个表能够被分到若干个分片中,称为tablet。
分片Tablet
一个tablet是指表上一段连续的segment。一个特定的tablet会被复制到多个tablet服务器上,其中一个会被认为是leader tablet。每个备份tablet均可以支持读取、写入请求。
分片服务器 Tablet Server
负责为客户端储存和提供tablets。只有Leader Tablet能够写入请求,其余的tablets只能执行请求。
Master
Master负责追踪tablets、tablet severs、catalog table和其余与集群相关的metadata。另外也为客户端协调metadata的操做。
Raft Consensus算法
前文介绍过了
Catalog Table
Kudu的metadata的中心位置,存储表和tablet的信息,客户端能够经过master用客户端api来访问。
逻辑复制 Logical Replication
Kudu并是否是在硬盘数据上作复制的,而是采起了逻辑复制的办法,这有如下一些好处:
随机写入效率
在内存中每一个tablet分区维护一个MemRowSet来管理最新更新的数据,当尺寸大于必定大小以后会flush到磁盘上行成DiskRowSet,多个DiskRowSet会在适当的时候作归并操做。 这些被flush到磁盘的DiskRowSet数据分为两种,一种是Base数据,按列式存储格式存在,一旦生成再也不修改,另外一种是Delta文件,储存Base中有更新的数据,一个Base文件能够对应多个Delta文件。
Delta文件的存在使得检索过程须要额外的开销,这些Delta文件是根据被更新的行在Base文件中的位移来检索的,并且作合并时也是有选择的进行。
此外DRS(Distributed Resource Scheduler)自身也会合并,为了保障检索延迟的可预测性。Kudu的DRS默认以32MB为单位进行拆分,Compaction过程是为了对内容进行排序重组,减小不一样DRS之间key的overlap,进而在检索的时候减小须要参与检索的DRS的数量。
安装部分不写了,本身都装出屎了。
经过Impala使用Kudu能够新建内部表和外部表两种。
建立一个简单的Kudu表:
CREATE TABLE kaka_first ( id BIGINT, name STRING ) DISTRIBUTE BY HASH INTO 16 BUCKETS TBLPROPERTIES( 'storage_handler' = 'com.cloudera.kudu.hive.KuduStorageHandler', 'kudu.table_name' = 'kaka_first', 'kudu.master_addresses' = '10.10.245.129:7051', 'kudu.key_columns' = 'id' );
建表语句中,默认第一个就是Primary Key,是个not null列,在后面的kudu.key_columns
中列出,这边至少写一个。
com.cloudera.kudu.hive.KuduStorageHandler
插入数据
INSERT INTO kaka_first VALUES (1, "john"), (2, "jane"), (3, "jim");
Impala默认一次同时最多插入1024条记录,做为一个batch
更新数据
UPDATE kaka_first SET name="bob" where id = 3;
删除数据
DELETE FROM kaka_first WHERE id < 3;
修改表属性
ALTER TABLE kaka_first RENAME TO employee; //重命名 ALTER TABLE employee SET TBLPROPERTIES('kudu.master_addresses' = '10.10.245.135:7051'); //更改kudu master address ALTER TABLE employee SET TBLPROPERTIES('EXTERNAL' = 'TRUE'); //将内部表变为外部表
从MySql导出数据到本地txt
select * from DAYCACHETBL into outfile '/tmp/DAYCACHETBL.txt' fields terminated by '\t' lines terminated by '\n';
保存到hdfs中/data
目录下
hdfs dfs -mkdir /data hdfs dfs -put /tmp/DAYCACHETBL.txt /data
在hive shell中建立hive表
create table DAYCACHETBL ( METERID string, SOURCEID int, VB double, DELTA double, DTIME string, UPGUID string, UPBATCH string, level string, YEAR string, MONTH string, QUARTER string, WEEK string, D_DELTA double ) ROW FORMAT DELIMITED fields terminated by '\t' lines terminated by '\n' stored as textfile location '/data';
在impala-shell下建立kudu表
create table DAYCACHETBL2 ( METERID string, SOURCEID int, VB double, DELTA double, DTIME string, UPGUID string, UPBATCH string, level string, YEAR string, MONTH string, QUARTER string, WEEK string, D_DELTA double ) DISTRIBUTE BY HASH INTO 16 BUCKETS TBLPROPERTIES( 'storage_handler' = 'com.cloudera.kudu.hive.KuduStorageHandler', 'kudu.table_name' = 'DAYCACHETBL2', 'kudu.master_addresses' = 'kudu1:7051,kudu2:7051,kudu3:7051', 'kudu.key_columns' = 'METERID' );
将hive表中的内容插入kudu表
insert into DAYCACHETBL2 select * from DAYCACHETBL;