我是靠谱客的博主 爱撒娇冰棍,最近开发中收集的这篇文章主要介绍MapReduce课程设计——好友推荐功能1准备工作2项目实操3结果与展示,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1准备工作

1.1项目说明

  • 互为推荐关系
  • 非好友的两个人之间存在相同好友则互为推荐关系
  • 朋友圈两个非好友的人,存在共同好友的人数越多,越值得推荐
  • 存在一个共同好友,值为1;存在多个好友,值累加

1.2程序需求

1.2.1需求

  • 程序要求,给每个推荐可能认识的人
  • 虎威推荐关系值越高,越值得推荐
  • 每个用户,推荐值越高的可能认识的人排在前面

1.2.2数据

  • 数据使用空格进行分割
  • 每行是一个用户以及其对应的好友
  • 每行的第一列名字是用户的名字,后面的是其对应的好友
用户及其好友
用户好友
xiaominglaowangrenhualinzhiling
laowangxiaomingfengjie
renhuaxiaomingligangfengjie
linzhilingxiaomingligangfengjieguomeimei
ligangrenhuafengjielinzhiling
guomeimeifengjielinzhiling
fengjierenhualaowanglinzhilingguomeimei

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结果与展示所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部