创建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将查询结果粘贴在notepad++中得出100条数据的大小再除以100得到单条平均大小)
- 单表数据量大小(G) = 单表数据总条数*单表数据大小/1024/1024
- 非分区表桶数 = MAX(单表数据量大小(G)/2G*2,再向上取整,4)
- 分区表
- 最近一个月最大数据量分区数据总条数 = 入湖前咨询产品线
- 单条数据大小 = 平均 1KB(华为建议通过select * from tablename limit 100将查询结果粘贴在notepad++中得出100条数据的大小再除以100得到单条平均大小)
- 单分区数据量大小(G) = 最近一个月最大数据量分区数据总条数*单表数据大小/1024/1024
- 分区表桶数 = MAX(单分区数据量大小(G)/2G,再后向上取整,1)
- 需要使用的是表的总数据大小,而不是压缩以后的文件大小
- 桶的设置以偶数最佳,非分区表最小桶数请设置4个,分区表最小桶数请设置1个。
确认建表SQL
DataArts支持通过Spark JDBC方式和Spark API方式操作Hudi表:
- Spark JDBC方式使用公用资源,不用单独起Spark作业,但是不能指定执行SQL所需要的资源以及配置参数,因此建议用来做建表操作或小数据量的查询操作。
- Spark API方式执行的SQL独立起Spark作业,有一定的耗时,但是可以通过配置运行程序参数来指定作业所需要的资源等参数,建议批量导入等
作业使用API方式来指定资源运行,防止占用jdbc资源长时间阻塞其他任务。
DataArts使用Spark API方式操作Hudi表,必须要添加参数--conf spark.support.hudi=true,并且通过执行调度来运行作业。
使用DataArts创建Hudi表
DataArts支持通过Spark JDBC方式和Spark API方式操作Hudi表:
- Spark JDBC方式使用公用资源,不用单独起Spark作业,但是不能指定执行SQL所需要的资源以及配置参数,因此建议用来做建表操作或小数据量的查询操作。
- Spark API方式执行的SQL独立起Spark作业,有一定的耗时,但是可以通过配置运行程序参数来指定作业所需要的资源等参数,建议批量导入等
作业使用API方式来指定资源运行,防止占用jdbc资源长时间阻塞其他任务。
DataArts使用Spark API方式操作Hudi表,必须要添加参数--conf spark.support.hudi=true,并且通过执行调度来运行作业。