一、概念 官方概念:
Apache Kudu is an open source distributed data storage engine that makes fast analytics on fast and changing data easy.
Apache Kudu 是一个开源分布式数据存储 引擎,可以轻松地对快速变化的数据进行快速分析。
官网地址:
Apache Kudu - Fast Analytics on Fast Data
二、背景 在 KUDU 之前,大数据主要以两种方式存储:
静态数据 :以 HDFS 引擎作为存储引擎,适用于高吞吐量的离线大数据分析场景。这类存储的局限性是数据无法进行随机的读写。动态数据 :以 HBase、Cassandra 作为存储引擎,适用于大数据随机读写场景。这类存储的局限性是批量读取吞吐量远不如 HDFS,不适用于批量数据分析的场景。当面对既需要随机读写,又需要批量分析的大数据场景时,方案如下 :
数据实时写入 HBase,HBase 完成实时的数据更新 ,定时(通常是 T+1 或者 T+H)将 HBase 数据写成静态的文件(如:Parquet)导入到 OLAP 引擎(如:HDFS)。
但是也有很多缺点:
架构复杂 。从架构上看,数据在 HBase、消息队列、HDFS 间流转,涉及环节太多,运维成本很高。最后数据在多个系统上,对数据安全策略、监控等都提出了挑战。维护成本高。 用户需要在两套系统间编写和维护复杂的ETL逻辑。存储资源浪费。 两套存储系统意味着占用的磁盘资源翻倍了,造成了成本的提升。并且每个环节需要保证高可用,都需要维护多个副本,存储空间也有一定的浪费。时效性低 。数据从 HBase 导出成静态文件是周期性的,一般这个周期是一天(或一小时),在时效性上不是很高。难以应对后续的更新 。真实场景中,总会有数据是「延迟」到达的。如果这些数据之前已经从 HBase 导出到 HDFS,新到的变更数据就难以处理了,一个方案是把原有数据应用上新的变更后重写一遍,但这代价又很高。基于HDFS的存储技术,比如Parquet,具有高吞吐量连续读取数据的能力;而HBase和Cassandra等技术适用于低延迟的随机读写场景。Kudu的设计,就是试图在实时分析与随机读写之间,寻求一个最佳的结合。在Cloudera发布的《Kudu: New Apache Hadoop Storage for Fast Analytics on Fast Data》一文中有提及,Kudu作为一个新的分布式存储系统也是为了进一步提升CPU的适用效率。
KUDU 的定位是 「Fast Analytics on Fast Data 」,是一个既支持随机读写、又支持 OLAP 分析的大数据存储 引擎。
三、特点 快速处理 OLAP 工作负载。
强大但灵活的一致性模型,允许您基于每个请求选择一致性要求,包括严格序列化一致性的选项。
结构化数据模型。
同时运行顺序和随机工作负载的强大性能。
与 Apache Impala 紧密集成,使其成为将 HDFS 与 Apache Parquet 结合使用的良好、可变的替代方案。
与 Apache NiFi 和 Apache Spark 集成。
与 Hive Metastore (HMS) 和 Apache Ranger 集成以提供细粒度的授权和访问控制。
经过身份验证和加密的 RPC 通信。
高可用:Tablet Servers 和 Masters 使用Raft Consensus Algorithm ,保证只要有超过一半的 tablet 副本可用,tablet 就可以读写。例如,如果 3 个副本中有 2 个(或 5 个副本中的 3 个等)可用,则平板电脑可用。即使在领导者副本发生故障的情况下,只读跟随者平板副本也可以为读取提供服务。
故障自动检测和自我修复:为了保持数据的高可用性,系统会检测故障的 Tablet 副本并从可用的副本中重新复制数据,因此当集群中有足够的 Tablet Server 可用时,会自动替换故障的副本。
位置感知(也称为机架感知)以在相关故障的情况下保持系统可用,并允许 Kudu 集群跨越多个可用区。
逻辑备份(完整和增量)和还原。
多行事务(仅适用于 Kudu 1.15 版本的 INSERT/INSERT_IGNORE 操作)。
易于管理和管理。
四、架构 KUDU 中存在两个角色
Mater Server :负责集群管理、元数据管理等功能。即tablet和表的基本信息,监听TServer的状态,TMaster之间通过raft协议进行数据同步。Tablet Server :负责数据存储,并提供数据读写服务。tablet 负责这一张表的某块内容的读写,接受其他tablet leader 传来的同步信息。Table(表)
一张talbe是数据存储在Kudu的tablet server中。表具有 schema 和全局有序的primary key(主键)。table 被分成称为 tablets 的 segments。
Tablet
一个 tablet 是一张 table连续的segment,tablet是kudu表的水平分区,类似于google Bigtable的tablet,或者HBase的region。每个tablet存储着一定连续range的数据(key),且tablet两两间的range不会重叠。一张表的所有tablet包含了这张表的所有key空间。与其它数据存储引擎或关系型数据库中的 partition(分区)相似。给定的tablet 冗余到多个 tablet 服务器上,并且在任何给定的时间点,其中一个副本被认为是leader tablet。任何副本都可以对读取进行服务,并且写入时需要在为 tablet 服务的一组 tablet server之间达成一致性。
KUDU 的核心对外 API 主要分为写跟读两部分
写:Insert、Update、Delete,所有写操作都必须指定主键。 读 : Scan 操作,Scan 时用户可以指定一个或多个过滤器,用于过滤数据。 五、应用场景 Strong performance for both scan and random access to help customers simplify complex hybrid architectures(适用于那些既有随机访问,也有批量数据扫描的复合场景) High CPU efficiency in order to maximize the return on investment that our customers are making in modern processors(高计算量的场景) High IO efficiency in order to leverage modern persistent storage(使用了高性能的存储设备,包括使用更多的内存) The ability to update data in place, to avoid extraneous processing and data movement(支持数据更新,避免数据反复迁移) The ability to support active-active replicated clusters that span multiple data centers in geographically distant locations(支持跨地域的实时数据备份和查询) 六、kudu的模式设计 1、列设计 编码类型
列压缩格式
kudu允许的压缩算法是LZ4、Snappy、zlib(gz)。默认情况下,kudu不压缩数据。通常情况下,压缩算法会提高空间利用率,但是会降低scan性能。
2、主键设计 同RDBMS一样,kudu的主键同样采用了唯一性约束。 一旦主键创建了之后便不能更改。
每个kudu表有且仅有一个由一列或多列组成的主键。主键列必须不可为空,并且不能使用bool或者浮点类型。
3、分区设计 1.范围分区Range Partitioning 范围分区的分区方式将数据按照范围进行分类,每个partition会分配一个固定的范围,每个数据只会属于一个分区,不同的partition的范围不能有重叠,分区在表的创建阶段配置,后续不可修改,但是可以删除和新增,如果数据找不到所属的分区将会插入失败。
Range Partitioning 的优势是在数据进行批量读的时候,可以把大部分的读变成同一个 tablet 中的顺序读,能够提升数据读取的吞吐量。并且按照范围进行分区,我们可以很方便的进行分区扩展。其劣势是同一个范围内的数据写入都会落在单个 tablet 上,写的压力大,速度慢。
2.哈希分区Hash Partitioning hash分区将行通过hash值分配到其中一个存储桶(buckets)中,在single-level hash partitioned tables(单机散列分区表)中,每个存储桶将对应一个tablet。在创建表的时候设置桶数。通常,主键列用作散列的列,但与范围分区一样,可以使用主键列的任何子集。
数据的写入会被均匀的分散到各个 tablet 中,写入速度快。但是对于顺序读的场景这一策略就不太适用了,因为数据分散,一次顺序读需要将各个 tablet 中的数据分别读取并组合,吞吐量低。并且 Hash 分区无法应对分区扩展的情况。
3.多级分区Multilevel Partitioning kudu支持多层的分区方式,将hash分区和范围分区结合起来。
分区修剪(调优)
当可以通过扫描谓词确定分区可以完全过滤时,Kudu扫描将自动跳过扫描整个分区。要删除哈希分区,扫描必须在每个哈希列上包含相等谓词。要删除范围分区,扫描必须在范围分区列上包含相等或范围谓词。在多级别分区表上的扫描可以独立地利用任何级别上的分区修剪。