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

Posted Lansonli

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了客快物流大数据项目(四十三):kudu的分区方式相关的知识,希望对你有一定的参考价值。

目录

kudu的分区方式

一、Hash Partitioning (哈希分区)

二、Range Partitioning (范围分区) 

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


kudu的分区方式

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

kudu提供了3种分区方式。

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

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

/**
 * 测试分区:
 * 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 (范围分区) 

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

 * 测试分区:
 * 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 允许一个表在单个表上组合多级分区。

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

/**
 * 测试分区:
 * 多级分区
 * 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();

  • 📢博客主页:https://lansonli.blog.csdn.net
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 Lansonli 原创,首发于 CSDN博客🙉
  • 📢大数据系列文章会每天更新,停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨

以上是关于客快物流大数据项目(四十三):kudu的分区方式的主要内容,如果未能解决你的问题,请参考以下文章

客快物流大数据项目(四十一):Kudu入门介绍

客快物流大数据项目(四十四):Spark操作Kudu创建表

客快物流大数据项目(四十二):Java代码操作Kudu

客快物流大数据项目(四十六):Spark操作Kudu dataFrame操作kudu

客快物流大数据项目(四十五):Spark操作Kudu DML操作

客快物流大数据项目(四十):ETL实现方案