hive 优化

表的优化
(1)小表join大表
hive版本升级后,小表join大表和大表join小表的执行计划查不了多少了
(2)mapjoin功能(默认是打开的)set hive.auto.convert.join = true;
将小表加入内存
(3)空值
空值导致的数据倾斜,可以将空值处理为concat(‘hive’, rand()),就是加一个随机数
(4)map端进行聚合
a.是否在Map端进行聚合,默认为True
hive.map.aggr = true
b.在Map端进行聚合操作的条目数目
hive.groupby.mapaggr.checkinterval = 100000
c.有数据倾斜的时候进行负载均衡(默认是false)
hive.groupby.skewindata = true
当选项设定为 true,生成的查询计划会有两个MR Job。第一个MR Job中,Map的输出结果会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同的Group By Key有可能被分发到不同的Reduce中,从而达到负载均衡的目的;第二个MR Job再根据预处理的数据结果按照Group By Key分布到Reduce中(这个过程可以保证相同的Group By Key被分布到同一个Reduce中),最后完成最终的聚合操作
(5)distinct操作
只要做distinct,就用不到分区。
select count(*) from (
select key from table1 group by key)a
(6)对表进行过滤后,再关联
select * from (select * from table1 where dt=‘2019-06-01’)a
join …
(7)select count(1) from tb where dt=‘2019-06-01’
改写为:select count(1) from tb where dt=‘2019-06-01’ group by dt
(8)慎用动态分区
MR优化
hive运行在MapReduce上,所以进行MR优化
(1)合理的map数:过多,初始化会比执行时间长,造成资源浪费。过少,则得处理一个map的时间过长,比较耗时
(2)合理的reduce数。有多少个reduce就会生成多少个小文件,reduce过多会小文件过多,也造成资源浪费
(3)对小文件进行合并
(4)对于大文件适当提高map数量
并行执行
JVM重用
分区、分桶

### Hive 性能优化技巧最佳实践 #### 单次扫描多路插入 为了减少I/O操作次数,在执行多个`INSERT INTO ... SELECT`语句时可以采用单次扫描的方式完成多项写入任务。通过这种方式可以在一次MapReduce作业中处理所有的目标表,从而显著降低资源消耗并加快整体运行速度[^2]。 #### 合理设置Map/Reducer数量 适当调整mapred.map.tasks和mapred.reduce.tasks参数值能够有效改善作业吞吐量。通常情况下,默认配置可能无法充分利用集群计算能力;因此,依据具体业务场景灵活设定这两个属性有助于达到更好的性能表现[^1]。 #### 使用分区与分桶 利用Hive内置的数据组织特性——分区(partitioning)及分桶(bucketing),可实现更高效的查询响应时间。对于经常作为过滤条件使用的字段创建分区结构,并根据实际需求选择合适的哈希函数对记录进行散列分配到不同bucket内存储,这将极大程度上缩小检索范围进而加速读取过程[^3]。 #### 应用合适的数据压缩算法 针对不同类型的数据集选取相匹配的编码方式(如Gzip、Snappy等),不仅可以节省磁盘空间占用率还能间接促进网络传输效率以及加载阶段的速度提升。值得注意的是,在权衡压缩比率同解压成本之间关系的基础上做出最优抉择至关重要。 ```sql -- 创建带分区和分桶的表示例 CREATE TABLE sales ( order_id BIGINT, customer_name STRING, product_description STRING, quantity INT ) PARTITIONED BY (order_date DATE, region STRING) CLUSTERED BY(order_id) SORTED BY(order_id ASC) INTO 8 BUCKETS; ``` #### 并行度调节 增大hive.exec.parallel.thread.number参数允许更多线程并发执行子查询计划片段,特别是在面对复杂嵌套式或多层关联运算时尤为有用。不过需要注意过高的并行级别可能会引发系统负载过高甚至崩溃的风险,所以应当谨慎评估适用性和潜在影响后再做决定。 #### 缓存中间结果 当存在重复访问相同数据源的情况时启用mapjoin hint或者开启自动广播小表功能可以让某些特定模式下的连接操作受益匪浅。此外,借助于Lateral View配合Explode UDTF也可以巧妙规避笛卡尔积带来的巨大开销问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值