hive调优常见策略

  • fetch抓取机制

通俗解释:在执行hive sql的时候 能不跑MapReduce程序尽量不跑MapReduce程序。

直接针对表所对应的文件进行操作

fetch默认是开启的。hive.fetch.task.conversion=more

在下述三种情况下 sql 不执行MapReduce程序 直接针对文件操作。

  1. 全局查找:select * from student_local;
  2. 字段查找:select sno,sname,sage from student_local;
  3. limit查找:select sno,sname,sage from student_local limit 3;
  • MapReduce本地执行机制

hivesql--->mapreduce--->yarn--->hdfs  集群模式执行sql
hivesql--->mapreduce--->local --->hdfs 本地模式执行sql

Q:MapReduce是如何决定以何种模式执行的?yarn?local?


        mapreduce.framework.name
        yarn


conf.set("mapreduce.framework.name","local")

在hive中 有个参数 是否智能切换本地模式运行

hive.exec.mode.local.auto  默认为false  意味着所有的MapReduce都是yarn运行的

如果设置为true hive会根据下述三个条件是否满足 来决定执行什么模式
 1、整个输入数据量 小于128M
 2、整个maptask 小于4
 3、整个reducetask 1 或者是 0

  • join优化

1)设置自动选择 mapjoin
set hive.auto.convert.join = true; 默认为 true
(2)大表小表的阈值设置:
set hive.mapjoin.smalltable.filesize= 25000000;

  • 大表join大表的时候 空key的处理

空key过滤
空key转换
最好拼接随机数 避免产生新的问题:数据倾斜

  • 大小表 小大表join

想怎么join 就怎么join 注意控制小表的阈值条件 hive会自动识别 尝试转换map join 提高性能

  • group by优化

注意事项:如果分组的字段中某个值过多 可能会导致数据倾斜问题的产生

后果:倾斜的数据处理迟迟不结束 导致整个mr程序不结束

解决:开始hive数据倾斜时候的负载均衡参数 底层会打散数据 通过两个mr来执行

set hive.groupby.skewindata = true;

  • maptask reducetask个数如何调整

#大文件处理场景
  直接修改hdfs block size=512M  1G
  block size==split size   maptask个数
  
#小文件处理场景
  1k,1k,1k
  在上传hdfs之前 本地系统进行合并:  java IO---->大文件(block size)
  在上传的时候合并:hadoop fs -appendToFile 把多个文件追加到一个文件中 (block size)
  在上传之后合并:hadoop archive、MapReduce程序预处理

reducetask个数调整

(1)每个 Reduce 处理的数据量默认是 256MB
hive.exec.reducers.bytes.per.reducer=256123456
(2)每个任务最大的 reduce 数,默认为 1009
hive.exec.reducers.max=1009
(3)mapreduce.job.reduces
该值默认为-1,由 hive 自己根据任务情况进行判断。

mapreduce.job.reduces这个参数为-1 表示hive会根据1)2)两个条件来评估启动多少个reducetask
如果mapreduce.job.reduces 被用户设置 设置为几 reducetask个数就为几
你设置的不一定生效 某些场景下 hive会根据sql自己改变。
比如:在order by全局排序的时候 为了满足执行成功 只会启动一个reducetask。

  • hive的sql 执行计划

帮助去查询所写 sql 通过几个阶段stage完成的  以及每个阶段之间的依赖关系
对于有些复杂的sql 帮助排除sql逻辑编写是否有误
EXPLAIN  sql语句

  • hive并行执行机制

hive中sql会转换成多个不同的阶段stage完成。如果某些阶段直接没有依赖关系 可以开启并行执行 提高运行效率
默认情况下 hive一次只会执行一个。
set hive.exec.parallel=true; //打开任务并行执行
set hive.exec.parallel.thread.number=16;//指定并行度

  • hive的严格模式

默认情况下 hive是非严格模式的 所有sql只要语法正确都可以执行
但是为了避免某些sql造成意想不到的影响 hive提供了所谓的严格模式
在严格模式下:如下3中情况决定禁止执行的
A:分区表必须加上分区字段过滤
B:orderby语句必须加上limit限制
C:禁止笛卡尔积查询操作

 hive.mapred.mode =  strict|nonstrict

  • jvm重用机制

MapReduce中每个task都是jvm进程实例。
默认是一个jvm运行一个task.
可以开启重用机制  一个jvm运行多个task.

set mapred.job.reuse.jvm.num.tasks=10;

  • MapReduce推测执行机制

找出拖后腿的task 为其启动备份task 处理同一份任务 谁先处理完 谁的结果作为最终结果
hive默认也是开启的。

你可能感兴趣的:(大数据之Hive,hive调优常见策略,大数据hive,hive调优)