MapReduce实现二度好友关系
一、问题定义
我在网上找了些,关于二度人脉算法的实现,大部分无非是通过广度搜索算法来查找,犹豫深度已经明确了2以内;这个算法其实很简单,第一步找到你关注的人;第二步找到这些人关注的人,最后找出第二步结果中出现频率最高的一个或多个人(频率这块没完成),即完成。
但如果有千万级别的用户,那在运算时,就肯定会把这些用户的follow 关系放到内存中,计算的时候依次查找;先说明下我没有明确的诊断对比,这样做的效果一定没 基于hadoop实现的好;只是自己,想用hadoop实现下,最近也在学;若有不足的地方还请指点。
任务是求其其中的二度人脉、潜在好友,也就是如下图:
比如I认识C、G、H,但C不认识G,那么C-G就是一对潜在好友,但G-H早就认识了,因此不算为潜在好友。
那么一个关键问题是如何输入输入。
首先是五项五环图,可以看出共有13条边,那么输入数据也有13条就够了,比如说先输入AB,那么轮到b时候就不输入BA了,级变速如也没关系,因为会去重。
二、原理分析
首先,我们进行第一个MapReduce,同样是一个输入行,产生一对互逆的关系,压入context,例如Tom Lucy这个输入行就在Map阶段搞出Tom Lucy-Lucy Tom这样的互逆关系。之后Map-reduce会自动对context中相同的key合并在一起。例如由于存在Tom Lucy、Tom Jack,显然会产生一个Tom:{Lucy,Jack},这是Reduce阶段以开始的键值对。这个键值对相当于Tom所认识的人。先进行如下的输出,潜在好友显然会在{Lucy,Jack}这个Tom所认识的人产生,对这个数组做笛卡尔乘积,形成关系:{<Lucy,Lucy>,<Jack,Jack>,<Lucy,Jack>,<Jack,Lucy>},也就是<Lucy,Lucy>这类无意义的剔除,<Lucy,Jack>,<Jack,Lucy>认定为一个关系,将剩余关系进行如下的输出。
不过计算笛卡尔积就像双重for对同一个数组,重复计算了一半,怎么减少了,我程序里是HashSet,第二重如何从第一宠Set的iterator哪里开始呢。
三、代码
3.1 Mapper
- package friends;
- import java.io.IOException;
- import java.util.StringTokenizer;
- import org.apache.hadoop.io.LongWritable;
- import org.apache.hadoop.io.Text;
- import org.apache.hadoop.mapreduce.Mapper;
- public class Deg2FriendMapper extends Mapper<LongWritable, Text, Text, Text> {
- public void map(LongWritable key, Text value, Context context)
- throws IOException, InterruptedException {
- String line = value.toString();
- // "\t"表示制表符
- //StringTokenizer st = new StringTokenizer(line,",");
- //while(st.hasMoreTokens())
- //用while循环的时候是一行有很多才需要
- String[] ss = line.split(",");
- context.write(new Text(ss[0]), new Text(ss[1]));
- context.write(new Text(ss[1]), new Text(ss[0]));
- }
- }
3.2 Reducer
- package friends;
- import java.io.IOException;
- import java.util.HashSet;
- import java.util.Iterator;
- import java.util.Set;
- import org.apache.hadoop.io.Text;
- import org.apache.hadoop.mapreduce.Reducer;
- public class Deg2Reducer extends Reducer<Text, Text, Text, Text> {
- public void reduce(Text key, Iterable<Text> value, Context context)
- throws IOException, InterruptedException {
- // process values
- //首先是key相同的合并,同时取出value笛卡尔积之后的重复关系
- Set<String> set = new HashSet<String>();
- for (Text t : value) {//相同key合并
- //但是为什么用HashSet,因为Map里面谢了反响关系,比如 对于A节点,谢了AB,BA,
- //对于B节点,谢了BA,AB,那么A开头的有两次AB,去重,
- //为什么要for循环 因为A可能有很多朋友
- //
- set.add(t.toString());
- }
- if(set.size()>=2) {//否则说明只有一度好友关系
- //对value的值做笛卡尔积
- Iterator<String> iter = set.iterator();
- while(iter.hasNext()) {
- String name = iter.next();
- //iterator写成for循环的话 第三个条件没有 否则for内娶不到元素
- for(Iterator<String> iter2 = set.iterator();iter2.hasNext();) {
- String name2 = iter2.next();
- if(!name2.equals(name)) {//相同元素不算关系
- context.write(new Text(name), new Text(name2));
- }
- }
- }
- }
- }
- }
3.2 Main
- package friends;
- import org.apache.hadoop.conf.Configuration;
- import org.apache.hadoop.fs.Path;
- import org.apache.hadoop.io.IntWritable;
- import org.apache.hadoop.io.Text;
- import org.apache.hadoop.mapreduce.Job;
- import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
- import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
- public class Deg2Main {
- public static void main(String[] args) throws Exception{
- // TODO Auto-generated method stub
- Configuration conf = new Configuration(); //对应于mapred-site.xml
- Job job = new Job(conf,"Deg2MR");
- job.setJarByClass(Deg2Main.class);
- job.setMapperClass(Deg2FriendMapper.class);
- job.setReducerClass(Deg2Reducer.class);
- job.setOutputKeyClass(Text.class);
- job.setOutputValueClass(Text.class);
- job.setNumReduceTasks(1);
- //"/in"解析不了 提示文件不存在 因为把他们认为是本地文件了 因为有个 file:/
- FileInputFormat.addInputPath(job, new Path("hdfs://192.168.58.180:8020/MLTest/Deg2MR/Deg2MR.txt"));
- //输出文件不能存在
- FileOutputFormat.setOutputPath(job, new Path("hdfs://192.168.58.180:8020/MLTest/Deg2MR/Deg2Out"));
- System.exit(job.waitForCompletion(true) ? 0 : 1);
- }
- }
3.4 日志
- m:org.apache.hadoop.mapreduce.Job.updateStatus(Job.java:323)
- INFO - Job job_local1127799899_0001 completed successfully
- DEBUG - PrivilegedAction as:hxsyl (auth:SIMPLE) from:org.apache.hadoop.mapreduce.Job.getCounters(Job.java:765)
- INFO - Counters: 38
- File System Counters
- FILE: Number of bytes read=740
- FILE: Number of bytes written=509736
- FILE: Number of read operations=0
- FILE: Number of large read operations=0
- FILE: Number of write operations=0
- HDFS: Number of bytes read=132
- HDFS: Number of bytes written=206
- HDFS: Number of read operations=13
- HDFS: Number of large read operations=0
- HDFS: Number of write operations=4
- Map-Reduce Framework
- Map input records=13
- Map output records=26
- Map output bytes=106
- Map output materialized bytes=164
- Input split bytes=116
- Combine input records=0
- Combine output records=0
- Reduce input groups=10
- Reduce shuffle bytes=164
- Reduce input records=26
- Reduce output records=50
- Spilled Records=52
- Shuffled Maps =1
- Failed Shuffles=0
- Merged Map outputs=1
- GC time elapsed (ms)=3
- CPU time spent (ms)=0
- Physical memory (bytes) snapshot=0
- Virtual memory (bytes) snapshot=0
- Total committed heap usage (bytes)=456130560
- Shuffle Errors
- BAD_ID=0
- CONNECTION=0
- IO_ERROR=0
- WRONG_LENGTH=0
- WRONG_MAP=0
- WRONG_REDUCE=0
- File Input Format Counters
- Bytes Read=66
- File Output Format Counters
- Bytes Written=206
- DEBUG - PrivilegedAction as:hxsyl (auth:SIMPLE) from:org.apache.hadoop.mapreduce.Job.updateStatus(Job.java:323)
- DEBUG - stopping client from cache: org.apache.hadoop.ipc.Client@37afeb11
- DEBUG - removing client from cache: org.apache.hadoop.ipc.Client@37afeb11
- DEBUG - stopping actual client because no more references remain: org.apache.hadoop.ipc.Client@37afeb11
- DEBUG - Stopping client
- DEBUG - IPC Client (521081105) connection to /192.168.58.180:8020 from hxsyl: closed
- DEBUG - IPC Client (521081105) connection to /192.168.58.180:8020 from hxsyl: stopped, remaining connections 0
3.5 输出
- B H
- H B
- A C
- C A
- B D
- B F
- B I
- D B
- D F
- D I
- F B
- F D
- F I
- I B
- I D
- I F
- C E
- C F
- E C
- E F
- F C
- F E
- D F
- F D
- C D
- C E
- C G
- D C
- D E
- D G
- E C
- E D
- E G
- G C
- G D
- G E
- F H
- F I
- H F
- H I
- I F
- I H
- A G
- A I
- G A
- G I
- I A
- I G
- G H
- H G
四、思考
4.1 单向
类似父子关系找爷孙关系,或者是关注关系或者follow关系,那么Mapper阶段不相互存入就可。
4.2 你最受欢迎的二度人脉
简单描述:即你关注的人中有N个人同时都关注了 XXX 。
4.3 Set遍历
双重iterator便利HashSet,第二重如何从第一宠Set的iterator哪里开始呢。这样可以少算一倍,应该可以吧set转为数数组吧。
不过这样也好,A是B的二度,那么B也是A的二度....
4.4 另外
一开始reducer里写错了,set.add(toString.toString()),竟然没报错,没有toString这个变量。然后日志是reducer阶段没有任何写入。
五、参考文献
http://blog.csdn.net/yongh701/article/details/50630498
http://blog.csdn.net/u013926113/article/details/51539306
https://my.oschina.net/BreathL/blog/75112
MapReduce实现二度好友关系的更多相关文章
- 使用MapReduce实现二度人脉搜索算法
一,背景介绍 在新浪微博.人人网等社交网站上,为了使用户在网络上认识更多的朋友,社交网站往往提供类似“你可能感兴趣的人”.“间接关注推荐”等好友推荐的功能,其中就包含了二度人脉算法. 二,算法实现 原 ...
- MapReduce案例二:好友推荐
1.需求 推荐好友的好友 图1: 2.解决思路 3.代码 3.1MyFoF类代码 说明: 该类定义了所加载的配置,以及执行的map,reduce程序所需要加载运行的类 package com.hado ...
- Hadoop MapReduce实现人员二度关系运算
1.一度人脉:双方直接是好友 2.二度人脉:双方有一个以上共同的好友,这时朋友网可以计算出你们有几个共同的好友并且呈现数字给你.你们的关系是: 你->朋友->陌生人 3.三度人脉:即你朋友 ...
- hadoop计算二度人脉关系推荐好友
https://www.jianshu.com/p/8707cd015ba1 问题描述: 以下是qq好友关系,进行好友推荐,比如:老王和二狗是好友 , 二狗和春子以及花朵是好友,那么老王和花朵 或者老 ...
- 基于Spark GraphX计算二度关系
关系计算问题描述 二度关系是指用户与用户通过关注者为桥梁发现到的关注者之间的关系.目前微博通过二度关系实现了潜在用户的推荐.用户的一度关系包含了关注.好友两种类型,二度关系则得到关注的关注.关注的好友 ...
- Spark 计算人员二度关系
1.一度人脉:双方直接是好友 2.二度人脉:双方有一个以上共同的好友,这时朋友网可以计算出你们有几个共同的好友并且呈现数字给你.你们的关系是: 你->朋友->陌生人 3.三度人脉:即你朋友 ...
- 依据二度人脉推荐好友sql
friend表结构 DROP TABLE IF EXISTS FRIEND; create table friend( uid bigint not null comment ' ...
- 海量数据的二度人脉挖掘算法(Hadoop 实现)
最近做了一个项目,要求找出二度人脉的一些关系,就好似新浪微博的“你可能感兴趣的人” 中,间接关注推荐:简单描述:即你关注的人中有N个人同时都关注了 XXX . 在程序的实现上,其实我们要找的是:若 U ...
- python 全栈开发,Day132(玩具管理页面,控制玩具通讯录,基于请求的好友关系建立)
先下载github代码,下面的操作,都是基于这个版本来的! https://github.com/987334176/Intelligent_toy/archive/v1.5.zip 注意:由于涉及到 ...
随机推荐
- [转]PHP 下使用 ZeroMQ 和 protobuf
FROM : http://www.68idc.cn/help/makewebs/php/20150118175432.html 前言 这个记录总的来说分两部分: 搭建环境. 简单使用教程. 搭建环境 ...
- C10K 问题引发的技术变革
C10K 问题引发的技术变革 http://rango.swoole.com/archives/381
- 二:【nopcommerce系列】Nop的文件结构,引用关系。如何编译打包部署等
如果,你还没先看第一篇,先看看 一:[nopcommerce系列]Nop整体架构的简单介绍,在看nop代码之前,你需要懂哪些东西 如果你确定你已经看完了第一篇,并且真的理解 mvc.和autofac, ...
- 重建中国.NET生态系统
Neuzilla官方微信公众号:搜 架构师联盟 或 neuzilla 我是.NET铁杆粉丝,所以如果你要在评论里跟我撕逼.NET怎么怎么烂,Java.C++.PHP.JavaScript怎么怎么好,我 ...
- 【分布式协调器】Paxos的工程实现-cocklebur简介(一)
初识分布式协调器 分布式协调器的“协调”二字让人摸不到头脑,怎么就协调了,用的着协调吗?实际上这个东西在之前就是为了提供分布式锁服务而设计的,伟大的google公司发明了chubby,雅虎随后也推出了 ...
- 理解Android虚拟机体系结构
1 什么是Dalvik虚拟机 Dalvik是Google公司自己设计用于Android平台的Java虚拟机,它是Android平台的重要组成部分,支持dex格式(Dalvik Executable)的 ...
- 理解IEnumerator+IEnumerable这种接口思想
前言 本文不想过多篇幅来介绍IEnumerator和IEnumerable这两个接口的具体说明,只是把它作一个例子作引言而已,本文将根据自己的理解来描述微软为何要这样设计这种关联风格的接口.这种风格的 ...
- Android实现滑动刻度尺效果,选择身高体重和生日
刻度尺效果虽然看起来很美,我个人认为很不实用,即使再不实用,也有用的,鉴于群里成员对我的苦苦哀求,我就分享一个他用不到的,横屏滑动刻度尺,因为他需要竖屏的,哈哈…… 最近群里的开发人员咨询怎样实现刻度 ...
- LiveSDK初始化/登录时失败的解决办法
环境描述 Windows 8.1+VS 2013 Update3+Live SDK 5.6 Metro风格的程序,集成LIVE认证 问题描述 如下图,提示Null Reference的异常. 解决办法 ...
- 服务链(Service Chaining,or Service Function Chaining,SFC,功能服务链)
Software-configured service chaining provides the capability to dynamically include best-of-b ...