本文主要讲述一下自己在hive中使用map join遇到的一些问题。语言过于直白,请谅解
1.什么是map join?
map join主要是在关联的时候使用,hive开启map join后可以将关联的小表放入内存中去执行,以此来提高脚本的运行速度
2.map join如何设置?
set hive.auto.convert.join=false;
--false表示关闭map join
set hive.auto.convert.join=true;
--true表示开启map join
3.map join可能遇到的问题?
使用map join的时候,由于开启将会把小表加载入内存进行执行,所以可能会出现内存溢出的情况
报错信息可能有:
GC overhead limit exceeded
如果遇到内存溢出的报错,要么增加内存,要么关闭map join
4.map join的部分参数设置
针对内存溢出这个问题,我们可以对放入内存的表的大小进行限定
set hive.auto.convert.join=true;
set hive.mapjoin.smalltable.filesize=1048576;
-- 限制内存大小为1M
但这样需要考虑的一个问题是,如果有多个小表进行关联,那么都放入内存是否会溢出呢?如果会,还是关闭map join的好
5.关于map join的一点小坑
map join虽然很好,但是会有如下问题:
1)map join关联多个小表时,都放入内存,则考虑内存大小需要针对上述小表大小进行累加
2)大表B表map join关联分区小表A表(200M)时,即使限制了A的分区(取10M),但依旧放入内存的大小依旧是A表的原先大小(200M)
言而总之,慎用map join,后续如有理解我会继续更新,谢谢~