一、Join的实现
Map Join就不做描述了,这里主要描述Reduce Join,基本思路是在Map端对多个数据源的数据打上Tag,然后把Join的key当作map输出的key,以保证相同的key可以到达相同的reduce。
我们采取用如下技术来实现:
-
Mutiple inputs
不同数据源的数据的格式可能不同,利用MultipleInputs这个类可以方便地解析和标记tag。
-
Secondary Sort
我们把不同数据源的数据发送到相同的reduce后,最好保证数据可以按照<key,tag>排序,因为如果是乱序的,我们就必须缓存所有数据到内存,这样可能会诱发OOM。
而二次排序刚好可以帮助我们按照key和tag排好序
思考:如果是我实现join,我还会按照数据量排一下序,数据量可以通过hive的CBO优化的直方图拿到,让数据量小的在前面,缓存到内存。不管是left join还是right join,都可以这样做,做shuffle的组合key是<key, tag, size, isBase>