开发者学堂课程【NoSQL 数据库 Kudu 教程:Java 操作 kudu--分区策略】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/723/detail/12907
Java 操作 kudu--分区策略
内容介绍:
一、 kudu 分区方式
二、 Range Partitioning(范围分区)
三、multi partition(多级分区)
一、kudu 分区方式
kudu 当中表的分区方式,也称之为分区策略,所谓的分区方式指的是 kudu 当中一个表,最终会被划分成若干个叫做tablet 的,这样的数据单元,tablet 会存储在各个不同的 tablet server 上,所关心的是一个表当中有很多行记录,这些行是按照何种规则进行划分的,比如说有一张表0到99,作为的主键 ID,到底这100条数据是随机,还是按照某种规则,还是按照某种范围,这一个决定一行季度属于哪一个 tablet 就是所谓的分区规则方式的问题,分区指定的方式,是在建表的时候,通过表的 option 来设置的当下的 kudu 它支持三种分区的方式。
第一种,叫做 range partitioning 范围分区,所谓的 range 的根据存入插入的数据量,划定一个范围,比如说0到10,作为一个10到20,20到30,30到40,这样可以把数据均衡平均地存储在各个不同的服务器上,避免出现一个负载不均衡的情况,这是一种规则。
第二种叫做 hash 分区,hash 本身是一个算法,指定某个字段或者某个力,然后,根据他的 hash 值对指定的个数进行取余取模运算,然后也可以分配到各个不同的分区当中,可以对的数据随机分散是有帮助的,还可以避免所谓的热点问题,剪辑的热点问题。
第三种方式,叫做多级分区 multilevel,就是在上面两个分区的基础上,做一个整合,既采用范围分区,又采用 hash分区,相当于在分区的基础上继续分区,择其两个优点,选择同时,尽量减少每个的缺点。
首先打开的 ID,通过之前的建表语句,在之前进行创建表的时候,在最终这里 option 当中去指定了根据 ID 采用hash 分区,做一个相关的验证,把这个表达中的逻辑全部给它复制过来,重新写一个新的方法,写一个 attest,叫做public void Test partition ,首先看第一个,先把这个代码给它粘贴过来,这里边的表也是方便重新创建一个新的表,第一个表叫做 T hash partition,事实上的 hash 分区,也是 kudu 当中默认的分区方式,接下来把它拿过来,这里报错应该是一个异常问题,选择他把异常给他抛一下,如果这个表不存在,创建这个表,上面的这些都不用动,指定表的 scheme 信息,哪些字段,哪些类型,创建 option 在这里,创建了一个表的 tab options,在无形当中,指定了所谓的字段,所以这里很重要,以下叫指定用于分区的字段,是以 ID 为例,指定好段之后再来看一下,要通过下面这个 API 把刚才的一个字段 partition list,以及分区的个数六设置到 options 当中,相当于最终每条记录 ID 都要进行hash kudu 的值,对六进行取模来进行分配,就可以得到一个新的一个表,
执行这个结果右键选择做一个 run 运行,等这里执行,这边出现绿色退出状态码为0,执行成功打开的浏览器,在这边做一个刷新,选择的 tables,这叫 T hash partition,点击表后面链接的来看一下,这后面就写了字段,重点看这个partition scheme,根据 ID 的 hash 分到六个分区当中,这就是第一种。
二、Range Partitioning(范围分区)
接下来看一下第二个叫做范围 range 分区,比如现在再创立个表,叫做 t range partition,range 就是首先想一下这个 range 一个范围,就自闭意味着有一个上下边界的问题,接下来做个演示,把这一段代码给注释掉,首先第一件事,要指定 range 分区的字段,第一步指定 range 分区的字段,要范围分区根据分区字段分区范围,用的叫做 table options,点 sight range parting club 是指定分区的字段,这个字段就是 parting list ,这是第一个,接下来看一下要指定分区的策略,指定分区的策略,首先给大家画一下,希望最终达到一个什么样的范围分析效果,从0开始大于等于0的 ID,根据 ID 来分的,然后,小于10,这是一个 range 范围,比如说最终希望得到这样效果,然后从10到的20,这是一个,从20到30,这是一个 range,然后从30到的40是一个 range,从40到最终的50号,进行 range 肯定会有上下边界的问题,先看一下 API,比如在这里,这里用的是 tableoption.叫add range,后面有两个选项,一个叫做lower,一个叫做 upper,只不过不是用 int 类型表示的,而是用这个 partitioning lower 一个类型来分装的,就是上下边界,先不设置它,接下来数据只能做个循环,比如下届是从0开始的,0,10,20,30这里首先第一个变量 ink 叫做count, count 等于0首先从0开始,接下来,针对来做一个循环,比如这里从0、1、2、3、4、5个分区,所以第一个变量 I=0,然后从0开始,i<=5,应该没有五个分区,0、1、2、3、4、5个分区,然后下来干什么,i++,在这当中,后面继续写 i==i<5,i++首先是准备下届,上下届,方法应该发现它里面是叫做 partition lower,不是一个 int 类型,所以不能临时把这样往里面放 partition,从的 scheme 当中获得,scheme 的一个方法,叫做 new 一个 partition Row,可以获得下届的,比如首先来个 lower,下届,lower 怎么获取,lower.add Int,需要指定哪个字段,是根据 int 来进行划分的,当前 int 是不是把 count 起来可以了,count 是0,是不是现在下届是0,接下来还要准备一个上届,在通过的 scheme 也 new 一个 partial row 这就来个 apper ,这里面也需要去指定一下的 apper.addint,首先这个字段标出来还是 ID,这是下届是0,上届是10,怎么变成10,当届时的是0,所以这里可以做这么操作,那这个 count,做一个加时操作,加等于10经过这步操作之后,再把 count 拿过来说它变成10,因此第一次的时候他就是0,到10下来,它是10,然后变成20,这样就满足了需求了,接下来才把这一个给它放到这里面好,来看一下设置之后,里面需要一个叫做apper,应该是一个 lower,一个下届,然后一个 apper 上届,这样就完成了一个范围的一个指定,所以这里简单写两个注释,指定 range 的下届,指定 range 的上届,最终鉴别的效果叫做 T range partition ,表达 schema 信息一样没有区别,run 等他执行,首先报错了,报错叫做 unknown column int,不认识这个字段叫做 int,应该写 ID,性别的差别要注意,接下来再重新装运,叫 ID,不可以写个 int,这时候字形已经成功了,
已经绿色了下来,打开浏览器看一下,做一个刷新 tables 来看,多了一个 t range partition,点开这个表,是不是这种效果,分区规则是根据的 ID range 的一个划分,0到10的这一个范围,10到20,20到30,到50,这样就做了一个划分,下来把数据做一个平均分配,这是第二种分区方式,叫做 range partition,第三种叫做多级分区,相当于是分区计算机一分区,比如说进行 range 区分,分为0到10作为一个分区了,0到10当中能不能根据 hash 再进行划分,也是可以的,分区记忆分区。
三、multi partition(多级分区)
创建第三个表叫做 t multi partition,这个表名也写一下,在参加表的时候,只要注意,把上面这个表这个 hash,打开之后,把它设为三个,根据的 ID,既有的 hash 又有的 range,根据 hash ID 分为三个部分,然后根据 range 分为这几个范围,直接来右键 run 运行再去看一下结果,找一个运行结束,回到浏览器做一个刷新,有了 multi partition,点开大家发现,首先看这个 scheme 信息 hash ID,根据 ID 分为三个部分,然后 Range 的范围是0到10一样,这种猜想 hash 是分为三个,range 是分为五个,0到10,1个,到底最后几个,来看最后结果 count 是最终的分析结果是15个,你能猜出来为什么15个,首先把数据根据这个 range 分为这么几个部分,1、2、3、4、5,5个部分,每个部分当中再根据 hash 再划分为三个部分,所以说最终是每个当中分为三个部分,所以这种方式,叫做多重分区,多个分区,相当于结合了两个分区的优点,在实际过程当中,可以结合具体场景来进行选择,默认情况下叫做 hash,根据你指定的字段 hash kudu 值模除与分区的个数把数据做一个分配,这就是 kudu 当中分区的一个概念,决定了一条记录属于哪一个 tablet。