1.需求

推荐好友的好友

图1:

2.解决思路

3.代码

3.1MyFoF类代码

说明:

该类定义了所加载的配置,以及执行的map,reduce程序所需要加载运行的类

  1. package com.hadoop.mr.fof;
  2.  
  3. import java.io.IOException;
  4.  
  5. import org.apache.hadoop.conf.Configuration;
  6. import org.apache.hadoop.fs.Path;
  7. import org.apache.hadoop.io.IntWritable;
  8. import org.apache.hadoop.io.Text;
  9. import org.apache.hadoop.mapreduce.Job;
  10. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  11. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  12.  
  13. public class MyFoF {
  14.  
  15. public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
  16. //conf
  17. Configuration conf = new Configuration(true);
  18.  
  19. Job job=Job.getInstance(conf);
  20.  
  21. job.setJarByClass(MyFoF.class);
  22.  
  23. //map
  24. job.setMapperClass(FMapper.class);
  25. job.setMapOutputKeyClass(Text.class);
  26. job.setMapOutputValueClass(IntWritable.class);
  27.  
  28. //map阶段的分区排序都使用默认的不用额外设置
  29.  
  30. job.setReducerClass(FReducer.class);
  31.  
  32. //input ... output
  33. Path input=new Path("/data/fof/input");
  34. FileInputFormat.addInputPath(job, input);
  35.  
  36. Path output=new Path("/data/fof/output");
  37. if(output.getFileSystem(conf).exists(output)){
  38. output.getFileSystem(conf).delete(output);
  39. }
  40. FileOutputFormat.setOutputPath(job, output);
  41.  
  42. //submit
  43. job.waitForCompletion(true);
  44. }
  45. }

3.2FMapper类代码

说明:

该类的作用是编写map阶段的代码,对文本数据做一个预处理,按照规划比较每组的kv 做比较,这里面的k是偏移量longwritable类型,v是文本的字符串行 text类型。

代码逻辑:

1.双重for循环,外层循环比较直接关系,内层循环比较间接关系,最终map生成一个中间数据集,会有直接关系和间接关系。
2.将相同key的内容放在一起,交由reduce处理,如果是0代表为直接关系不作推荐,如果为1代表是间接关系,需要被推荐。

  1. package com.hadoop.mr.fof;
  2.  
  3. import java.io.IOException;
  4.  
  5. import org.apache.hadoop.io.IntWritable;
  6. import org.apache.hadoop.io.LongWritable;
  7. import org.apache.hadoop.io.Text;
  8. import org.apache.hadoop.mapreduce.Mapper;
  9. import org.apache.hadoop.util.StringUtils;
  10.  
  11. public class FMapper extends Mapper<LongWritable, Text, Text, IntWritable>{
  12.  
  13. Text mkey=new Text();
  14. IntWritable mval=new IntWritable();
  15.  
  16. @Override
  17. protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context)
  18. throws IOException, InterruptedException {
  19. //tom hello hadoop cat
  20.  
  21. String[] strs = StringUtils.split(value.toString(),' ');
  22.  
  23. //双重for循环,外层循环比较直接关系,内层循环比较间接关系,最终map生成一个中间数据集,会有直接关系和间接关系,
  24. //将相同key的内容放在一起,交由reduce处理,如果是0代表为直接关系不作推荐,如果为1代表是间接关系,需要被推荐。
  25. for (int i = 0; i < strs.length; i++) {
  26. mkey.set(getFoF(strs[0],strs[i]));
  27. mval.set(0);
  28. context.write(mkey, mval);
  29. for (int j = i+1; j < strs.length; j++) {
  30. mkey.set(getFoF(strs[i],strs[j]));
  31. mval.set(1);
  32. context.write(mkey, mval);
  33. }
  34. }
  35.  
  36. }
  37.  
  38. //定义一个比较方法如果前一个数s1小于后面一个数s2,就拼接为s1+s2,否则s2+s1
  39. public static String getFoF(String s1,String s2){
  40. if(s1.compareTo(s2)<0){
  41. return s1+":"+s2;
  42. }
  43. return s2+":"+s1;
  44. }
  45. }

3.3FReducer类代码

说明:

该类的作用是对map的输出做进一步处理,两两出现的value不为0的相同key的value累加起来,将累加的结果赋给key

  1. package com.hadoop.mr.fof;
  2.  
  3. import java.io.IOException;
  4.  
  5. import org.apache.hadoop.io.IntWritable;
  6. import org.apache.hadoop.io.Text;
  7. import org.apache.hadoop.mapreduce.Reducer;
  8.  
  9. public class FReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
  10.  
  11. IntWritable rval=new IntWritable();
  12. @Override
  13. protected void reduce(Text key, Iterable<IntWritable> values,
  14. Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
  15. int flag=0;
  16. int sum=0;
  17.  
  18. //增加for循环迭代values
  19. // hello:hadoop 0
  20. // hello:hadoop 1
  21. // hello:hadoop 0
  22. for (IntWritable v : values) {
  23. //如果获取到的values是0则将flag置为1,如果不为0则将所有的values叠加
  24. if(v.get()==0){
  25. flag=1;
  26. }
  27. sum+=v.get();
  28. }
  29.  
  30. //如果获取到的values不为0,就将相同key且values不为0的values叠加赋值给reduce中key中对应的值
  31. if(flag==0){
  32. rval.set(sum);
  33. context.write(key, rval);
  34. }
  35. }
  36. }

4.服务端执行

4.1创建文件输入目录

  1. [root@node01 test]# hdfs dfs -mkdir -p /data/fof/input

4.2上传文件到hdfs

  1. [root@node01 test]# cat fof.txt
  2. tom hello hadoop cat
  3. world hadoop hello hive
  4. cat tom hive
  5. mr hive hello
  6. hive cat hadoop world hello mr
  7. hadoop tom hive world
  8. hello tom world hive mr
  9.  
  10. [root@node01 test]#hdfs dfs -put ./fof.txt /data/fof/input

4.3执行jar包

  1. [root@node01 test]# hadoop jar ../jar_package/MyFOF.jar com.hadoop.mr.fof.MyFoF

4.4查看生成的输出文件

  1. [root@node01 test]# hdfs dfs -ls /data/fof/output/
  2. Found items
  3. -rw-r--r-- root supergroup -- : /data/fof/output/_SUCCESS
  4. -rw-r--r-- root supergroup -- : /data/fof/output/part-r-
  1. [root@node01 test]# hdfs dfs -cat /data/fof/output/part-r-
  2. cat:hadoop
  3. cat:hello
  4. cat:mr
  5. cat:world
  6. hadoop:hello
  7. hadoop:mr
  8. hive:tom
  9. mr:tom
  10. mr:world
  11. tom:world

说明:通过图1可以发现

cat 和hadoop、hello都有2个共同的朋友tom、hive

cat和mr、world有1个共同的朋友hive

hadoop和hello有3个共同的朋友 tom、world、hive

hadoop和hive有1个共同的朋友world

hive和tom有3个共同的朋友cat、hadoop、hello

mr和tom有1个共同的朋友hello

mr和world有2个共同的朋友hello、hive

tom和world有2个共同的朋友hello、hadoop

5.报错解决

org.apache.hadoop.hdfs.server.namenode.SafeModeException: Cannot delete /data/fof/output. Name)

这个异常表示hadoop处于安全状态,而你又对它进行了上传,修改,删除文件的操作。

刚启动完hadoop的时候,hadoop会进入安全模式,此时不能对hdfs进行上传,修改,删除文件的操作。

命令是用来查看当前hadoop安全模式的开关状态

  1. hdfs dfsadmin -safemode get

命令是打开安全模式

  1. hdfs dfsadmin -safemode enter

命令是离开安全模式

  1. hdfs dfsadmin -safemode leave

离开安全模式再次执行即可。

 

MapReduce案例二:好友推荐的更多相关文章

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

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 最应该推荐的好友TopN,如何排名 ...

  2. 【尚学堂·Hadoop学习】MapReduce案例2--好友推荐

    案例描述 根据好友列表,推荐好友的好友 数据集 tom hello hadoop cat world hadoop hello hive cat tom hive mr hive hello hive ...

  3. MapReduce案例-好友推荐

    用过各种社交平台(如QQ.微博.朋友网等等)的小伙伴应该都知道有一个叫 "可能认识" 或者 "好友推荐" 的功能(如下图).它的算法主要是根据你们之间的共同好友 ...

  4. MapReduce -- 好友推荐

    MapReduce实现好友推荐: 张三的好友有王五.小红.赵六; 同样王五.小红.赵六的共同好友是张三; 在王五和小红不认识的前提下,可以通过张三互相认识,给王五推荐的好友为小红, 给小红推荐的好友是 ...

  5. Hadoop Mapreduce 案例 wordcount+统计手机流量使用情况

    mapreduce设计思想 概念:它是一个分布式并行计算的应用框架它提供相应简单的api模型,我们只需按照这些模型规则编写程序,即可实现"分布式并行计算"的功能. 案例一:word ...

  6. 19-hadoop-fof好友推荐

    好友推荐的案例, 需要两个job, 第一个进行好友关系度计算, 第二个job将计算的关系进行推荐 1, fof关系类 package com.wenbronk.friend; import org.a ...

  7. 使用MapReduce实现二度人脉搜索算法

    一,背景介绍 在新浪微博.人人网等社交网站上,为了使用户在网络上认识更多的朋友,社交网站往往提供类似“你可能感兴趣的人”.“间接关注推荐”等好友推荐的功能,其中就包含了二度人脉算法. 二,算法实现 原 ...

  8. Houdini学习笔记——【案例二】消散文字制作

    [案例二]Houdini消散文字制作 一.Overview     文字通过时间轴中frame变化而碎裂从两边开始向着中间消散并向镜头移动. 效果 二.Sop(Surface OPerators or ...

  9. 吴裕雄--天生自然HADOOP操作实验学习笔记:qq好友推荐算法

    实验目的 初步认识图计算的知识点 复习mapreduce的知识点,复习自定义排序分组的方法 学会设计mapreduce程序解决实际问题 实验原理 QQ好友推荐算法是所有推荐算法中思路最简单的,我们利用 ...

随机推荐

  1. 访问修饰符public,private,protected和default的区别?

    类的成员不写访问修饰符默认为default,默认对于同一个包的其他类相当于公开(public),对于不是同一个包的其他类相当于私有(private). 受保护(protected)对子类相当于公开,对 ...

  2. rn初体验

    react-native 需要的工具 .nodejs .rn cli .xcode and as ---------------- 打开终端,切换到根路径(mac中修改npm的默认安装来源) 一.op ...

  3. C++智能指针 unique_ptr

    C++智能指针 unique_ptr unique_ptr 独占所指向的对象, 同一时刻只能有一个 unique_ptr 指向给定对象(通过禁止拷贝语义, 只有移动语义来实现), 定义于 memory ...

  4. select和epoll概念

    关于linux的I/O复用接口select和epoll,下列说法错误的是() select调用时会进行线性遍历,epoll采用回调函数机制,不需要线性遍历 select的最大连接数为FD_SETSIZ ...

  5. 获取文件名称 basename 用法

    <?phpheader('Content-type:text/html;charset=utf8'); $str = '2390230.png';$str_arr = explode('.',$ ...

  6. Android之实现定位

    基于android的定位无非就两种:network.gps.两者各有优劣. Network:定位快,准确度低,受环境影响小. GPS:定位慢,准确度高,受环境影响大. 本文要解决的问题: 1.     ...

  7. LightOJ 1278 - Sum of Consecutive Integers 分解奇因子 + 思维

    http://www.lightoj.com/volume_showproblem.php?problem=1278 题意:问一个数n能表示成几种连续整数相加的形式 如6=1+2+3,1种. 思路:先 ...

  8. Java包名命名规则

    1.  sun公司建议java包的命名规则为域名的倒写. 比如:sun公司www.sun.com 就用该是com.sun.www 2. indi : 个体项目,指个人发起,但非自己独自完成的项目,可公 ...

  9. [洛谷P2048] [NOI2010] 超级钢琴

    洛谷题目链接:[NOI2010]超级钢琴 题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号 ...

  10. 使用JMeter录制脚本并调试

    仍然以禅道中添加bug为例进行录制 第一步:在JMeter中添加线程组,命名为AddBugByJMeter 第二步:在线程组下添加HTTP请求默认值 添加->配置元件->HTTP请求默认值 ...