mapreducer

一、 需求描述:

mapreduce笔试题: 找出有共同好友的users

usr:friend,friend,friend...
---------------
A:B,C,D,F,E,O

B:A,C,E,K

C:F,A,D,I

D:A,E,F,L

E:B,C,D,M,L

F:A,B,C,D,E,O,M

G:A,C,D,E,F

H:A,C,D,E,O

I:A,O

J:B,O

K:A,C,D

L:D,E,F

M:E,F,G

O:A,H,I,J

最终结果:

A,B C,E

A,C D,F

A,D F,E

A,F B,C,D,E,O

B,E C

C,F A,D

D,E L

D,F A,E

D,L E,F

E,L D

F,M E

H,O A

I,O A

package com.friends.zb;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FilterFileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

/**
* 找朋友
*
* @author zhangbing
*
*/
public class Friends {

public static class M1 extends Mapper<LongWritable , Text,Text,Text>{
@Override
protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, Text>.Context context)
throws IOException, InterruptedException {
String[] split = value.toString().split(":");
String[] split2 = split[1].split(",");
for(String s:split2){
context.write(new Text(s), new Text(split[0]));
}
}
}
public static class R1 extends Reducer<Text, Text, Text, Text>{
@Override
protected void reduce(Text key, Iterable<Text> values, Reducer<Text, Text, Text, Text>.Context context)
throws IOException, InterruptedException {

List<String> list = new ArrayList<>();

for (Text t : values) {
list.add(t.toString());
}
Text k = new Text();
for (String s1 : list) {
for (String s2 : list) {
if(s1.compareTo(s2)<0){
k.set(s1+","+s2);
context.write(k, key);
}
}
String string = s1+","+key.toString();
if(s1.compareTo(key.toString())>0){
string=key.toString()+","+s1;
}
context.write(new Text(string), new Text("1"));
}
}
}

public static class M2 extends Mapper<LongWritable , Text,Text,Text>{
@Override
protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, Text>.Context context)
throws IOException, InterruptedException {
String[] split = value.toString().split("\t");
context.write(new Text(split[0]), new Text(split[1]));
}
}
public static class R2 extends Reducer<Text, Text, Text, Text>{
@Override
protected void reduce(Text key, Iterable<Text> values, Reducer<Text, Text, Text, Text>.Context context)
throws IOException, InterruptedException {
int count = 0;
StringBuffer sb = new StringBuffer();
for (Text text : values) {

String s = text.toString();
if("1".equals(s)){
count++;
}else{
sb.append(",").append(s);
}
}
if(count == 2 && sb.length()>0){
context.write(key,new Text(sb.toString().substring(1)));
}
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf);

job.setJarByClass(Friends.class);

job.setMapperClass(M1.class);

job.setReducerClass(R1.class);

job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
FileInputFormat.setInputPaths(job,new Path(args[0]));
Path path = new Path(args[1]);
FileSystem fileSystem = FilterFileSystem.get(conf);
if(fileSystem.exists(path)){
fileSystem.delete(path,true);
}
FileOutputFormat.setOutputPath(job, path);

boolean b = job.waitForCompletion(true);
if(b){
Job job2 = Job.getInstance(conf);

job2.setJarByClass(Friends.class);

job2.setMapperClass(M2.class);

job2.setReducerClass(R2.class);

job2.setOutputKeyClass(Text.class);
job2.setOutputValueClass(Text.class);
FileInputFormat.setInputPaths(job2,new Path(args[1]));
Path path2 = new Path(args[2]);
FileSystem fileSystem2 = FilterFileSystem.get(conf);
if(fileSystem2.exists(path2)){
fileSystem2.delete(path2,true);
}
FileOutputFormat.setOutputPath(job2, path2);

job2.waitForCompletion(true);
}
}
}

时间: 2024-12-20 01:20:06

mapreducer的相关文章

基于mapreducer的图算法

作者系阿里巴巴集团1688技术部普通码农 引言 周末看到一篇不错的文章"Graph Twiddling in a MapReduce world" ,介绍MapReduce下一些图算法的实现.文章语言质朴,介绍很多实用图优化技巧.文章2009年发表,至今已经被引用183次,足以证明这篇文章价值.目前这篇文章网上已经有人对这篇文章做了介绍,但仅介绍了其中最简单的两个算法,对其中的所做优化,并没有做分析.为了加深对文章算法的理解,我重新对这篇文章的算法做了翻译,同时加了自己的理解,以及算法

[Hadoop]MapReducer工作过程

1. 从输入到输出 一个MapReducer作业经过了input,map,combine,reduce,output五个阶段,其中combine阶段并不一定发生,map输出的中间结果被分到reduce的过程成为shuffle(数据清洗). 在shuffle阶段还会发生copy(复制)和sort(排序). 在MapReduce的过程中,一个作业被分成Map和Reducer两个计算阶段,它们由一个或者多个Map任务和Reduce任务组成.如下图所示,一个MapReduce作业从数据的流向可以分为Ma

【重拾】MapReducer[第一篇]

昨天听朋友说了一个题目,具体的题目忘了! 有数据是这样的: <1,0>  <2,8> <1,9> <2,7> <1,0> <3,15> <5,20>   <3,25> <4,20> <3,50> 要得到结果试着样的: 1    2 2    2 3    3 4    1 5    1 对左侧数据的统计,对右侧数据的去重: 当左侧相同时,右侧也相同,之记录一次:当左侧相同,右侧不同,左侧

mapreducer计算原理

mapreducer计算原理 InputFormat InputFormat的默认实现是TextInputFormat InputSplit 概念 是mapreducer对文件进行处理和运算的输入单位.只是一个逻辑概念.每一个InputSplit并没有对文件进行实际的切割.只是记录了要处理文件的位置信息(包括文件的path和 hosts.长度(length)).在默认情况下,InputSplit和Block的数目是一样的. getLength 得到一个InputSplit的长度 getLocat

MapReducer 自定义bean-排序-分组和shuffle的过程

1. 需求 根据手机号码,查询该号码的上行,下行,总流量,并从高到低排序,并对手机号码根据省份分组 1363157985066 13726230503 00-FD-07-A4-72-B8:CMCC 120.196.100.82 i02.c.aliimg.com 24 27 2481 24681 200 1363157995052 13826544101 5C-0E-8B-C7-F1-E0:CMCC 120.197.40.4 4 0 264 0 200 1363157991076 13926435

mapReducer程序编写过程

/*    第一步    split    有系统自动切分    第二步    map        撰写map类extemds Maper 复写Map方法:    第三步    shuffle                        Partion        分区,将不同信息区分的分发到不同的Reducer中                Sort        排序,按照key的不同标准判断顺序                Group        分组,按照不同的key值判断相

MapReducer Counter计数器的使用,Combiner ,Partitioner,Sort,Grop的使用,

一:Counter计数器的使用 hadoop计数器:可以让开发人员以全局的视角来审查程序的运行情况以及各项指标,及时做出错误诊断并进行相应处理. 内置计数器(MapReduce相关.文件系统相关和作业调度相关) 也可以通过http://master:50030/jobdetails.jsp查看 /** * 度量,在运行job任务的时候产生了那些j输出.通过计数器可以观察整个计算的过程,运行时关键的指标到底是那些.可以表征程序运行时一些关键的指标. * 计数器 counter 统计敏感单词出现次数

MapReducer中的多次归约处理

我们知道,MapReduce是分为Mapper任务和Reducer任务,Mapper任务的输出,通过网络传输到Reducer任务端,作为输入. 在Reducer任务中,通常做的事情是对数据进行归约处理.既然数据来源是Mapper任务的输出,那么是否可以在Mapper端对数据进行归约处理,业务逻辑与Reducer端做的完全相同.处理后的数据再传送到Reducer端,再做一次归约.这样的好处是减少了网络传输的数量. 可能有人疑惑几个问题: 为什么需要在Mapper端进行归约处理? 为什么可以在Map

Hadoop学习---第四篇Mapreducer里的Partitioner

Partitioner就是对map输出的key进行分组,不同的组可以指定不同的reduce task处理: Partition功能由partitioner的实现子类来实现 每写一段代码都会加深理解,程序里记录了自己的理解 FlowBean类源码: package cn.zxl.flowcountpartitioner; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import o