hive(二)--hive优化,
一. 查询优化1) 查看hql的mapreduce过程
EXPLAIN [EXTENDED] select count(1) from testa
2) limit的查询抽样
set hive.limit.optimize.enable=true;
set hive.limit.row.max.size=10000;
set hive.limit.optimize.limit.file=10;
3) join优化 : 小表在左面, 减少reduce阶段
4) 优先本地进行mapreduce
优先让能够在本台机器上运行的job , 不去提交job到hadoop集群
set hive.exec.mode.local.auto=true;
5) 并行执行 : set hive.exec.parallel=true;
6) 严格查询 :
set hive.mapred.mode=strict;
注:使用严格模式可以禁止 3 种类型的查询:
(1)对于分区表,不加分区字段过滤条件,不能执行
(2)对于 order by 语句,必须使用 limit 语句。
(3)限制笛卡尔积的查询( join 的时候必须使用on )。
7) 调整reducer个数 :
1. map的个数有输入数据的大小决定 :
由以下几个参数确定的: mapred.min.split.size ,mapred.max.split.size ,dfs.block.size
2. reduce个数默认是3个. 当map的个数太多, 会导致reduce个数过多, 占满集群的reducer数量
set hive.exec.reducers.max=( 集群总 reduce 槽位个数 *1.5)/( 执行中的查询的平均个数 )
8) JVM重用 (1个main函数就启动了一个JVM)
hadoop的每个map, reduce任务都会启动一个JVM来执行. 当一个job包含多个mapreduce任务时, 会启动多个jvm执行. jvm启动的时间累计会过长
可以设置一个JVM中执行多个map, reduce任务
hadoop配置文件 : mapred-site.xml 文件 mapred.reuse.num.tasks = 个数
9) group by 优化
1. 使用索引加快group by子句
位图索引针对大量有相同值的列进行索引.
CREATE INDEX employeeIndex ON TABLE employees(age) AS 'BITMAP'
2. 单个map reduce执行多个对相同列分组的group by任务
hive.multigroupby.singlemer = false
10) 动态分区插入优化
insert into ... partition() select .. from 会动态建立查到的所有分区, 分区过多,会使得mapreduce处理划分输出流开效过大.
可以通过参数限制动态分区插入建立的分区数
hive.dynamic.partition.mode = strict // 严格模式: 必须有一个静态分区
hive.exec.max.dynamic.partitions = 30000 // 允许建立的分区最大个数
hive.exec.max.dynamic.partitions.pernode = 1000 //一次mapreduce穿件的分区数
11)开启推测执行
推测执行 : 当某一个map,reduce任务耗时超过平均任务耗时, 会启动一个新job执行这个mapreduce, 那个先执行完, 那个先返回结果
hive.mapred.reduce.tasks.speculative.execution = true
12) hive内置的虚拟列
hive.exec.rowoffset = true 开启虚拟列查询
input_file_name , block_offset_inside_file
本站文章为和通数据库网友分享或者投稿,欢迎任何形式的转载,但请务必注明出处.
同时文章内容如有侵犯了您的权益,请联系QQ:970679559,我们会在尽快处理。