Kudu学习总结

本文为Kudu学习总结

一、Kudu简介

Kudu是为快速数据的快速分析而生的存储,是专为下一代硬件设计的,可提高跨框架分析性能的,用于构建实时分析应用的原生存储引擎

二、Kudu概览

1)Kudu的特点

  • Kudu的表定义采用类似于SQL的模式,支持类型: BOOL,INT8,INT16,INT32,INT64,FLOAT,DOUBLE,STRING,BINARY,TIMESTAMP
  • 几个子列可以组成一个组合主键
  • 快速修改表
  • Kudu本身没有SQL引擎,它只是一个存储层 – “使用你自己的SQL” 例如 Impala或者Spark
  • Kudu不是一个跑在HDFS上的应用,它是一个替代品,原生的Hadoop存储引擎,期望与HDFS协同工作
  • Kudu不是要替代HDFS或者HBase,而是为用户提供一个新的选择,用户需为适合的用例选择正确的存储

2)为什么是Kudu
Kudu学习总结_第1张图片
HDFS的强项:
高效的顺序扫描能力
支持高吞吐的数据追加

HBase的强项:
高效的按行随机存取能力
支持数据的修改

可以“鱼”和“熊掌”兼得吗?
如何实现对实时变化的数据集做高效的数据分析呢(Fast Analysis on Fast Data)?
这时候不妨考虑使用Kudu!

Kudu的设计目标:
1)扫描大数据量时吞吐率高

  • 列式存储和多副本机制
  • 目标:相对Parquet的扫描性能差距在2x之内

2)随机访问数据时延时低

  • 主键索引和多数占优复制机制
  • 目标:SSD上读写延时不超过1毫秒

3)通过高CPU性能发挥RAM和Flash潜力

  • 单列扫描性能是HBase的10-100倍

4)IO效率高

  • 列式存储,按需访问

5)类似的数据库语义(初期支持单行记录的ACID)
6)关系数据模型

  • SQL查询
  • “NoSQL”风格的扫描/插入/更新(Java客户端)

三、Kudu设计

1)Kudu基本设计

  • 基本构成:表(Table)
  • 表通过水平划分分区形成多个tablet,依据范围或者hash分区
  • 每个tablet有多个备份(3个或者5个),通过Raft算法保持一致性
  • 允许从任何备份中读取数据,并具有较低的平均恢复时间MTTR
  • 使用Tablet服务器来存放tablet
  • 在本地盘存储数据(不是HDFS)

2)Kudu的元数据管理

  • 高可用的主节点,作为一个tablet的目录 (“META” table),作为一个编目表 (table schemas,etc),作为负载均衡器(跟踪服务器的监控状态,重新复制低于副本数的tablet)
  • 为高性能,缓存所有的元数据到内存
  • 客户端保存服务器端的地址,询问主节点得到需要的tablet地址并且缓存这些地址

3)Kudu故障恢复

  • 随从节点短暂失败:领导节点不受影响;故障的随从节点在5分钟之内重启服务器,就可以透明重新加入
  • 领导节点短暂失败:随从节点每1.5秒尝试和领导节点通信一次;3次失败之后,领导者选举,新的领导节点会在很短的时间内从剩余的节点中选出;故障的领导节点在5分钟之内重启,就可以作为随从节点加入
  • N 个备份能接受(N-1)/2 的失败数
  • 永久失败:领导者注意到一个随从节点已经死亡超过5分钟,便会删除这个跟随者,而后从Master节点选择一个新的Server做备份并拷贝数据到新的随从节点上

4)性能特点

  • 非常好的CPU利用率:使用C++编码, 利用了特定的CPU指令集,利用LLVM工具进行即时编译
  • 依赖存储硬件能力的低延迟:期望利用SSD或者新的硬件技术来实现亚毫秒的低延迟
  • 没有垃圾回收机制,允许没有停顿的大的内存占用
  • Bloom filters减少了大量的硬盘访问

5)权衡

  • 随机更新会变慢:HBase可以不用扫描硬盘进行随机更新,而Kudu需要在更新之前进行关键值查找,在插入前进行Bloom查找
  • 单行读取可能会变慢:列式存储设计是为了全表扫描做的优化,未来可能会为单行访问的应用引入“列组”的概念

你可能感兴趣的:(Kudu学习总结)