Hive优化
一. 表连接优化
- 将大表放后头
Hive假定查询中最后的一个表是大表。它会将其它表缓存起来,然后扫描最后那个表。
- 使用相同的连接键
当对3个或者更多个表进行join连接时,如果每个on子句都使用相同的连接键的话,那么只会产生一个MapReduce job。
尽早过滤数据
尽量原子化操作
尽量避免一个SQL包含复杂逻辑,可以使用中间表来完成复杂的逻辑
二. limit 语句快速出结果
一般情况下,Limit语句还是需要执行整个查询语句,然后再返回部分结果。
有一个配置属性可以开启,避免这种情况—对数据源进行抽样
hive.limit.optimize.enable=true — 开启对数据源进行采样的功能
hive.limit.row.max.size — 设置最小的采样容量
hive.limit.optimize.limit.file — 设置最大的采样样本数
三. 调整mapper和reducer的个数
1 Map阶段优化
map个数的主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文件块大小(默认128M,不可自定义)。
举例:
a) 假设input目录下有1个文件a,大小为780M,那么hadoop会将该文件a分隔成7个块(6个128m的块和1个12m的块),从而产生7个map数
b) 假设input目录下有3个文件a,b,c,大小分别为10m,20m,130m,那么hadoop会分隔成4个块(10m,20m,128m,2m),从而产生4个map数
即,如果文件大于块大小(128m),那么会拆分,如果小于块大小,则把该文件当成一个块。
map执行时间:map任务启动和初始化的时间+逻辑处理的时间。
1)减少map数
若有大量小文件(小于128M),会产生多个map,处理方法是:
|
|
– 前面三个参数确定合并文件块的大小,
大于文件块大小128m的,按照128m来分隔;
小于128m,大于100m的,按照100m来分隔;
把那些小于100m的进行合并
四. map端聚合
通过设置以下参数开启在Map端的聚合:
set hive.map.aggr=true;
相关配置参数:
|
|
四. 命令介绍
|
|
学习链接:
hive参数
Hive性能优化
Hive调优
Hive坑
Hive调优
参数调优汇总