简介
给定一个包含上千万用户的社交网络,我们会实现一个MapReduce、Spark程序,在所有用户对中找出“共同好友”。
令
{ U 1 , U 2 , . . . , U n } \{U_1,U_2,...,U_n\} { U1,U2,...,Un}
为包含一个所有用户列表的集合。我们的目标是为每个 ( U i , U j ) (U_i,U_j) (Ui,Uj)对 i ≠ j i\ne j i=j找出共同好友。
我们本章提出3个解决方案:
-
MapReduce/Hadoop解决方案,使用基本数据类型
-
Spark解决方案,使用弹性数据集RDD。
1、共同好友的概念
如今大多数社交网络网站都提供了有关的服务,可以帮助我们与好友共享信息、图片和视频。
有些网站树森之还提供了视频聊天服务,帮助你与好友保持联系。根据定义,“好友”是指你认识、喜欢和信任的一个人。
比如我们QQ好友列表,这个列表上好友关系都是双向的。如果我是你的好友,那么你也是我的好友,注意这个特点,我们的程序中运用了这个特点,将这种关系进行合并求解交集,即可得到A,B的共同好友。
有很多办法可以找到共同好友:
- 使用缓存策略,将共同好友保存在一个缓存中(redis、memcached)
- 使用Mapreduce离线计算,每隔一段时间(例如一天)计算一次每个人的共同好友并存储这些结果;
1、POJO共同好友解决方案
令 { A 1 , A 2 , . . . A n } \{A_1,A_2,...A_n\} {
A1,A2,...An}是user_1的好友集合, { B 1 , B 2 , . . . , B n } \{B_1,B_2,...,B_n\} {
B1,B2,...,Bn}是user_2的好友集合,那么,user_1,user_2的共同好友集合就可以定义为
A ∩ B A \cap B A∩B
即两个集合的交集。
POJO的简单实现如下所示:
package com.sunrun.movieshow.algorithm.friend;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class POJOFriend {
public static Set<String> intersection(Set<String> A, Set<String> B){
if(A == null || B == null){
return null;
}
if(A.isEmpty() || B. isEmpty()