【Hadoop学习之十】MapReduce案例分析二-好友推荐

环境
  虚拟机:VMware 10
  Linux版本:CentOS-6.5-x86_64
  客户端:Xshell4
  FTP:Xftp4
  jdk8
  hadoop-3.1.1

最应该推荐的好友TopN,如何排名?

tom hello hadoop cat
world hadoop hello hive
cat tom hive
mr hive hello
hive cat hadoop world hello mr
hadoop tom hive world
hello tom world hive mr
package test.mr.fof;

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 MyFOF {

    /**
     * 最应该推荐的好友TopN,如何排名?

     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {

        Configuration conf = new Configuration(true);
        String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
        conf.set("sleep", otherArgs[2]);

        Job job = Job.getInstance(conf,"FOF");
        job.setJarByClass(MyFOF.class);

        //Map
        job.setMapperClass(FMapper.class);
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);

        //Reduce
        job.setReducerClass(FReducer.class);

        //HDFS 输入路径
        Path input = new Path(otherArgs[0]);
        FileInputFormat.addInputPath(job, input );
        //HDFS 输出路径
        Path output = new Path(otherArgs[1]);
        if(output.getFileSystem(conf).exists(output)){
            output.getFileSystem(conf).delete(output,true);
        }
        FileOutputFormat.setOutputPath(job, output );

        System.exit(job.waitForCompletion(true) ? 0 :1);
    }
//    tom hello hadoop cat
//    world hadoop hello hive
//    cat tom hive
//    mr hive hello
//    hive cat hadoop world hello mr
//    hadoop tom hive world
//    hello tom world hive mr

}
package test.mr.fof;

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.util.StringUtils;

public class FMapper extends Mapper<LongWritable, Text, Text, IntWritable>{

    Text mkey= new Text();
    IntWritable mval = new IntWritable();

    @Override
    protected void map(LongWritable key, Text value,Context context)
            throws IOException, InterruptedException {

        //value: 0-直接关系  1-间接关系
        //tom       hello hadoop cat   :   hello:hello  1
        //hello     tom world hive mr      hello:hello  0

        String[] strs = StringUtils.split(value.toString(), ‘ ‘);

        String user=strs[0];
        String user01=null;
        for(int i=1;i<strs.length;i++){
            //与好友清单中好友属于直接关系
            mkey.set(fof(strs[0],strs[i]));
            mval.set(0);
            context.write(mkey, mval);  

            for (int j = i+1; j < strs.length; j++) {
                Thread.sleep(context.getConfiguration().getInt("sleep", 0));
                //好友列表内 成员之间是间接关系
                mkey.set(fof(strs[i],strs[j]));
                mval.set(1);
                context.write(mkey, mval);
            }
        }
    }

    public static String fof(String str1  , String str2){

        if(str1.compareTo(str2) > 0){
            //hello,hadoop
            return str2+":"+str1;
        }
        //hadoop,hello
        return str1+":"+str2;
    }

}
package test.mr.fof;

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

public class FReducer  extends  Reducer<Text, IntWritable, Text, Text> {

    Text rval = new Text();
    @Override
    protected void reduce(Text key, Iterable<IntWritable> vals, Context context)
            throws IOException, InterruptedException
    {
        //是简单的好友列表的差集吗?
        //最应该推荐的好友TopN,如何排名?

        //hadoop:hello  1
        //hadoop:hello  0
        //hadoop:hello  1
        //hadoop:hello  1
        int sum=0;
        int flg=0;
        for (IntWritable v : vals)
        {
            //0为直接关系
            if(v.get()==0){
                //hadoop:hello  0
                flg=1;
            }
            sum += v.get();
        }

        //只有间接关系才会被输出
        if(flg==0){
            rval.set(sum+"");
            context.write(key, rval);
        }
    }
}

原文地址:https://www.cnblogs.com/cac2020/p/10308274.html

时间: 2024-11-05 06:27:54

【Hadoop学习之十】MapReduce案例分析二-好友推荐的相关文章

hadoop 学习笔记:mapreduce框架详解

hadoop 学习笔记:mapreduce框架详解 开始聊mapreduce,mapreduce是hadoop的计算框架,我 学hadoop是从hive开始入手,再到hdfs,当我学习hdfs时候,就感觉到hdfs和mapreduce关系的紧密.这个可能是我做技术研究的 思路有关,我开始学习某一套技术总是想着这套技术到底能干什么,只有当我真正理解了这套技术解决了什么问题时候,我后续的学习就能逐步的加快,而学习 hdfs时候我就发现,要理解hadoop框架的意义,hdfs和mapreduce是密不

Hadoop学习笔记—20.网站日志分析项目案例(二)数据清洗

网站日志分析项目案例(一)项目介绍:http://www.cnblogs.com/edisonchou/p/4449082.html 网站日志分析项目案例(二)数据清洗:http://www.cnblogs.com/edisonchou/p/4458219.html 一.数据情况分析 1.1 数据情况回顾 该论坛数据有两部分: (1)历史数据约56GB,统计到2012-05-29.这也说明,在2012-05-29之前,日志文件都在一个文件里边,采用了追加写入的方式. (2)自2013-05-30

Hadoop学习笔记—20.网站日志分析项目案例(三)统计分析

网站日志分析项目案例(一)项目介绍:http://www.cnblogs.com/edisonchou/p/4449082.html 网站日志分析项目案例(二)数据清洗:http://www.cnblogs.com/edisonchou/p/4458219.html 网站日志分析项目案例(三)统计分析:当前页面 一.借助Hive进行统计 1.1 准备工作:建立分区表 为了能够借助Hive进行统计分析,首先我们需要将清洗后的数据存入Hive中,那么我们需要先建立一张表.这里我们选择分区表,以日期作

[0012] Hadoop 版hello word mapreduce wordcount 运行(二)

目的: 学习Hadoop mapreduce 开发环境eclipse windows下的搭建 环境: Winows 7 64 eclipse,直接运行mapreduce 到服务器,结果输出到eclipse Hadoop2.6.4环境 准备: Hadoop2.6.4的源码包 相关: [0004] Hadoop 版hello word mapreduce wordcount 运行 [0011] windows 下 eclipse 开发 hdfs程序样例 (三) [0008] Windows 7 下

Hadoop学习三十二:Win7下无法提交MapReduce Job到集群环境

一. 对hadoop eclipse plugin认识不足 http://zy19982004.iteye.com/blog/2024467曾经说到我最hadoop eclipse plugin作用的认识.但事实上我犯了一个错误,Win7 Eclipse里的MyWordCount程序一直在本地运行,没有提交到集群环境上运行(查看192.168.1.200:50030)没有这个Job.运行方式分为两种,右键Run As Java Application Run on Hadoop 如果说Run A

Hadoop学习笔记—20.网站日志分析项目案例(一)项目介绍

一.项目背景与数据情况 1.1 项目来源 本次要实践的数据日志来源于国内某知名的技术学习论坛,该论坛由某培训学校主办,汇聚了众多技术学习者,每天都有人发帖.回帖,如图1所示. 图1 项目来源网站-技术学习论坛 本次实践的目的就在于通过对该技术论坛的apache common日志进行分析,计算该论坛的一些关键指标,供运营者进行决策时参考. PS:开发该系统的目的是分了获取一些业务相关的指标,这些指标在第三方工具中无法获得的: 1.2 数据情况 该论坛数据有两部分: (1)历史数据约56GB,统计到

【Big Data - Hadoop - MapReduce】hadoop 学习笔记:MapReduce框架详解

开始聊MapReduce,MapReduce是Hadoop的计算框架,我学Hadoop是从Hive开始入手,再到hdfs,当我学习hdfs时候,就感觉到hdfs和mapreduce关系的紧密.这个可能是我做技术研究的思路有关,我开始学习某一套技术总是想着这套技术到底能干什么,只有当我真正理解了这套技术解决了什么问题时候,我后续的学习就能逐步的加快,而学习hdfs时候我就发现,要理解hadoop框架的意义,hdfs和mapreduce是密不可分,所以当我写分布式文件系统时候,总是感觉自己的理解肤浅

Hadoop学习笔记:MapReduce框架详解

原文出处: 夏天的森林 开始聊mapreduce,mapreduce是hadoop的计算框架,我学hadoop是从hive开始入手,再到hdfs,当我学习hdfs时候,就感觉到hdfs和mapreduce关系的紧密.这个可能是我做技术研究的思路有关,我开始学习某一套技术总是想着这套技术到底能干什么,只有当我真正理解了这套技术解决了什么问题时候,我后续的学习就能逐步的加快,而学习hdfs时候我就发现,要理解hadoop框架的意义,hdfs和mapreduce是密不可分,所以当我写分布式文件系统时候

hadoop 学习笔记:mapreduce框架详解(转 http://www.cnblogs.com/sharpxiajun/p/3151395.html)

开始聊mapreduce,mapreduce是hadoop的计算框架,我学hadoop是从hive开始入手,再到hdfs,当我学习hdfs时候,就感觉到hdfs和mapreduce关系的紧密.这个可能是我做技术研究的思路有关,我开始学习某一套技术总是想着这套技术到底能干什么,只有当我真正理解了这套技术解决了什么问题时候,我后续的学习就能逐步的加快,而学习hdfs时候我就发现,要理解hadoop框架的意义,hdfs和mapreduce是密不可分,所以当我写分布式文件系统时候,总是感觉自己的理解肤浅