前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >客快物流大数据项目(四十三):kudu的分区方式

客快物流大数据项目(四十三):kudu的分区方式

作者头像
Lansonli
发布2022-02-24 15:06:51
7270
发布2022-02-24 15:06:51
举报
文章被收录于专栏:Lansonli技术博客Lansonli技术博客

目录

kudu的分区方式

一、Hash Partitioning (哈希分区)

二、Range Partitioning (范围分区) 

三、​​​​​​​Multilevel Partitioning (多级分区)

kudu的分区方式

为了提供可扩展性,Kudu 表被划分为称为 tablets 的单元,并分布在许多 tablet servers 上。行总是属于单个tablet 。将行分配给 tablet 的方法由在表创建期间设置的表的分区决定。

kudu提供了3种分区方式。

一、​​​​​​​Hash Partitioning (哈希分区)

哈希分区通过哈希值将行分配到许多 buckets ( 存储桶 )之一; 哈希分区是一种有效的策略,当不需要对表进行有序访问时。哈希分区对于在 tablet 之间随机散布这些功能是有效的,这有助于减轻热点和 tablet 大小不均匀。

代码语言:javascript
复制
/**
 * 测试分区:
 * hash分区
 */
@Test
public void testHashPartition() throws KuduException {
    //设置表的schema
    LinkedList<ColumnSchema> columnSchemas = new LinkedList<ColumnSchema>();
    columnSchemas.add(newColumn("CompanyId", Type.INT32,true));
    columnSchemas.add(newColumn("WorkId", Type.INT32,false));
    columnSchemas.add(newColumn("Name", Type.STRING,false));
    columnSchemas.add(newColumn("Gender", Type.STRING,false));
    columnSchemas.add(newColumn("Photo", Type.STRING,false));
    //创建schema
    Schema schema = new Schema(columnSchemas);
    //创建表时提供的所有选项
    CreateTableOptions tableOptions = new CreateTableOptions();
    //设置副本数
    tableOptions.setNumReplicas(1);
    //设置范围分区的规则
    LinkedList<String> parcols = new LinkedList<String>();
    parcols.add("CompanyId");
    //设置按照那个字段进行range分区
    tableOptions.addHashPartitions(parcols,6);
    try {
        kuduClient.createTable("dog",schema,tableOptions);
    } catch (KuduException e) {
        e.printStackTrace();
    }
    kuduClient.close();
}

二、Range Partitioning (范围分区) 

范围分区可以根据存入数据的数据量,均衡的存储到各个机器上,防止机器出现负载不均衡现象

代码语言:javascript
复制
 * 测试分区:
 * RangePartition
 */
@Test
public void testRangePartition() throws KuduException {
    //设置表的schema
    LinkedList<ColumnSchema> columnSchemas = new LinkedList<ColumnSchema>();
    columnSchemas.add(newColumn("CompanyId", Type.INT32,true));
    columnSchemas.add(newColumn("WorkId", Type.INT32,false));
    columnSchemas.add(newColumn("Name", Type.STRING,false));
    columnSchemas.add(newColumn("Gender", Type.STRING,false));
    columnSchemas.add(newColumn("Photo", Type.STRING,false));
    //创建schema
    Schema schema = new Schema(columnSchemas);
    //创建表时提供的所有选项
    CreateTableOptions tableOptions = new CreateTableOptions();
    //设置副本数
    tableOptions.setNumReplicas(1);
    //设置范围分区的规则
    LinkedList<String> parcols = new LinkedList<String>();
    parcols.add("CompanyId");
    //设置按照那个字段进行range分区
    tableOptions.setRangePartitionColumns(parcols);
    /**
     * range
     *  0 < value < 10
     * 10 <= value < 20
     * 20 <= value < 30
     * ........
     * 80 <= value < 90
     * */
    int count=0;
    for(int i =0;i<10;i++){
        //范围开始
        PartialRow lower = schema.newPartialRow();
        lower.addInt("CompanyId",count);
        //范围结束
        PartialRow upper = schema.newPartialRow();
        count +=10;
        upper.addInt("CompanyId",count);
        //设置每一个分区的范围
        tableOptions.addRangePartition(lower,upper);
    }
    try {
        kuduClient.createTable("student",schema,tableOptions);
    } catch (KuduException e) {
        e.printStackTrace();
    }
    kuduClient.close();
}

三、​​​​​​​Multilevel Partitioning (多级分区)

Kudu 允许一个表在单个表上组合多级分区。

当正确使用时,多级分区可以保留各个分区类型的优点,同时减少每个分区的缺点 需求.

代码语言:javascript
复制
/**
 * 测试分区:
 * 多级分区
 * Multilevel Partition
 * 混合使用hash分区和range分区
 *
 * 哈希分区有利于提高写入数据的吞吐量,而范围分区可以避免tablet无限增长问题,
 * hash分区和range分区结合,可以极大的提升kudu的性能
 */
@Test
public void testMultilevelPartition() throws KuduException {
    //设置表的schema
    LinkedList<ColumnSchema> columnSchemas = new LinkedList<ColumnSchema>();
    columnSchemas.add(newColumn("CompanyId", Type.INT32,true));
    columnSchemas.add(newColumn("WorkId", Type.INT32,false));
    columnSchemas.add(newColumn("Name", Type.STRING,false));
    columnSchemas.add(newColumn("Gender", Type.STRING,false));
    columnSchemas.add(newColumn("Photo", Type.STRING,false));
    //创建schema
    Schema schema = new Schema(columnSchemas);
    //创建表时提供的所有选项
    CreateTableOptions tableOptions = new CreateTableOptions();
    //设置副本数
    tableOptions.setNumReplicas(1);
    //设置范围分区的规则
    LinkedList<String> parcols = new LinkedList<String>();
    parcols.add("CompanyId");
    //hash分区
    tableOptions.addHashPartitions(parcols,5);
    //range分区
    int count=0;
    for(int i=0;i<10;i++){
        PartialRow lower = schema.newPartialRow();
        lower.addInt("CompanyId",count);
        count+=10;
        PartialRow upper = schema.newPartialRow();
        upper.addInt("CompanyId",count);
        tableOptions.addRangePartition(lower,upper);
    }
    try {
        kuduClient.createTable("cat",schema,tableOptions);
    } catch (KuduException e) {
        e.printStackTrace();
    }
    kuduClient.close();
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-02-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • kudu的分区方式
    • 一、​​​​​​​Hash Partitioning (哈希分区)
      • 二、Range Partitioning (范围分区) 
        • 三、​​​​​​​Multilevel Partitioning (多级分区)
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档