KUDU(三)kudu的模式设计
基于HTAP方式
kudu是基于hbase-hdfs之间,满足高并发的随机读写,兼顾大规模分析处理,具有OLTP以及OLAP特征,因此是典型的HTAP(在线事务处理/在线分析处理混合模式)
早期
由于将OLTP以及OLAP拆分,事务性应用和分析型应用分开,但是分析型应用无法获取最新数据,OLTP横向扩展性不足,维护一套系统复杂度很高
2.Lambda架构
Lambda架构将工作负载分为实时层和批处理层,我们是用实施层检索和分析最新的数据,使用批处理层分析历史数据。这样会带来两个特别的问题,两套系统、两份代码,开发、运维、测试都很复杂,整个处理链条中有一处出现问题就需要重跑数据
3.Kudu设计模式
非常易于跟其他组件整合以支持SQL或者进行分布式计算,非常利于从其他关系型数据库迁移数据,数据的读写均匀分散到每个Tablet Server,以充分挖掘集群的潜力(受分区设计影响),扫描时读取查询所需的最少数据量(主要受主键设计影响,但分区设计也会起到重要作用)
好的shema设计取决于要处理数据的特征、对数据的操作以及集群的拓扑结构。Schema设计对于kudu集群性能最大化来说是最重要的事情。shema设计包含三大块:
列设计
每个列选择合适的类型、编码和压缩方式
Kudu的每个列都必须指定明确的数据类型的,非主键可以为null,目前支持的数据类型如下:
类型 | 说明 |
---|---|
bool | 布尔 |
int8 | 8位有符号整数 |
int16 | 16位有符号整数 |
int32 | 32位有符号整数 |
int64 | 64位有符号整数 |
unixtime_micros | 自1970-01-01T00:00:00Z.以来的Unix 64位微秒 |
float | 单精度(32位) IEEE-754浮点数,非精确的 |
double | 双精度(64位)IEEE-754浮点数,非精确的 |
double | 双精度(64位)IEEE-754浮点数,非精确的 |
decimal(m,n) | 精确的十进制数字,参数化,m代表精度,n代表刻度 |
string | UTF-8编码字符串,最多64KB未压缩 |
binary | 二进制,最多64KB未压缩 |
Kudu利用强类型列和列式存储格式来提供高效的编码和序列化。为了充分利用这些功能,应将列指定为适当的类型,而不是使用字符串或二进制列来模拟“无模式”表。除了编码之外,Kudu还允许在每列的基础上指定压缩
同HBase不同,kudu没有提供version和timestamp来跟踪行的变化,如果需要的话,需要自行设计一列
Decimal类型
decimal是具有固定刻度和精度的十进制数字类型,适合于财务等算术运算,(float与double不精确有舍入行为)。decimal类型对于大于int64的整数和主键中具有小数值的情况也很有用
精度:表示该列可以表示的总位数,与小数点的位置无关。此值必须介于1和38之间,并且没有默认值。例如,精度为4表示最大值为9999的整数值,或者表示最多99.99带有两个小数位值。您还可以表示相应的负值,而不用对精度进行任何更改。例如,-9999到9999的范围仍然只需要4的精度。
刻度:表示小数位数。该值必须介于0和精度之间。刻度为0会产生整数值,没有小数部分。如果
精度和刻度相等,则所有数字都在小数点后面。例如,精度和刻度等于3的小数可以表示介于-0.999和0.999之间的值
decimal列类型编码默认
性能考虑:Kudu将每个值存储在尽可能少的字节中,具体取决于decimal指定的精度,。因此,不建议为了方便使用最高精度。这样做可能会对性能,内存和存储产生负面影响
在编码和压缩之前:
精度为9或更小的十进制值以4个字节存储。
精度为10到18的十进制值以8个字节存储。
精度大于18的十进制值以16个字节存储。
alter命令不能修改的decimal列的精度和刻度
列编码
数据类型-编码对照表
编码
Plain
数据以其自然格式存储
Bitshuffle
重新排列一个值块以存储每个值的最高有效位,然后是第二个最高有效位,依此类推。最后,结果进行LZ4压缩。如果值重复的比较多,或者按主键排序时值的变化很小,Bitshuffle编码是一个不错的选择。
run length
对连续的重复值采用压缩存储,主要是通过只存储值和个数。该编码对按主键排序时具有许多连续重复值的列有效。
dictionary
创建一个字典存放所有的值,每个列值使用索引进行编码存储。如果值的个数较少,这种方式比较有效。如果RowSet的列值由于唯一值的数量过多而无法
压缩,则Kudu将透明地退回到Plain编码。这在flush期间进行评估计算
prefix
在连续的列值中对公共前缀进行压缩。对于有公共前缀的值或主键的第一列有效,因为tablet中的行是通过对主键排序并存储的。
列压缩
Kudu允许列使用LZ4、Snappy或zlib压缩编解码器进行压缩。如果减少存储空间比扫描性能更重要,请考虑使用压缩,每个数据集的压缩方式都不同,但一般来说LZ4是性能最佳的编解码器,而zlib空间压缩比最大。
默认情况下,使用BitLuffle编码的列固有地使用LZ4压缩进行压缩(不建议修改),其他编码默认不进行压缩。