登 录
注 册
< 大 数 据
Flink
Hadoop
Spark
Hive
HBase
Kafka
其他框架
生产中常见问题
Hive压缩和存储
通过JDBC访问
企业级调优(一)
企业级调优(二)
企业级调优(三)
UDF实战
Hive调优参数大全
热门推荐>>>
中台架构
中台建设与架构
Hadoop
源码分析-NN启动(三)
HBase
HBased对接Hive
Linux
Nginx高可用
Python
数据导出工具
Flink
3分钟搭建Flink SQL测试环境
Kafka
Kafka对接Flume
深度学习
卷积神经网络
数据结构与算法
选择合适的算法
MySQL
数据备份恢复
计算机系统
信号量同步线程
其他框架
Azkaban Flow1.0与2.0
ClickHouse
表引擎-其他类型
技术成长
最好的职业建议
精选书单
技术成长书单—机器学习
技术资讯
数据在线:计算将成为公共服务
开发工具
IntelliJ IDEA 20年发展回顾(二)
系统工具
Mac命令行工具
虚拟化
内存虚拟化概述
云原生
云原生构建现代化应用
云服务
一文搞懂公有云、私有云...
Java
Spring Boot依赖注入与Runners
Go
Go函数与方法
SQL
SQL模板
安全常识
一文读懂SSO
当前位置:
首页
>>
Hive
>>
企业级调优(一)
企业级调优(一)
2020-07-05 10:35:47 星期日 阅读:1423
####Fetch抓取 Hive中对某些情况的查询不必要走MapReduce计算,可以开启Fetch抓取模式。比如下面的查询 `select * from tablename limit 10;` 不用走YARN就可以返回结果。 可通过设置如下参数来开启这个功能(新版的Hive中默认是开启的)。该参数有三个取值: - minimal:简单的对分区列进行过滤,并使用limit的时候可以不走MR more:比minimal支持更多的过滤都可以不走MR none:关闭Fetch抓取功能,所有查询都有MR ``` <!-- hive-site.xml --> <property> <name>hive.fetch.task.conversion</name> <value>more</value> </property> ``` ####本地模式 如果有些job的Hive输入数据量非常小,查询时触发执行MR任务消耗的时间可能会比实际的job执行时间要多很多。对于这种情况,Hive可以通过本地模式在单台机器上处理所有任务。对于较小的数据集,执行时间可以明显被缩短。 可以通过设置如下参数来实现该功能(也可以在hive 会话级别设置) ``` <!-- hive-site.xml --> <property> <name>hive.exec.mode.local.auto</name> <value>true</value> </property> <!-- 设置本地模式的最大输入数据量,超过这个值则会触发MR计算(默认128MB) --> <property> <name>hive.exec.mode.local.auto.inputbytes</name> <value>134217728</value> </property> <!-- 设置本地模式输入文件的数量,超过这个值,则会触发MR计算(默认为4) --> <property> <name>hive.exec.mode.local.auto.input.files.max</name> <value>10</value> </property> ``` ####大表小表join 新版的hive对于小表和大表之间的join做了优化,不再是小表放在前面效率更高了。hive能够自动识别小表并进行调优。 ####大表join大表 空值过滤:如果两个表的关联字段有空值,那么会导致null值关联不上,如果空值太多,则会导致空值的所有数据都放到一个reduce上,形成数据 倾斜。解决办法是先where再join。 空值转换:将空key转换为随机值,防止所有的null都放到reduce上 ``` # 空值转换为随机值 select t1.*, t2.* from t1 left join t2 on case when a.id is null then concat("hive", rand()) else a.id end = t2.id ``` ####MapJoin 如果没有开启mapjoin或者不符合mapjoin条件,那么hive解析器会将join操作转换到reduce阶段,容易发生数据倾斜。可以用mapjoin把小表全部加载到内存在map端进行join,避免reducer处理。 ``` # 打开mapjoin功能(默认就是打开的) hive> set hive.auto.convert.join = ture; # 大表小表的阈值设置(25MB) hive> set hive.mapjoin.smalltable.filesize=25000000; ``` ####GroupBy优化 group by容易造成数据倾斜,并不是所有的操作都需要在Reduce端完成,很多聚合操作都可以先在Map端进行部分聚合(平均值除外),最后在Reduce得到最终结果 开启Map端聚合参数设置 ``` hive> set hive.map.aggr = true; # 在Map端进行聚合操作的条目数目 hive> set hive.groupby.mapaggr.checkinterval=100000; # 有数据倾斜的时候进行负载均衡 hive> set hive.groupby.skewindata=true; ``` 当选项设置为True,生成的查询计划会有两个MapReduce Job: 第一个MapReduce Job中,Map的输出结果会随机分布到Reduce中,每个Reduce做部分聚合操作,这样可以保证相同的Group by Key有可能分发到不同的Reduce中,从而达到负载均衡的目的; 第二个MapReduce Job再根据预处理的数据结果按照Group By分布到Reduce中(这个过程可以保证相同的Group by key被分布到同一个Reduce中),最后完成最终的聚合操作。