特点
hdfs存储,共吞吐但无法随机读写
Hbase存储,可以随机读写但吞吐量不够
kodo存储,既支持随机读写,又支持OLAP分析的大数据存储引擎
kudu集群由多个表组成,每个表由多个字段组成,有主键
水平拆分,永于存储
主从架构
核心API
写包括Insert、Update、Delete,所有写必须指定主键,读提供了Scan操作
Scan是可以指定过滤器过滤数据
一致性
如A,B 所以你不应先看到B没看到A,(数据在读的时候正在改,导致一个事物
多次读取到的数据可能不一致),所以可以在Client之间传播带有时间戳的token,
还有控制时间误差的方案称为 TrueTime,表示当前绝对精确时间在
TT.now().latest和 TT.now().earliest 之间。
KUDU 中存在两个角色
Mater Server:负责集群管理、元数据管理等功能
Tablet Server:负责数据存储,并提供数据读写服务
先从 Master Server 获取元数据信息,然后去 Tablet Server 读写数据
分区策略
横向分区
一,按照字段值范围分区,HBase就是采用了这个
二,按照字段hash值进行分区
三,对一个表指定一个范围分区规则和多个Hash分区规则
存储设计
列式存储,快速地列扫描,低延迟地随机更新,稳定性
存储实现
KUDU 的存储也是通过 LSM 树(Log-Structured Merge Tree)来实现的。KUDU 的最小存储单元是 RowSets,KUDU 中存在两种 RowSets:MemRowSets、DiskRowSets,数据先写内存中的 MemRowSet,MemRowSet 满了后刷到磁盘成为一个 DiskRowSet,DiskRowSet 一经写入,就无法修改了。
应对数据变更
DiskRowSet 是不可修改了,那么 KUDU 要如何应对数据的更新呢?在 KUDU 中,把 DiskRowSet 分为了两部分:base data、delta stores。base data 负责存储基础数据,delta stores负责存储 base data 中的变更数据。每份 DiskRowSet 在内存中都会有一个对应的 DeltaMemStore,负责记录此 DiskRowSet 后续的数据变更(更新、删除)
构建maven工程,导入依赖
<dependencies>
<dependency>
<groupId>org.apache.kudu</groupId>
<artifactId>kudu-client</artifactId>
<version>1.6.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
初始化方法
public class TestKudu {
//定义KuduClient客户端对象
private static KuduClient kuduClient;
//定义表名
private static String tableName="person";
/**
* 初始化方法
*/
@Before
public void init(){
//指定master地址
String masterAddress="node1,node2,node3";
//创建kudu的数据库连接
kuduClient = new KuduClient.KuduClientBuilder(masterAddress).defaultSocketReadTimeoutMs(6000).build();
}
//构建表schema的字段信息
//字段名称 数据类型 是否为主键
public ColumnSchema newColumn(String name, Type type, boolean isKey){
ColumnSchema.ColumnSchemaBuilder column = new ColumnSchema.ColumnSchemaBuilder(name, type);
column.key(isKey);
return column.build();
}
}