笔记十二:Hive调优

参数配置优化

(1)配置Hive文件

具有全局性

a)用户自定义配置文件:$HIVE_CONF_DIR/hive-site.xml 

b)默认配置文件:$HIVE_CONF_DIR/hive-default.xml.template 
# 当用户自定义配置后,会覆盖默认配置

#因为Hive是作为Hadoop的客户端环境下启动,而Hive的配置会覆盖Hadoop的配置
#不推荐使用

(2)命令行参数配置

# 启动Hive时,在命令行添加-hiveconf param=value来设定参数
# 只要通过Beeline连接的这个hiveserver2的客户端都有效
# 但只在当前窗口下生效,一旦关闭窗口,则失效
hive --service hiveserver2 --hiveconf hive.root.logger=DEBUG,console

(3)设定参数声明(推荐使用 )

设定参数声明需要使用到set关键字

-- 查看
set mapreduce.job.reduces;
-- 设定reduce数量
set mapreduce.job.reduces = 3;

设定Fetch抓取策略

Hive默认自动优化了:Fetch抓取策略

在某些简单操作下避免走MapReduce程序,有效提升了执行效率

-- 设置Fetch本地抓取策略
hive.fetch.task.conversion = more;

Fetch属性值

(1)hive.fetch.task.conversion = more; [默认值]
	可以保证在执行全表扫描、查询某几个列、执行简单查询、where条件且包括limit操作时,都不会走MR

(2)hive.fetch.task.conversion = minimal;
	保证执行全表扫描以及查询某几个列以及limit操作可以不走MR, 其他操作都会执行MR

(3)hive.fetch.task.conversion = none;
	全部查询操作,都执行MR

设定本地模式

通过本地模式在单台机器上处理所有的任务。对于小数据集,执行时间可以明显被缩短

-- 开启本地local mr
set hive.exec.mode.local.auto=true;  

-- 设置local mr的最大输入数据量,当输入数据量小于这个值时采用local  mr的方式,默认为134217728,即128M
set hive.exec.mode.local.auto.inputbytes.max=134217728;

-- 设置local mr的最大输入文件个数,当输入文件个数小于这个值时采用local mr的方式,默认为4
set hive.exec.mode.local.auto.input.files.max=4;

数据压缩格式

采用压缩与解压缩有效提升处理海量数据性能

推荐snappy压缩方案

--开启hive支持中间结果的压缩方案
set hive.exec.compress.intermediate=true;  
--开启hive支持最终结果压缩
set hive.exec.compress.output=true; 

--开启MR的mapper端压缩操作
set mapreduce.map.output.compress=true; 
--设置mapper端压缩的方案
set mapreduce.map.output.compress.codec= org.apache.hadoop.io.compress.SnappyCodec; 
-- 开启MR的reduce端的压缩方案
set mapreduce.output.fileoutputformat.compress=true;

-- 设置reduce端压缩的方案
set mapreduce.output.fileoutputformat.compress.codec = org.apache.hadoop.io.compress.SnappyCodec;
--设置reduce的压缩类型
set mapreduce.output.fileoutputformat.compress.type=BLOCK;

数据存储格式

(1)行式存储格式 TEXTFILE

优点:相关的数据是保存在一起,比较符合面向对象的思维,因为一行数据就是一条记录。这种存储格式比较方便进行INSERT/UPDATE操作

缺点:如果查询只涉及某几个列,它会把整行数据都读取出来,不能跳过不必要的列读取。当然数据比较少,一般没啥问题,如果数据量比较大就比较影响性能。

(2)列式存储格式 ORC和PARQUET

优点:查询时,只有涉及到的列才会被查询,不会把所有列都查询出来,即可以跳过不必要的列查询。高效的压缩率,不仅节省储存空间也节省计算内存和CPU。

缺点:INSERT/UPDATE很麻烦或者不方便,不适合扫描小量的数据。

当要设定行式、列式存储格式时,需要在创建表时进行指定格式,语法:

create [external] table 表名(
	字段名 字段类型,
	字段名 字段类型,
	...
) 
[row format delimited
fields terminated by '指定分隔符']
[stored as textfile]   -- 行式存储格式  18.1M
[stored as parquet]   -- 列式存储格式  13.1M
[stored as orc];   -- 列式存储格式  2.8M

join的优化操作

hive执行多表查询的SQL, 最终翻译为MR,该过程默认join行为, 基于reduce端的join

隐患:

1) 导致reduce的压力剧增, 所有的数据全部都打向reduce中
2) 当有了多个reduce后, 如果某个join字段的值出现大量的重复, 
会导致大量key发往同一个reduce, 从而导致数据倾斜

map join可以有效解决数据倾斜的作用,但小表数据需要存储在内存中, 随着mapTask越多, 存储在内存的小表数据份数也会越多当这个小表数据比较大的, 可能无法放置到内存中

故:仅适用于小表 和大表 进行join的情况

SQL优化

1)列裁剪

2)分区裁剪

3)group by操作

4)count(distinct)

笛卡尔积

动态分区

调整map和reduce的数量

并行执行

严格模式

JVM 重用

推测执行

执行计划explain

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值