hive: join 遇到问题
在表连接时遇到一个问题:
insert overwrite table BF_EVT_CRD_CRT_TRAD2
select BF_EVT_CRD_CRT_TRAD.*, jjkdjk.CUST_NO,BF_AGT_CRD_CRT.OUT_CRD_INSTN_CD
from BF_AGT_CRD_CRT join jjkdjk on (BF_AGT_CRD_CRT.CUST_NO=jjkdjk.pcust_no) join BF_EVT_CRD_CRT_TRAD on (BF_EVT_CRD_CRT_TRAD.CRD_NO= BF_AGT_CRD_CRT.CRD_NO);
该语句中如果大表有30亿行记录,而小表只有100行记录,而且那么大表中数据倾斜特别严重,有一个key上有15亿行记录,在运行过程中特别的慢,而且在reduece的过程中遇有内存不够而报错。
考虑map join 的原理:
MAPJION会把小表全部读入内存中,在map阶段直接拿另外一个表的数据和内存中表数据做匹配,由于在map是进行了join操作,省去了reduce运行的效率也会高很多
解决思路:
BF_AGT_CRD_CRT count(*) 4031974
jjkdjk count(*) 3912676 BF_EVT_CRD_CRT_TRAD count(*) 251512826
采用hint方式启动数据驱动,如:
select f.a,f.b from A t join B f on ( f.a=t.a and f.ftime=20110802)
改为
select /*+ mapjoin(A)*/ f.a,f.b from A t join B f on ( f.a=t.a and f.ftime=20110802)
insert overwrite table BF_EVT_CRD_CRT_TRAD2
select /*+ mapjoin(BF_AGT_CRD_CRT)*/BF_EVT_CRD_CRT_TRAD.*, jjkdjk.CUST_NO,BF_AGT_CRD_CRT.OUT_CRD_INSTN_CD
from BF_AGT_CRD_CRT join jjkdjk on (BF_AGT_CRD_CRT.CUST_NO=jjkdjk.pcust_no) join BF_EVT_CRD_CRT_TRAD on (BF_EVT_CRD_CRT_TRAD.CRD_NO= BF_AGT_CRD_CRT.CRD_NO);
但还是报错。
Total MapReduce jobs = 4
2014-10-22 05:45:06 Starting to launch local task to process map join; maximum memory = 1065484288
2014-10-22 05:45:42 Processing rows: 200000 Hashtable size: 199999 Memory usage: 82761296 percentage: 0.078
2014-10-22 05:45:45 Processing rows: 300000 Hashtable size: 299999 Memory usage: 114515648 percentage: 0.107
2014-10-22 05:45:47 Processing rows: 400000 Hashtable size: 399999 Memory usage: 148324312 percentage: 0.139
.......
2014-10-22 05:46:37 Processing rows: 2400000 Hashtable size: 2399999 Memory usage: 851355056 percentage: 0.799
2014-10-22 05:46:46 Processing rows: 2500000 Hashtable size: 2499999 Memory usage: 888876848 percentage: 0.834
2014-10-22 05:46:47 Processing rows: 2600000 Hashtable size: 2599999 Memory usage: 934695048 percentage: 0.877
2014-10-22 05:46:48 Processing rows: 2700000 Hashtable size: 2699999 Memory usage: 973416544 percentage: 0.914
Execution failed with exit status: 3
Obtaining error information Task failed!
Task ID:
Stage-12 Logs: /tmp/root/hive.log
FAILED: Execution Error, return code 3 from org.apache.hadoop.hive.ql.exec.mr.MapredLocalTask
分析原因是:
任务自动把join装换mapjoin时内存溢出,解决法子:关闭自动装换,11前的版本默认值为false,后面的为true;
所以hive默认配置参数为set hive.auto.convert.join = true;
首先把小的表加入内存,hive自动根据sql,选择使用common join或者map join,导致只针对小表来确定mapreduce个数和运行空间,而大表根本就处理不了。
而hive.mapjoin.smalltable.filesize 默认值是25mb
set mapreduce.map.memory.mb=2049;
set mapreduce.reduce.memory.mb=20495;
set hive.auto.convert.join=false;
insert overwrite table BF_EVT_CRD_CRT_TRAD2
select BF_EVT_CRD_CRT_TRAD.*, jjkdjk.CUST_NO,BF_AGT_CRD_CRT.OUT_CRD_INSTN_CD
from BF_AGT_CRD_CRT join jjkdjk on (BF_AGT_CRD_CRT.CUST_NO=jjkdjk.pcust_no) join BF_EVT_CRD_CRT_TRAD on (BF_EVT_CRD_CRT_TRAD.CRD_NO= BF_AGT_CRD_CRT.CRD_NO);
hive: join 遇到问题的更多相关文章
- Hive JOIN使用详解
转自http://shiyanjun.cn/archives/588.html Hive是基于Hadoop平台的,它提供了类似SQL一样的查询语言HQL.有了Hive,如果使用过SQL语言,并且不理解 ...
- Hive Join
最近被朋友问到有关于Hive Join的问题,保守回答过后,来补充补充知识: Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能. 一.Hi ...
- Hive JOIN的基本操作 及 内部实现
1.HIVE基本操作: [一起学Hive]之十一-Hive中Join的类型和用法 注:HIve不支持非等值连接: 什么是等值连接: //Oracle SQL 不等值连接 //通过不等值连接查找7788 ...
- Hive Join优化
在阐述Hive Join具体的优化方法之前,首先看一下Hive Join的几个重要特点,在实际使用时也可以利用下列特点做相应优化: 1. 只支持等值连接 2. 底层会将写的HQL语句转换为MapRed ...
- Hive——join的使用
Hive--join的使用 hive中常用的join有:inner join.left join .right join .full join.left semi join.cross join.mu ...
- hive join 优化
common join : 即reducer join,瓶颈在shuffle阶段,会产生较大的网络io: map join:即把小表放前面,扫描后放入每个节点的内存,在map阶段进行匹配: 开启map ...
- 转载:几种 hive join 类型简介
作为数据分析中经常进行的join 操作,传统DBMS 数据库已经将各种算法优化到了极致,而对于hadoop 使用的mapreduce 所进行的join 操作,去年开始也是有各种不同的算法论文出现,讨论 ...
- hive join的三种优化方式
原网址:https://blog.csdn.net/liyaohhh/article/details/50697519 hive在实际的应用过程中,大部份分情况都会涉及到不同的表格的连接, 例如在进行 ...
- hive join 优化 --小表join大表
1.小.大表 join 在小表和大表进行join时,将小表放在前边,效率会高.hive会将小表进行缓存. 2.mapjoin 使用mapjoin将小表放入内存,在map端和大表逐一匹配.从而省去red ...
随机推荐
- 优秀的基于VUE移动端UI框架合集
1. vonic 一个基于 vue.js 和 ionic 样式的 UI 框架,用于快速构建移动端单页应用,很简约,是我喜欢的风格 star 2.3k 中文文档 在线预览 2.vux 基于WeUI和Vu ...
- SQL语句-SELECT语句
select语句 Select语句是指从现存的一个或多个表中查看满足条件的数据 Select语句常规用法: 查看表中所有数据 Select * from students; 查看所有的sid和snam ...
- 为什么.Net平台不支持程序集卸载(Assembly.Unload)?
我们知道在.net平台中反射提供了在运行时动态的获得程序或程序集中每一个类型(包括类.结构.委托.接口和枚举等)的成员和成员的信息,从而使得我们开发人员在运行时能够利用这些信息构造和使用对象.我们知道 ...
- java 多维数组遍历
java 多维数组遍历的顺序的性能问题 ps:下图为java多维数组内存分布原理.出自:http://math.hws.edu/javanotes/c7/two-dimensional-array.p ...
- [C#][Newtonsoft.Json] Newtonsoft.Json 序列化时的一些其它用法
Newtonsoft.Json 序列化时的一些其它用法 在进行序列化时我们一般会选择使用匿名类型 new { },或者添加一个新类(包含想输出的所有字段).但不可避免的会出现以下情形:如属性值隐藏(敏 ...
- Python随笔,day1
#python中不存在单个字符的运算,只有字符串函数 >>> s="www.google.com" >>> s 'www.google.com' ...
- 使用hexo搭建个人博客
安装前提 node.js git 如果缺少以上条件,则前往相应的官网下载安装即可.. 安装hexo $ npm install hexo-cli -g 待安装完成后,执行相关命令查看hexo的信息. ...
- 解决苹果电脑(mac)管理员账户变成了普通用户后不能解锁用户与群组的问题
亲们,我先说说前因,然后再说一下解决方法. 前因 今天不知怎么就想把苹果电脑原来的名字给改一下,于是就做了下面的操作(你们不要这样做) 1.系统偏好设置→用户与组群→当前管理员用户→(右键)高级选项 ...
- javase学习小结一
输出格式: int num=12345; System.out.printf("%7d",number);输出结果为:空格空格12345 System.out.println(&q ...
- 小甲鱼OD学习第3讲
这次我们的任务是破解这个过期的软件,效果如图所示 我们通过阅读代码,知道这个程序的执行流程如图中注释所示 观看下图注释所示 这是失败的提示代码 这是成功的提示代码 最后我们可以得出结论,成功破解软件的 ...