hive mapjoin

hive中的mapjoin

自古美人都是妖i 提交于 2019-12-04 06:45:19
今天遇到一个hive的问题,如下hive sql: select f.a,f.b from A t join B f on ( f.a=t.a and f.ftime=20110802) 该语句中B表有30亿行记录,A表只有100行记录,而且B表中数据倾斜特别严重,有一个key上有15亿行记录,在运行过程中特别的慢,而且在reduece的过程中遇有内存不够而报错。 为了解决用户的这个问题,考虑使用mapjoin,mapjoin的原理: MapJoin简单说就是在Map阶段将小表读入内存,顺序扫描大表完成Join。 上图是Hive MapJoin的原理图,出自Facebook工程师Liyin Tang的一篇介绍Join优化的slice,从图中可以看出MapJoin分为两个阶段: 通过MapReduce Local Task,将小表读入内存,生成HashTableFiles上传至Distributed Cache中,这里会对HashTableFiles进行压缩。 MapReduce Job在Map阶段,每个Mapper从Distributed Cache读取HashTableFiles到内存中,顺序扫描大表,在Map阶段直接进行Join,将数据传递给下一个MapReduce任务。 MAPJION会把小表全部读入内存中,在map阶段直接拿另外一个表的数据和内存中表数据做匹配