
# 创建Bucket索引表调优
#### 创建Bucket索引表调优
Bucket索引常用设置参数：
- Spark：
  ```
  hoodie.index.type=BUCKET
  hoodie.bucket.index.num.buckets=5
  ```
  

- Flink
  ```
  index.type=BUCKET
  hoodie.bucket.index.num.buckets=5
  ```
  
 
#### 判断使用分区表还是非分区表
根据表的使用场景一般将表分为事实表和维度表：
- 事实表通常整表数据规模较大，以新增数据为主，更新数据占比小，且更新数据大多落在近一段时间范围内（年或月或天），下游读取该表进行ETL计算时通常会使用时间范围进行裁剪（例如最近一天、一月、一年），这种表通常可以通过数据的创建时间来做分区以保证最佳读写性能。
- 维度表数据量一般整表数据规模较小，以更新数据为主，新增较少，表数据量比较稳定，且读取时通常需要全量读取做join之类的ETL计算，因此通常使用非分区表性能更好。
- **分区表的分区键不允许更新，否则会产生重复数据。**
**例外场景：超大维度表和超小事实表**
特殊情况如存在**持续大量新增数据的维度表** （表数据量在200G以上或日增长量超过60M）或**数据量非常小的事实表**（表数据量小于10G且未来三至五年增长后也不会超过10G）需要针对具体场景来进行例外处理：
- 持续大量新增数据的维度表
  - 方法一：预留桶数，如使用非分区表则需通过预估较长一段时间内的数据增量来预先增加桶数，**缺点是随着数据的增长，文件依然会持续膨胀**；
  
  - 方法二：大粒度分区（推荐），如果使用分区表则需要根据数据增长情况来计算，例如使用年分区，**这种方式相对麻烦些但是多年后表无需重新导入**。
  
  - 方法三：数据老化，按照业务逻辑分析大的维度表是否可以通过数据老化清理无效的维度数据从而降低数据规模。
   

- 数据量非常小的事实表 这种可以在预估很长一段时间的数据增长量的前提下使用非分区表预留稍宽裕一些的桶数来提升读写性能。
  
 
#### 确认表内桶数
Hudi表的桶数设置，关系到表的性能，需要格外引起注意。
以下几点，是设置桶数的关键信息，需要建表前确认。
- 非分区表
  - 单表数据总条数 = select count(1) from tablename（入湖时需提供）；
  
  - 单条数据大小 = 平均 1KB（建议通过select \* from tablename limit 100，得出100条数据的大小，再除以100得到单条平均大小）
  
  - 单表数据量大小(G) = 单表数据总条数\*单条数据大小/1024/1024
  
  - 非分区表桶数 = 单表数据量大小(G)/2G\*2，再向上取整，如果小于4就设置桶数为4
   
- 分区表
  - 最近一个月最大数据量分区数据**总条数** = 入湖前咨询产品线
  
  - 单条数据大小 = 平均 1KB（建议通过select \* from tablename limit 100，得出100条数据的大小，再除以100得到单条平均大小）
  
  - 单分区数据量大小(G) = 最近一个月最大数据量分区数据总条数\*单条数据大小/1024/1024
  
  - 分区表桶数 = 单分区数据量大小(G)/2G，再后向上取整，最小设置1个桶
  
  
  ![](https://support.huaweicloud.com/sqlref-hudi-dli/public_sys-resources/caution_3.0-zh-cn.png)
  - 需要使用的是表的总数据大小，而不是压缩以后的文件大小
  
  - 桶的设置以偶数最佳，非分区表最小桶数请设置4个，分区表最小桶数请设置1个。
    
 
