版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第11章好友推荐案例分析《大数据技术基础教程》学习目标/Target
了解好友推荐项目需求和目标
掌握项目所需的预备知识实践如何编写MapReduce程序,完成QQ好友推荐操作章节概述/
Summary近十几年间,随着在线社交网络的蓬勃发展,研究人员才开始有机会在大量现实数据的基础上对社交影响力进行建模和分析,并取得了丰硕的研究成果和广泛的应用价值。在这上千万用户的社交群体里,寻找潜在好友进行推荐,成为社交网络分析的关键问题之一。社交网络中的好友是指在社交网络中出现在用户联系人列表中的用户,它是一种广义上的朋友,既可以是Facebook中的好友,也可是新浪微博中的关注用户等。为社交网络用户推荐好友就是帮助用户在社交网络中找到她们感兴趣的用户,进而添加到自己的联系人列表之中,方便进一步的交流及商业应用。本章主要介绍了如何编写MapReduce程序,完成QQ好友推荐操作的相关知识目录/Contents01020304任务需求实验前HDFS平台的准备工作IDEA下建立Maven项目projectFriendRecommend程序实现05运行程序与结果验证任务需求11.111.1任务需求通过mapreduce计算,为每个QQ用户推荐好友。数据集第一列为QQ用户,其他列为该用户的QQ好友。其中xiaoming、laowang、xiaohua、lingling、xiaogang、meimei和xiaolan是选中的7位QQ用户,每位用户后面的人员,是该用户的QQ好友。xiaoming laowang xiaohua linglinglaowang xiaoming xiaolanxiaohua xiaoming xiaogang xiaolanlingling xiaoming xiaogang xiaolan meimeixiaogang xiaohua xiaolan linglingmeimei xiaolan linglingxiaolan xiaohua laowang lingling meimei实验前HDFS平台的准备工作11.211.2实验前HDFS平台的准备工作11.2.1启动Hadoop平台启动Hadoop平台11.2实验前HDFS平台的准备工作11.2.2
实验前数据路径的准备11.2实验前HDFS平台的准备工作11.2.3实验程序每次执行前,运行结果输出路径的准备每次实验程序运行结果会存储在HDFS平台的/root/experiment/output/路径下,所以在程序执行前,该路径不能存在,如果存在,需要进行删除。IDEA下建立Maven项目project11.311.3IDEA下建立Maven项目project1)建立新项目1.打开IDEA工具。2.确定要建立的项目类型11.3IDEA下建立Maven项目project1)建立新项目3.填入工程信息4.确认项目信息,完成项目创建11.3IDEA下建立Maven项目project1)建立新项目5.此时进入IDEA的开发界面。如果在开发界面的上方弹出“TipoftheDay”窗口,点出”Close”按钮,关闭该窗口即可。6.在右下角弹出的对话框中,选择EnableAuto-Import(如未弹出该对话框请忽略此步骤)。7.显示IDEA开发环境的主窗口。11.3IDEA下建立Maven项目project2)配置pom.xml文件11.3IDEA下建立Maven项目project3)查看Hadoop工程的Maven依赖包FriendRecommend程序实现11.411.4FriendRecommend程序实现11.4.1数据准备11.4FriendRecommend程序实现11.4.2编写单表关联的MapReduce程序11.4FriendRecommend程序实现11.4.3建立FirstJob类文件,编写FirstJob类package
experiment;
import
org.apache.hadoop.io.IntWritable;
import
org.apache.hadoop.io.Text;
import
org.apache.hadoop.mapreduce.Mapper;
import
org.apache.hadoop.mapreduce.Reducer;
import
org.apache.hadoop.util.StringUtils;
import
java.io.IOException;
public
class
FirstJob
{
public
static
class
Fof
extends
Text{
public
Fof(){
super();
}
public
Fof(String
a,String
b){
super(getFof(a,
b));
}
/*字符串比较小的放前面*/
public
static
String
getFof(String
a,String
b){
int
r
=pareTo(b);
if(r<0){
return
a+"\t"+b;
}else{
return
b+"\t"+a;
}
}
}
static
class
FofMapper
extends
Mapper<Text,
Text,
Fof,
IntWritable>
{
protected
void
map(Text
key,
Text
value,Context
context)
throws
IOException,
InterruptedException
{
/*获取key的值*/
String
user
=key.toString();
/*字符串分割*/
String[]
friends
=StringUtils.split(value.toString(),
'\t');
/*遍历数据*/
11.4FriendRecommend程序实现11.4.3建立FirstJob类文件,编写FirstJob类
for
(int
i
=
0;
i
<
friends.length;
i++)
{
/*定义变量从数组中取值*/
String
f1
=
friends[i];
/*返回比较后的数据*/
Fof
ofof
=new
Fof(user,
f1);
/*将数据写入context*/
context.write(ofof,
new
IntWritable(0));
/*遍历数据*/
for
(int
j
=
i+1;
j
<
friends.length;
j++)
{
/*定义变量从数组中取值*/
String
f2
=
friends[j];
/*返回比较后的数据*/
Fof
fof
=new
Fof(f1,
f2);
/*将数据写入context*/
context.write(fof,
new
IntWritable(1));
}
}
}
}
static
class
FofReducer
extends
Reducer<Fof,
IntWritable,
Fof,
IntWritable>
{
protected
void
reduce(Fof
arg0,
Iterable<IntWritable>
arg1,Context
arg2)
throws
IOException,
InterruptedException
{
/*初始化变量*/
int
sum
=0;
boolean
f
=true;
/*遍历数据,计算求和*/
for(IntWritable
i:
arg1){
if(i.get()==0){
f=false;
break;
}else{
sum=sum+i.get();
}
}
if(f){
/*将数据写入context*/
arg2.write(arg0,
new
IntWritable(sum));
}
}
}
}
11.4FriendRecommend程序实现11.4.4建立SecondJob类文件,编写SecondJob类
package
experiment;
import
org.apache.hadoop.io.Text;
import
org.apache.hadoop.io.WritableComparable;
import
org.apache.hadoop.io.WritableComparator;
import
org.apache.hadoop.mapreduce.Mapper;
import
org.apache.hadoop.mapreduce.Reducer;
import
org.apache.hadoop.util.StringUtils;
import
java.io.DataInput;
import
java.io.DataOutput;
import
java.io.IOException;
public
class
SecondJob
{
static
class
SortMapper
extends
Mapper<Text,
Text,
User,
User>
{
protected
void
map(Text
key,
Text
value,
Context
context)
throws
IOException,
InterruptedException
{
/*获取value的值并进行数据分割*/
String[]
args=StringUtils.split(value.toString(),'\t');
/*定义变量并赋值*/
String
other=args[0];
/*数据类型转换*/
int
friendsCount
=Integer.parseInt(args[1]);
/*将数据写入context*/
context.write(new
User(key.toString(),friendsCount),
new
User(other,friendsCount));
context.write(new
User(other,friendsCount),
new
User(key.toString(),friendsCount));
}
}
static
class
SortReducer
extends
Reducer<User,
User,
Text,
Text>
{
protected
void
reduce(User
arg0,
Iterable<User>
arg1,
Context
arg2)
throws
IOException,
InterruptedException
{
/*定义变量并赋值*/
String
user
=arg0.getUname();
StringBuffer
sb
=new
StringBuffer();
/*遍历数据进行字符串拼接*/
for(User
u:
arg1
){
sb.append(u.getUname()+":"+u.getFriendsCount());
sb.append(",");
}
11.4FriendRecommend程序实现11.4.4建立SecondJob类文件,编写SecondJob类
/*键值对数据写入*/
arg2.write(new
Text(user),
new
Text(sb.toString()));
}
}
public
static
class
User
implements
WritableComparable<User>
{
private
String
uname;
private
int
friendsCount;
public
String
getUname()
{
return
uname;
}
public
void
setUname(String
uname)
{
this.uname
=
uname;
}
public
int
getFriendsCount()
{
return
friendsCount;
}
public
void
setFriendsCount(int
friendsCount)
{
this.friendsCount
=
friendsCount;
}
public
User()
{
}
public
User(String
uname,
int
friendsCount)
{
this.uname
=
uname;
this.friendsCount
=
friendsCount;
}
/*数据序列化*/
public
void
write(DataOutput
out)
throws
IOException
{
out.writeUTF(uname);
out.writeInt(friendsCount);
}
/*数据反序列换*/
public
void
readFields(DataInput
in)
throws
IOException
{
this.uname
=
in.readUTF();
this.friendsCount
=
in.readInt();
}
11.4FriendRecommend程序实现11.4.4建立SecondJob类文件,编写SecondJob类
/*数据对比*/
public
int
compareTo(User
o)
{
int
result
=
this.pareTo(o.getUname());
if
(result
==
0)
{
return
Ipare(this.friendsCount,
o.getFriendsCount());
}
return
result;
}
}
public
static
class
FoFSort
extends
WritableComparator
{
public
FoFSort()
{
super(User.class,true);
}
/*数据进行比较排序*/
public
int
compare(WritableComparable
a,
WritableComparable
b)
{
User
u1
=(User)
a;
User
u2=(User)
b;
int
result
=u1.getUname().compareTo(u2.getUname());
if(result==0){
return
-Ipare(u1.getFriendsCount(),
u2.getFriendsCount());
}
return
result;
}
}
public
static
class
FoFGroup
extends
WritableComparator{
public
FoFGroup()
{
super(User.class,true);
}
/*数据比较*/
public
int
compare(WritableComparable
a,
WritableComparable
b)
{
User
u1
=(User)
a;
User
u2=(User)
b;
return
u1.getUname().compareTo(u2.getUname());
}
}
}
11.4FriendRecommend程序实现11.4.5建立Run类文件,编写Run类。packageexperiment;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.FileSystem;importorg.apache.hadoop.fs.Path;importorg.apache.hadoop.io.IntWritable;importorg.apache.hadoop.mapreduce.Job;importorg.apache.hadoop.mapreduce.lib.input.FileInputFormat;importorg.apache.hadoop.mapreduce.lib.input.KeyValueTextInputFormat;importorg.apache.hadoop.mapreduce.lib.output.FileOutputFormat;publicclassRun{publicstaticvoidmain(String[]args){/*创建配置对象并设置属性*/Configurationconfig=newConfiguration();config.set("fs.defaultFS","hdfs://master:9000");/*作业1成功运行后,运行作业2*/if(run1(config)){run2(config);}
}publicstaticbooleanrun1(Configurationconfig){try{/*获取文件系统*/FileSystemfs=FileSystem.get(config);/*获取作业*/Jobjob=Job.getInstance(config);/*设置jar包源*/job.setJarByClass(Run.class);/*设置作业名称*/job.setJobName("friend");/*指定作业Mapper类*/job.setMapperClass(FirstJob.FofMapper.class);/*指定作业Reducer类*/job.setReducerClass(FirstJob.FofReducer.class);/*设置作业输出数据的键类*/job.setMapOutputKeyClass(FirstJob.Fof.class);/*设置作业输出数据的值类*/job.setMapOutputValueClass(IntWritable.class);/*设置作业的输入格式类*/job.setInputFormatClass(KeyValueTextInputFormat.class);
11.4FriendRecommend程序实现11.4.5建立Run类文件,编写Run类。publicstaticvoidrun2(Configurationconfig){try{/*获取文件系统*/FileSystemfs=FileSystem.get(config);/*获取作业*/Jobjob=Job.getInstance(config);/*设置jar包源*/job.setJarByClass(Run.class);/*设置作业名称*/job.setJobName("fof2");/*指定作业Mapper类*/job.setMapperClass(SecondJob.SortMapper.class);/*指定作业Reducer类*/job.setReducerClass(SecondJob.SortReducer.class);/*指定作业排序*/job.setSortComparatorClass(SecondJob.FoFSort.class);job.setGroupingComparatorClass(SecondJob.FoFGroup.class);/*设置作业输出数据的键类*/job.setMapOutputKeyClass(SecondJob.User.class);/*设置作业输出数据的值类*/job.setMapOutputValueClass(SecondJob.User.class);/*设置作业输入路径*/FileInputFormat.addInputPath(job,newPath("/root/experiment/datas/"));/*定义输出路径*/Pathoutpath=newPath("/root/experiment/output/output1");/*路径存在则删除路径*/if(fs.exists(outpath)){fs.delete(outpath,true);}/*设置作业输出路径*/FileOutputFormat.setOutputPath(job,outpath);/*提交作业获取返回值
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 家长学校教育工作总结-家长学校工作汇报
- 动画片《赞鸟历险记》观后感范文5篇
- 小学生抗疫爱国心报国情强国志征文作文5篇
- 埃及王子观后感1500字作文五篇
- 部编版四年级下册道德与法治期末测试卷及参考答案【满分必刷】
- 部编版四年级下册道德与法治期末测试卷带答案(培优b卷)
- 《平凡的世界》读后感心得10篇
- 小学数学六年级下册 期末测试卷及参考答案(满分必刷)
- 人教版六年级下册数学期末测试卷含答案(综合题)
- 人教版六年级下册数学期末测试卷附参考答案(轻巧夺冠)
- 阅读书目:《给教师的60条法律建议》
- 化学电源设计与制造工艺学教学大纲
- 通用横版企业报价单模板
- 04环境因素识别与评价表钻井-ok
- CNC绕线机简易调机步骤
- 110kV变电站主接线一次接线图(共4页)
- PCR引物设计原理
- 农村中学利用地域文化资源激活学校拓展性课程研发思路的有效性分析
- 2022年广东高考数学试题及答案
- (完整版)医疗机构快速检测(POCT)管理制度及法律规范
- 最新出口木制品及木制家具检验监管
评论
0/150
提交评论