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

时间: 2024-08-01 00:17:31

MapReduce实现二度好友关系的相关文章

简述LBS产品中的好友关系

一.好友关系 LBS产品中的好友关系,相对于传统互联网的好友关系就要复杂的多.主要原因是因为多了一个基于位置的用户关系.这也是这个手机所独有的功能特点了.正如示意图所表示的,LBS产品的好友关系主要是以下三种: (1)真实的好友关系: 通过用户调研,我们得知了使用某产品的好友数量,是决定用户是否使用这个产品的一个重要决定因素,所以,怎样能帮助用户导入更多的好友关系,是起步阶段一个重要的环节.在这里我将提供四种导入好友的方式: 第一种,通过邮箱联系人导入好友,这个不是用户认可度最高的,但是是导入联

位置服务类产品的好友关系和激励机制探索

一.好友关系 LBS产品中的好友关系,比传统互联网的好友关系要复杂很多,主要原因是多了一个基于位置的用户关系,也是手机所独有的功能特点.正如示意图所示,LBS产品的好友关系主要分为以下三种: (1)真实的好友关系: 通过用户调研我们得知使用某产品的好友的数量,是决定用户是否使用该产品的一个重要因素,所以,怎样能帮助用户更多的导入好友关系,是起步阶段一个重要的环节. 在这里我将提供四种导入好友的方式: 第一种,通过邮箱联系人导入好友,这个不是用户认可度最高的,但是是导入联系人最高效的. 第二种,基

微博首创好友关系传播模式,“品牌速递”颠覆传统社交广告

8月4日消息,继粉丝通之后,微博 正式推出全新信息流广告产品" 品牌速递".该产品主要针对品牌类广告主,最大特点在于首创好友关系传播模式,以及更 丰富的微博展示形式.目标用户看到广告内容并产生互动后,相关微博会继续展示给关注该用户的粉丝,帮助广告主更全面多样的与消费者互动沟通交流,这种"传递式"且极具互动沟通的交流形式,极大地增加了品牌 曝光.同时,以近1.5亿微博月活跃用户和近7000万微博日活跃用户为基础,微博"品牌速递"成为移动互联网市场覆

解除IM用户好友关系执行成功,但是没有解除..

问题描述 以下是我写的demo:tok是获取成功的.self是自身好友.target是要删除的好友.执行时success的.但是后台没有删掉这个好友.大神帮忙看下是为什么?function dele(self,target){$.ajax({ type: 'post', contentType: 'application/json', dataType: 'json', async: false, url: 'https://a1.easemob.com/fyl/testhx/users/'+s

《幸福来敲门》收视飘红蒋雯丽孙淳二度相爱难

<幸福来敲门>剧照 <好想好想谈恋爱>剧照 新浪娱乐讯 近日,正在全国热播的情感大戏<幸福来敲门>已经渐渐进入尾声,剧中两位主演蒋雯丽.孙淳的幸福生活也将迎来最终结局.他们二人的爱情能够最终战胜各种世俗偏见和来自内心的心魔,3月9日的大结局牵动着无数观众的内心.众多电视观众和 网友感叹:二人从05年<好想好想谈恋爱>开始就一直在"爱情"道路上磕磕绊绊,经过六年的等待还是要为情困惑不已. 二度携手依旧相爱难 蒋雯丽.孙淳作为内地荧屏的两员收

双汇整体上市遭遇基金二度逼宫 万隆:我们正在推进

让双汇管理层意外的是,原本非常正常的年度股东大会例行议案,却遭到了基金的集体否决. 6月29日晚间,双汇发展(000895.SZ)发布了2009年股东大会决议公告,其中<关于日常关联交易的议案>遭遇否决.而这,已是4个月内基金经理第二次集体行使否决权. "还是希望借此催促他们尽快弄出方案推进整体上市吧."6月30日,一位接近投出反对票的基金的人士告诉记者. 这让目前身在北京的双汇集团董事长万隆感到有些意外和委屈."我们正在积极往前推进(整体上市)."万隆

第一财经周刊:“二度”转向

一家看起来组合完美的创业公司,如何找到自己在产业链中不可或缺的空间? 文|CBN记者 谢灵宁 图|CBN摄影记者 肖南 出身跨国公司高管,有丰富的社会资源和管理经验,面对的是庞大的二手车市场.国外已经有成熟的盈利模式,当然还有风险投资. 这样的组合几乎是任何一个创业者梦寐以求的开局.但45岁的蒋为却发现这样的组合并不是总能奏效. 2006年,蒋为从eBay中国区副总裁的位置上离职.当时eBay有一个独立的二手车拍卖网站-"eBay Motors",在19个大类的业务中自成一体.这个网站

产品及设计总裁二度离职思捷环球高管变动频繁

在遭遇上市20年最差业绩后,近日,思捷环球(00330,HK)内部管理层又出现变动.10月22日晚间,思捷环球发布的公告显示,曾协助公司走过"黄金10年"的产品及设计总裁MelodyHarris-Jensbach将于本月31日起退任.据了解,早在2007年,该名高管就曾离开思捷环球,去年1月才被请回帮助公司转型.对此,有业内人士对<每日经济新闻>记者指出,该高管此前的回归并没有让思捷环球再现辉煌,而且,企业进行战略规划转型往往涉及核心团队的变动,新旧团队不同的理念难以再继续

QQ空间“亲密度”上线 用分数量化好友关系

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 腾讯QQ空间最近低调上线的 "亲密度"功能,首次用分数来量化好友之间的关系,让QQ空间用户能够一目了然看到与不同好友之间的亲密度,带给数亿用户别样的惊喜.大数据俨然是当下最受关注的话题,不过用大数据来解读好友关系,还真是一件新鲜事. 用分数量化好友关系 在人们的印象中,数字是一种理性的表达,不带任何感情色彩,但QQ空间推出