一.hive参数设置
hive参数设置范围:配置文件参数>命令行参数>set参数声明
hive参数设置优先级:set参数声明>命令行参数>配置文件参数
注意:一般执行SQL需要指定的参数,都通过set参数声明,因为它属于临时设置,断开就失效了
1.hive数据压缩
大部分会选择通过snappy来压缩,因为它可以在合理的压缩比例下有较高的解压缩速度.
2.行列存储的优缺点
行存储:textfile和squencefile
优点:select * from 表名;相对比较快,比较符合面向对象的思维,因为一行数据就是一条记录,所以比较合适insert,update插入和更新数据.
缺点:如果只涉及到几个列的查询,会把整行数据读取出来,在数据量较大的时候会影响性能.
每一行的列字段类型不一样,不容易压缩,空间利用率不高.select 字段名 from 表名;相对比较慢
列存储:ORC和parquet
优点:select 字段名 from 表名;相对比较快
查询时,只有被涉及到的列才会查询出来,可以跳过不必要的列
高效的压缩率,节省存储空间以及计算内存和CPU
注意:orc内置一种压缩算法:zlib,实际中会将ORC压缩算法替换为snappy,格式为stored as orc tblproperties ("orc.compress"="SNAPPY")
3.fetch抓取
核心点:执行SQL时,能不走MR,尽量不走MR
正常:全表扫描,查询列数据,简答查询,limit操作不走MR
三种模式:more,minimal,none
4.本地模式
核心点:MR能走本地模式,尽量走本地MR
默认关闭,set hive.exec.mode.local.auto=true;
5.join的优化操作
小表和大表join:通过map端join,提升效率和避免数据倾斜
大表和大表join:在join前通过where过滤数据,从而提升效率,可以通过null值替换为随机数,减少数据倾斜.
6.sql优化
列裁剪:Hive在读数据的时候,可以只读取查询中所需要用到的列,而忽略其他列
分区裁减:如果操作的表是一张分区表, 那么建议一定要带上分区字段, 以减少扫描的数据量, 从而提升效率.
group by操作:通过map端聚合,有数据倾斜的时候开启负载均衡.set hive.groupby.skewindata = true;
count(distinct):利用group by替换distinct提升效率
笛卡尔积:
1) 避免join的时候不加on条件,或者无效的on条件
2) 关联条件不要放置在where语句, 因为底层, 先产生笛卡尔积 然后基于where进行过滤 , 建议放置on条件上
3) 如果实际开发中无法确定表与表关联条件 建议与数据管理者重新对接, 避免出现问题
7.动态分区
在创建分区表时可以不指定分区目录名称,通过已有的分区表创建.
8.MapReduce并行度调整
1).不是map越多越好,一个任务有很多小文件时,每个小文件会被当做一个块,用一个map任务来完成,map任务启动和初始化的时间远远大于逻辑处理的时间,造成资源浪费,而且map可执行数是受限的,
2)是不是每个map处理接近128m的文件块,就没问题了?
如果一个文件只有1,2列字段,但有几千万个记录,用一个map任务去做就会比较耗时.
3)是不是Reduce越多越好?
过多的启动和初始化reduce也会消耗时间和资源
有多个reduce就有多少个文件,如果生成了很多了小文件,作为下一个任务的输入,就会造成小文件过多的问题.
什么情况下只有一个reduce:order by,执行不需要group by直接聚合的操作,笛卡尔积
8.并行执行
让独立的MR程序同时执行,正常是一个一个来
9.严格模式
限制一些效率极低的SQL
order by不加limit,出现笛卡尔积现象,查询分区表不加分区字段
10.JVM重用
让container容器可以重复使用
11.推测执行
通过规则推算出拖后腿任务,对任务进行备份操作,让备份任务和原始任务同时处理一份数据,最终选用先完成任务的计算结果.
10.执行计划EXplain
使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。帮助我们了解底层原理,hive调优,排查数据倾斜等有很有帮助
使用示例:explain [...] sql查询语句;
explain sql语句: 查看执行计划的基本信息