1、MapReduce Join 介绍
在各种实际业务场景中,按照某个关键字对两份数据进行连接是非常常见的。如果两份数据 都比较小,那么可以直接在内存中完成连接。如果是大数据量的呢?显然,在内存中进行连 接会发生 OOM。MapReduce 可以用来解决大数据量的链接
MapReduce 的 Join 操作主要分两类:MapJoin 和 ReduceJoin
先看 ReduceJoin:
- map 阶段,两份数据 data1 和 data2 会被 map 分别读入,解析成以链接字段为 key 以查 询字段为 value 的 key-value 对,并标明数据来源是 data1 还是 data2。
- reduce 阶段,reducetask 会接收来自 data1 和 data2 的相同 key 的数据,在 reduce 端进 行乘积链接,最直接的影响是很消耗内存,导致 OOM
再看 MapJoin: MapJoin 适用于有一份数据较小的连接情况。做法是直接把该小份数据直接全部加载到内存 当中,按链接关键字建立索引。然后大份数据就作为 MapTask 的输入,对 map()方法的每次 输入都去内存当中直接去匹配连接。然后把连接结果按 key 输出,这种方法要使用 hadoop 中的 DistributedCache 把小份数据分布到各个计算节点,每个 maptask 执行任务的节点都需 要加载该数据到内存,并且按连接关键字建立索引
2、需求
现有两份数据 movies.dat 和 ratings.dat 数据样式分别为:
Movies.dat
字段含义:movieid, moviename, movietype
Ratings.dat
字段含义:userid, movieid, rate, timestamp
Select * from movie a join ratings b on a.movieid = b.movieid
现要求对两表进行连接,要求输出最终的结果有以上六个字段: movieid, userid, rate, moviename, movietype, timestamp
3、实现
第一步:封装 MovieRate,方便数据的排序和序列化