
# 调整Hudi数据源性能
#### 操作场景
HetuEngine具备高速访问Hive、Hudi等数据源的能力。对于Hudi数据源调优，可以分为对Hudi表本身和对集群环境的调优。
#### 约束与限制
本章节仅适用于MRS 3.3.1-LTS及之后版本。
#### Hudi表调优
可参考如下建议优化表和数据设计：
- 建表时尽量按照频繁使用的过滤条件字段进行分区。
- 如果大部分查询场景均带有主键或主键子集的等值查询，建议使用bucket索引建表，并将查询字段作为分桶键。
- 查询MOR表时，定期执行Compaction操作可使查询性能有较大的提升，可参考[Compaction](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_248932.html)。
 
#### 集群环境调优
可以通过调整Yarn配置、集群节点资源配置、元数据缓存和动态过滤等策略对系统整体进行调优，可参考如下内容：
- 调整Yarn配置可参考[调整Yarn资源分配](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_1740.html)。
- 调整集群节点资源配置可参考[调整HetuEngine集群节点资源配置](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_1741.html)。
- 调整元数据缓存配置可参考[调整HetuEngine元数据缓存](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_1746.html)。
- 调整动态过滤配置可参考[调整HetuEngine动态过滤](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_24564.html)。
 
#### 调优案例
某用户使用Hudi MOR表存储其设备的订单出借信息，可通过订单号查询订单详细信息，每天订单量相对稳定，部分节假日可能存在小高峰，该场景存在以下特点：
- 订单号作为唯一值，并且80%以上的查询场景使用订单号进行等值查询，SQL形如**select \* from table where order_id = 'id1';**
- 每天订单量稳定，可采用天作为分区键。
- 历史分区更新不频繁，主要数据更新在新分区。
**调优建议：**
1. 使用Bucket索引建表（Spark-SQL），并且索引键为订单ID，分区键为日期。
2. 定期使用compaction合并日志，提高查询性能。
**SQL示例：**
```
set hoodie.compact.inline=true;
set hoodie.schedule.compact.only.inline=true;
set hoodie.run.compact.only.inline=false;
create table hudi_mor (order_id int, comb int, col1 string, col2 string, dt int)
using hudi
partitioned by(dt)
options(type='mor', primaryKey='order_id', preCombineField='comb',
hoodie.index.type = 'BUCKET',
hoodie.bucket.index.num.buckets=100,
hoodie.bucket.index.hash.field = 'order_id')
```
