参数配置优化
(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)