Hive 优化汇总
参考:
http://www.cnblogs.com/yshb/p/3147710.html
http://www.cnblogs.com/sandbank/p/6408762.html
一 join时注意点:
1. 小表放前面
Hive假定查询中最后的一个表是大表。它会将其它表缓存起来,然后扫描最后那个表。
2. 使用相同的连接键
当对3个或者更多个表进行join连接时,如果每个on子句都使用相同的连接键的话,那么只会产生一个MapReduce job。
3. 尽量尽早地过滤数据
减少每个阶段的数据量,对于分区表要加分区,同时只选择需要使用到的字段。
4. 尽量原子化操作
尽量避免一个SQL包含复杂逻辑,可以使用中间表来完成复杂的逻辑
二. map join
1. Map Join 的使用场景:
- 关联操作中有一张表非常小
- 不等值的链接操作
2. 语法:
使用 hint 的方式指定join时使用mapjoin。
select /*+ mapjoin(c)*/ -- hint
c.tag,b.yemaozi_pre
from
(select
row_number() over(partition by 1 order by yemaozi_pre) yemaozi_rank,
yemaozi_pre
from customer_purchase_time_pre
) b -- 大表
join
(select
count(buyer_nick) total_buyer,'yemaozi' as tag
from customer_purchase_time_pre
) c -- 小表,只有一行
where b.yemaozi_rank=round(c.total_buyer*0.9);
用时才发现了个细节:
/*+mapjoin( c ) */ 这个语法里面的c 是join的小表的名字!
3. 原理:
MAPJION会把小表全部读入内存中,在map阶段直接拿另外一个表的数据和内存中表数据做匹配,由于在map是进行了join操作,省去了reduce,运行的效率也会高很多。
4. 分析:
- 例子中的小表参与join,没使用map join时,会导致数据倾斜严重。某个reduce上落太多数据,reduce时内存会严重占用,甚至不足。
- 不等连接时,reduce会进行笛卡儿积,效率很低。
- 使用map join后 join操作会在map阶段完成。
如果join数据两大,加上如下参数避免内存溢出:
set
mapreduce.reduce.shuffle.input.buffer.percent =0.6;
set
mapreduce.reduce.shuffle.parallelcopies = 5;
三 union all 注意点
如果union all的部分个数大于2,或者每个union部分数据量大,应该拆成多个insert into 语句
四 常用的参数设置
-- 并发执行
hive.exec.parallel=true; -- 默认为false
hive.exec.parallel.thread.number=8;
-- 防止数据倾斜
hive.map.aggr=true; -- 在map中会做部分聚集操作, 效率更高但需要更多的内存。
-- Strict Mode:
hive.mapred.mode=true;
-- 动态分区开关
set hive.exec.dynamic.partition.mode=nonstrict;
-- 负载均衡
hive.groupby.skewindata=true:
数据倾斜时负载均衡,当选项设定为true,生成的查询计划会有两个MRJob。
第一个MRJob 中,Map的输出结果集合会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同的GroupBy Key,有可能被分发到不同的Reduce中,从而达到负载均衡的目的;
第二个MRJob再根据预处理的数据结果按照GroupBy Key分布到Reduce中(这个过程可以保证相同的GroupBy Key被分布到同一个Reduce中),最后完成最终的聚合操作。
-- 合并小文件
hive.merg.mapfiles=true:合并map输出
hive.merge.mapredfiles=false:合并reduce输出
hive.merge.size.per.task=256*1000*1000:合并文件的大小
hive.mergejob.maponly=true:如果支持CombineHiveInputFormat则生成只有Map的任务执行merge
hive.merge.smallfiles.avgsize=16000000:文件的平均大小小于该值时,会启动一个MR任务执行merge。
-- 使用索引:
hive.optimize.index.filter:自动使用索引
hive.optimize.index.groupby:使用聚合索引优化GROUP BY操作
五 查询注意
1. order by & sort by
order by : 对查询结果进行全局排序,消耗时间长。需要 set hive.mapred.mode=nostrict
sort by : 局部排序,并非全局有序,提高效率。
2. limit 快速抽样结果
一般情况下,Limit语句还是需要执行整个查询语句,然后再返回部分结果。
有一个配置属性可以开启,避免这种情况---对数据源进行抽样
hive.limit.optimize.enable=true --- 开启对数据源进行采样的功能
hive.limit.row.max.size --- 设置最小的采样容量
hive.limit.optimize.limit.file --- 设置最大的采样样本数
缺点:有可能部分数据永远不会被处理到
3. 设置严格的查询限制: set hive.marped.mode=strict
防止用户执行那些可能意想不到的不好的影响的查询
-- 1) 分区表,必须选定分区范围
-- 2) 对于使用order by的查询,要求必须使用limit语句。因为order by为了执行排序过程会将所有的结果数据分发到同一个reducer中进行处理。
-- 3) 限制笛卡尔积查询:两张表join时必须有on语句
4. 如果没有聚合的简单查询,可以用fetch task 而不需要起 MR任
set hive.fetch.task.conversion=minimal -- 默认情况下是minimal
六 数据倾斜
表现:
任务进度长时间维持在99%(或100%),查看任务监控页面,发现只有少量(1个或几个)reduce子任务未完成。因为其处理的数据量和其他reduce差异过大。
单一reduce的记录数与平均记录数差异过大,通常可能达到3倍甚至更多。 最长时长远大于平均时长。
原因:
1)、key分布不均匀
2)、业务数据本身的特性
3)、建表时考虑不周
4)、某些SQL语句本身就有数据倾斜
关键词 | 情形 | 后果 |
---|---|---|
join | 其中一个表较小,但是key集中 | 分发到某一个或几个Reduce上的数据远高于平均值 |
join | 大表与大表,但是分桶的判断字段0值或空值过多 | 这些空值都由一个reduce处理,灰常慢 |
group by | group by 维度过小,某值的数量过多 | 处理某值的reduce灰常耗时 |
count distinct | 某特殊值过多 | 处理此特殊值reduce耗时 |
解决方案:
hive.map.aggr=true; -- 在map中会做部分聚集操作, 效率更高但需要更多的内存。
Hive 优化汇总的更多相关文章
- Hive 12、Hive优化
要点:优化时,把hive sql当做map reduce程序来读,会有意想不到的惊喜. 理解hadoop的核心能力,是hive优化的根本. 长期观察hadoop处理数据的过程,有几个显著的特征: 1. ...
- hive优化之——控制hive任务中的map数和reduce数
一. 控制hive任务中的map数: 1. 通常情况下,作业会通过input的目录产生一个或者多个map任务.主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文 ...
- Hive优化案例
1.Hadoop计算框架的特点 数据量大不是问题,数据倾斜是个问题. jobs数比较多的作业效率相对比较低,比如即使有几百万的表,如果多次关联多次汇总,产生十几个jobs,耗时很长.原因是map re ...
- 大数据开发实战:Hive优化实战3-大表join大表优化
5.大表join大表优化 如果Hive优化实战2中mapjoin中小表dim_seller很大呢?比如超过了1GB大小?这种就是大表join大表的问题.首先引入一个具体的问题场景,然后基于此介绍各自优 ...
- 大数据开发实战:Hive优化实战1-数据倾斜及join无关的优化
Hive SQL的各种优化方法基本 都和数据倾斜密切相关. Hive的优化分为join相关的优化和join无关的优化,从项目的实际来说,join相关的优化占了Hive优化的大部分内容,而join相关的 ...
- 【转】Hive优化总结
优化时,把hive sql当做map reduce程序来读,会有意想不到的惊喜. 理解Hadoop的核心能力,是hive优化的根本.这是这一年来,项目组所有成员宝贵的经验总结. 长期观察hadoo ...
- Hive(六)hive执行过程实例分析与hive优化策略
一.Hive 执行过程实例分析 1.join 对于 join 操作:SELECT pv.pageid, u.age FROM page_view pv JOIN user u ON (pv.useri ...
- Hive优化-大表join大表优化
Hive优化-大表join大表优化 5.大表join大表优化 如果Hive优化实战2中mapjoin中小表dim_seller很大呢?比如超过了1GB大小?这种就是大表join大表的问题.首先引入一个 ...
- Hive优化(整理版)
1. 概述 1.1 hive的特征: 可以通过SQL轻松访问数据的工具,从而实现数据仓库任务,如提取/转换/加载(ETL),报告和数据分析: 它可以使已经存储的数据结构化: 可以直接访问存储在Apac ...
随机推荐
- InfluxDB 的UTC时间问题与简单的持续查询语句
原文:https://blog.csdn.net/Vblegend_2013/article/details/80904275 最近项目中使用了时序数据库InfluxDB 各方性能也是蛮强大的.但是唯 ...
- laravel5.5的任务调度(定时任务)详解(demo)
https://blog.csdn.net/LJFPHP/article/details/80417552 laravel5.5的定时任务详解(demo) 这篇文章写得挺详细的.看了它我基本就会用了 ...
- 在MacOSX系统上的一些工具和问题汇总
Android 模拟器 1. 安装模拟器 点击链接:https://cloud.genymotion.com/page/launchpad/download 需要先注册登录一下. 2.安装Virtua ...
- 研究js特效巩固JavaScript知识
400多个JavaScript特效大全,包含全部源代码和详细代码说明,不可多得 JavaScript实现可以完全自由拖拽的效果,带三个范例 http://www.sharejs.com/show ...
- 固态硬盘使用简要手册——windows平台
第一步,请安装它. 第二步,请关闭磁盘整理功能,如图 详细:控制面板--管理工具--任务计划程序 打开界面,设置如下 图1 第三步:预读(Superfetch)和快速搜索(Windows Search ...
- Jmeter(四十二)Jmeter工作原理
“千举万变,其道一也.不离于宗,谓之天人” ----<荀子·儒效>和<庄子·天下> 作为接口测试工具 Jmeter只是作为发起请求的客户端(可以理解为前端),Jmeter是作为 ...
- keepalived主备节点都配置vip,vip切换异常案例分析
原文地址:http://blog.51cto.com/13599730/2161622 参考地址:https://blog.csdn.net/qq_14940627/article/details/7 ...
- AndroidStudio快捷键使用记录
输入logt+回车 自动增加Tag的定义. private static final String TAG = "MainActivity"; 输入logd+回车 自动增加d级别的 ...
- c#第一周的游戏
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...
- GDB 调试 ---转 比较全的东东
转自 程序人生:http://www.programlife.net/gdb-manual.html Linux 包含了一个叫gdb 的GNU 调试程序.gdb 是一个用来调试C和C++程序的强力调试 ...