概述
1准备工作
1.1项目说明
- 互为推荐关系
- 非好友的两个人之间存在相同好友则互为推荐关系
- 朋友圈两个非好友的人,存在共同好友的人数越多,越值得推荐
- 存在一个共同好友,值为1;存在多个好友,值累加
1.2程序需求
1.2.1需求
- 程序要求,给每个推荐可能认识的人
- 虎威推荐关系值越高,越值得推荐
- 每个用户,推荐值越高的可能认识的人排在前面
1.2.2数据
- 数据使用空格进行分割
- 每行是一个用户以及其对应的好友
- 每行的第一列名字是用户的名字,后面的是其对应的好友
用户 | 好友 | |||
---|---|---|---|---|
xiaoming | laowang | renhua | linzhiling | |
laowang | xiaoming | fengjie | ||
renhua | xiaoming | ligang | fengjie | |
linzhiling | xiaoming | ligang | fengjie | guomeimei |
ligang | renhua | fengjie | linzhiling | |
guomeimei | fengjie | linzhiling | ||
fengjie | renhua | laowang | linzhiling | guomeimei |
1.3在本地创建文本文件(名字任意)
1.4创建testfriend目录并cd到此目录下
1.5将此文件直接拖进node01
2项目实操
2.1在IDEA中导入依赖与插件
- 依赖
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-jobclient</artifactId>
<version>2.9.2</version>
<scope>provided</scope>
</dependency>
</dependencies>
- 插件
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.lee.friends.Friendscount</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
2.2创建类
(1)创建friendsmapper
package com.lee.friends;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;
public class friendsmapper extends Mapper<Object, Text, Text, IntWritable> {
public void map(Object key, Text value, Context context) throws IOException, InterruptedException{
String[] friends = value.toString().split(" ");
for(int i=0; i < friends.length; i++) {
String self = friends[i];
for(int j=i+1; j < friends.length; j++) {
if(i == 0) {
// 直接好友
String directFriend = friends[j];
Text directFriendKey = new Text(sort(self, directFriend));
context.write(directFriendKey, new IntWritable(0));
} else {
// 可能是间接好友
String indirectFriend = friends[j];
Text indirectFriendKey = new Text(sort(self, indirectFriend));
context.write(indirectFriendKey, new IntWritable(1));
}
}
}
}
private String sort(String self, String directFriend) {
//compareToIgnoreCase() 方法用于按字典顺序比较两个字符串,不考虑大小写
if(self.compareToIgnoreCase(directFriend) < 0) {
return directFriend + " " + self;
}
return self + " " + directFriend;
}}
(2)创建friendsreducer
package com.lee.friends;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;
public class friendsreducer extends Reducer<Text, IntWritable, Text, IntWritable> {
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int sum = 0;
boolean isDirectFriend = false;
for(IntWritable value : values) {
if(value.get() == 0) {
isDirectFriend = true;
break;
}
sum = sum + value.get();
}
if(!isDirectFriend) {
context.write(key, new IntWritable(sum));
}
}
}
(3)创建friendscount
package com.lee.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;
import org.apache.hadoop.util.GenericOptionsParser;
public class Friendscount {
public static void main(String[] args) throws Exception{
//获取虚拟机配置信息
Configuration configuration = new Configuration();
//创建Job对象
Job job = Job.getInstance(configuration);
job.setJarByClass(Friendscount.class);
//Map端
job.setMapperClass(friendsmapper.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
//combiner组件
// job.setCombinerClass(FriendsRecommendReduce.class);
//Reduce端
job.setReducerClass(friendsreducer.class);
//文件的输入路径
Path inputPath = new Path("/test/aa.txt");
FileInputFormat.addInputPath(job, inputPath);
//结果的输出路经
Path outputPath = new Path("/test/bb.txt");
//若路径存在则将其删除
if (outputPath.getFileSystem(configuration).exists(outputPath))
outputPath.getFileSystem(configuration).delete(outputPath);
FileOutputFormat.setOutputPath(job, outputPath);
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
注意:在pom.xml中需要指出Friendscount类的具体路径,在类上按ctrl键可以跳转即可。
2.2 在父级pom.xml中,对于其余的module进行注释,方便下一步打包
2.3找到侧面的maven并点击,找到package,对整个Friend项目进行打包
2.4表示完成(如图所示)
3结果与展示
3.1在target目录下会生成一个项目jar包
3.2在xshell开启dfs和yarn
3.3查看根目录下的路径
3.4上传aa.txt文件到test目录
3.5访问http://node01:50070(如图所示)
3.6把jar包直接拖入到Xshell中
3.7输入hadoop jar Friend-1.0-SNAPSHOT.jar /test/aa.txt /out命令运行jar包
3.8在生成的bb.txt文件中查看part-r-00000文件,即可查看最终结果,(如下图所示)
最后
以上就是爱撒娇冰棍为你收集整理的MapReduce课程设计——好友推荐功能1准备工作2项目实操3结果与展示的全部内容,希望文章能够帮你解决MapReduce课程设计——好友推荐功能1准备工作2项目实操3结果与展示所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复