Hive性能优化
1.资源优化
- Hive 运行在yarn 集群上,对集群资源的利用率的提升,也会对hive优化有帮助作用。例如 cpu 超配,需要看cpu 的利用率
- 设置合理的内存,避免内存浪费,集群的并发度减少
2.建表优化
2.1 分区设计
Hive分区是将表数据按照某个或多个字段划分为多个目录存储的技术。每个分区对应HDFS上的一个目录,分区字段的值作为目录名。分区的意义在于:
- 缩小查询范围:查询时只需扫描相关分区,减少数据读取量。
- 优化数据管理:便于按照业务需求(如时间、地域)对数据进行分类存储。
- 提升查询性能:通过分区裁剪(Partition Pruning)减少MapReduce任务的输入数据量。
a. 分区的类型
Hive分区分为静态分区和动态分区:
- 静态分区:在加载数据时手动指定分区字段的值,适用于分区字段值已知的场景。
- 动态分区:根据数据内容自动创建分区,适用于分区字段值不确定的场景,需启用动态分区功能。
b. 分 区的创建与管理
- 创建分区表:使用
PARTITIONED BY
关键字定义分区字段,分区字段不能与表中已有字段重复。 - 加载数据:通过
LOAD DATA
或INSERT
语句将数据加载到指定分区。 - 查看分区:使用
SHOW PARTITIONS
命令查看表的分区信息。 - 删除分区:使用
ALTER TABLE ... DROP PARTITION
删除指定分区。
c. 分区的优化与注意事项
- 分区字段选择:选择高基数字段(如时间、地域)作为分区字段,避免分区过多或过少。
- 分区数量控制:过多的分区会增加元数据管理开销,需根据数据量和查询需求合理设计分区策略。
- 编码规范:确保分区字段的命名和值符合业务逻辑,避免歧义。
d.. 分区的应用场景
- 日志管理:按照日期对日志数据进行分区,便于按时间范围查询。
- 数据分析:按照地域、类别等维度对数据进行分区,支持多 维分析。
- 性能优化:通过分区裁剪减少查询数据量,提升大数据查询效率。
提示
- 选择高基数(不同值较多)但又不至于产生过多小分区的列作为分区键
- 经常用于过滤条件的列适合作为分区列
- 避免过度分区,可能导致小文件问题
2.2 分桶设计
分桶是将数据基于某列的哈希值分散到固定数量的桶中的技术。
优势:
- 提高某些查询的效率,尤其是join操作
- 为抽样查询提供更高效的支持
- 可以实现更细粒度的数据组织
使用建议:
- 选择具有较高基数的列作为分桶列
- 桶的数量通常选择2的幂次方(如64、128等)
- 在有大量join操作的场景下特别有用