Kudu快速入门与原理介绍

2021-02-17  本文已影响0人  小驴小驴

Kudu

简介

kudu简单来说与结构化数据库非常相似,kudu中定义表时与结构化数据库相似,需要定义Schema信息,并且需要且必须要定义primary key,primary key可以定义在一列或多列。kudu是介于Hive、Hbase之间的数据存储引擎。Kudu可以作为数仓的选型记录,存储海量数据并提供较为优秀的海量数据随机读写能力,这主要得益于kudu底层的数据存储模型。

架构

Kudu架构师分布式的主从架构,分为Master与Tablet两部分组件。


kudu架构.jpg

Quick Start

kudu官网中有quick start安装教程:https://kudu.apache.org/docs/quickstart.html,在此不做详细描述。
在centos /etc/profile.d目录中编写开机自启的脚本:kudu-docker.sh脚本,用于linux启动自动拉起kudu docker,脚本如下:

#!/bin/sh

MASTER1=` docker inspect --format '{{.State.Running}}'  docker_kudu-master-1_1 `
MASTER2=` docker inspect --format '{{.State.Running}}'  docker_kudu-master-2_1 `

TSERVER1=` docker inspect --format '{{.State.Running}}'  docker_kudu-tserver-1_1 `
TSERVER2=` docker inspect --format '{{.State.Running}}'  docker_kudu-tserver-2_1 `

if ( $MASTER1 == "true" );
        then
                echo "docker_kudu-master-1_1 had started"
        else
                docker start docker_kudu-master-1_1
fi

if ( $MASTER2 == "true" );
        then
                echo "docker_kudu-master-2_1 had started"
        else
                docker start docker_kudu-master-2_1
fi

if ( $TSERVER1 == "true" );
        then
                echo "docker_kudu-tserver-1_1 had started"
        else
                docker start docker_kudu-tserver-1_1
fi

if ( $TSERVER2 == "true" );
        then
                echo "docker_kudu-tserver-2_1 had started"
        else
                docker start docker_kudu-tserver-2_1
fi

数据分区策略

TODO

原理简说

底层数据模型

kudu的底层数据文件的存储,自行开发了一套可基于Table/Tablet/Replica(冗余)视图级别的底层存储系统。
这一套底层存储的优点:

工作流程

整体工作流

在了解了上述的底层数据模型之后,当一次MemRowSet达到规定的体量之后刷新到磁盘进行持久化成DiskRowSet。于此同时基础数据会进入DiskRowSet中的BaseData中存储,与此同时,每份DiskRowSet都会在内存中有一个对应的DeltaMemStore,负责记录该DiskRowSet后续的数据变更(更新、删除)。DeltaMenStore内部维护一个B-树索引映射到每个row_offset对应的数据变更。DeltaMenStore数据增长到一定程度后转换成二进制文件存储到磁盘形成DeltaFile文件。随着BaseData对应数据的不断变更,DeltaFile会慢慢增长。


数据变更流程.jpg

数据写入流程

数据写入流程,有两个主要的步骤:

  1. 对于分区策略路由没有太多好说的,kudu中记录进入tablet的分区路由策略有三种,range、hash、混合,master只需要根据记录的primary key进行计算得出tablet即可。
  2. 因为主键的唯一性,kudu有严格的要求,因此在记录写入之前先判断主键是否存在尤为的关键,在熟悉了kudu底层数据模型之后,会发现路由到的tablet中有很多的RowSet,这些RowSet中有大量的数据,因此当插入一条记录就需要对比所有的RowSet中所有的记录就显得非常的“吃力”。因此在判重时,尽量减少RowSet文件的扫描就成了首要因素,步骤如下:

数据查询流程

数据查询流程响应比较简单一些,但是kudu中数据变更并不会直接应用到数据落到磁盘,因此某一时刻的数据其实是DiskRowSet中的BaseData记录与变更文件记录的应用。


kudu数据读取流程.jpg

数据更新流程

数据更新流程比较重要的一步与数据写入流程相似,都是要先判断record的primary key,唯一不同的是,更新流程更希望数据已经存在及希望primary key命中。


kudu数据更新流程.jpg
上一篇下一篇

猜你喜欢

热点阅读