MapReduce编程:检索特定群体搜索记录和定义分片操作

简介: MapReduce编程:检索特定群体搜索记录和定义分片操作


MapReduce 编程:检索特定群体搜索记录和定义分片操作

一、实验目标

  1. 熟悉MapReduce编程涉及的主要类和接口的含义和用法
  2. 熟练掌握Mapper类,Reducer类和main函数的编写
  3. 熟练掌握在本地测试方法
  4. 熟练掌握集群上进行分布式程序测试

二、实验要求及注意事项

  1. 给出每个实验的主要实验步骤、实现代码和测试效果截图。
  2. 对本次实验工作进行全面的总结分析。
  3. 所有程序需要本地测试和集群测试,给出相应截图。
  4. 建议工程名,类名或包名等做适当修改,显示个人学号或者姓名

三、实验内容及步骤

实验任务1:检索特定偏好用户和群体操作:使用mapreduce编程,读取文本文件sogou.500w.utf8,查找搜索过“仙剑奇侠传”用户的uid,利用mapreduce的特性对uid进行去重并输出,实现效果参考图1。

图1 搜索过“仙剑奇侠传”用户的uid及搜索次数输出结果

主要实现步骤和运行效果图:

(1)进入虚拟机并启动Hadoop集群,完成文件上传。

(2)启动Eclipse客户端,新建一个java工程;在该工程中创建package,导入jar包,完成环境配置,依次创建包、Mapper类,Reducer类和主类等;

(3)完成代码编写。

SearchMap

package hadoop;
import java.io.*;
import org.apache.hadoop.mapreduce.*;
import org.apache.hadoop.io.*;
public class WjwSearchMap extends Mapper<Object, Text, Text, Text>{
  public void map(Object key, Text value, Context context) throws IOException,InterruptedException{
    String arr[] = value.toString().split("\t");
    if(arr != null && arr.length==6){
      String uid = arr[1];
      String keyword = arr[2];
      if(keyword.indexOf("仙剑奇侠")>=0){
        context.write(new Text(uid), new Text(keyword));
      }
    }
  }
}

SearchReduce

package hadoop;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapreduce.*;
import java.io.*;
public class WjwSearchReduce extends Reducer<Text, Text, Text, IntWritable>{
  @SuppressWarnings("unused")
  protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException{
    int s=0;
    for(Text word:values){
      s++;
    }
    context.write(key, new IntWritable(s));
  }
}

SearchMain

package hadoop;
import java.io.IOException;
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.mapreduce.*;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.io.*;
import org.apache.hadoop.fs.*;
@SuppressWarnings("unused")
public class WjwSearchMain {
  @SuppressWarnings("deprecation")
  public static void main(String[] args) throws IllegalArgumentException,
  IOException,ClassNotFoundException,InterruptedException{
    if(args.length != 2 || args == null){
      System.out.println("please input args");
    }
    Job job = new Job(new Configuration(), "WjwSearchMain");
    job.setJarByClass(WjwSearchMain.class);
    job.setMapperClass(WjwSearchMap.class);
    job.setReducerClass(WjwSearchReduce.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(Text.class);
    FileInputFormat.addInputPath(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));
    System.exit(job.waitForCompletion(true)?0:1);
  }
}

(4)测试程序,并查看输出结果。

实验任务2:MapReduce自定义分片(Split)操作:使用mapreduce编程,设置mr过程中Map Task读取文件时的split大小。实现效果:

主要实现步骤和运行效果图:

(1)进入虚拟机并启动Hadoop集群,完成文件上传。

(2)启动Eclipse客户端,新建一个java工程;在该工程中创建package,导入jar包,完成环境配置,依次创建包、Mapper类,Reducer类和主类等;

(3)完成代码编写。

SplitMap

package hadoop;
import java.io.*;
import org.apache.hadoop.mapreduce.*;
import org.apache.hadoop.io.*;
public class WjwSplitMap extends Mapper<Object, Text, Text, IntWritable>{
  public void map(Object key, Text value, Context context) throws IOException,InterruptedException{
    String arr[] = value.toString().split("\t");
    if(arr != null && arr.length==6){
      String uid = arr[1];
      String keyword = arr[2];
      if(keyword.indexOf("电影")>=0){
        context.write(new Text(uid), new IntWritable(1));
      }
    }
  }
}

SplitMain

package hadoop;
import java.io.IOException;
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.mapreduce.*;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.io.*;
import org.apache.hadoop.fs.*;
@SuppressWarnings("unused")
public class WjwSplitMain {
  @SuppressWarnings("deprecation")
  public static void main(String[] args) throws IllegalArgumentException,
  IOException,ClassNotFoundException,InterruptedException{
    if(args.length != 2 || args == null){
      System.out.println("please input args");
    }
    Job job = new Job(new Configuration(), "WjwSplitMain");
    job.setJarByClass(WjwSplitMain.class);
    job.setMapperClass(WjwSplitMap.class);
    job.setNumReduceTasks(0);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(IntWritable.class);
    FileInputFormat.setMinInputSplitSize(job, 256*1024*1024);
    FileInputFormat.addInputPath(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));
    System.exit(job.waitForCompletion(true)?0:1);
  }
}

(4)测试程序,并查看输出结果。

目录
相关文章
|
14天前
|
分布式计算 Hadoop Java
MapReduce编程:自定义分区和自定义计数器
MapReduce编程:自定义分区和自定义计数器
32 0
|
14天前
|
存储 分布式计算 负载均衡
【大数据技术Hadoop+Spark】MapReduce概要、思想、编程模型组件、工作原理详解(超详细)
【大数据技术Hadoop+Spark】MapReduce概要、思想、编程模型组件、工作原理详解(超详细)
79 0
|
14天前
|
存储 分布式计算 算法
【底层服务/编程功底系列】「大数据算法体系」带你深入分析MapReduce算法 — Shuffle的执行过程
【底层服务/编程功底系列】「大数据算法体系」带你深入分析MapReduce算法 — Shuffle的执行过程
33 0
|
9天前
|
分布式计算 资源调度 Hadoop
MapReduce分布式编程
MapReduce分布式编程
16 1
|
14天前
|
分布式计算 数据可视化 Hadoop
大数据实战——基于Hadoop的Mapreduce编程实践案例的设计与实现
大数据实战——基于Hadoop的Mapreduce编程实践案例的设计与实现
|
14天前
|
分布式计算 并行计算 Java
【分布式计算框架】 MapReduce编程初级实践
【分布式计算框架】 MapReduce编程初级实践
10 2
|
14天前
|
机器学习/深度学习 分布式计算 监控
面经:MapReduce编程模型与优化策略详解
【4月更文挑战第10天】本文是关于MapReduce在大数据处理中的关键作用的博客摘要。作者分享了面试经验,强调了MapReduce的基本原理、Hadoop API、优化策略和应用场景。MapReduce包含Map和Reduce两个主要阶段,Map阶段处理输入数据生成中间键值对,Reduce阶段进行聚合计算。面试重点包括理解MapReduce工作流程、使用Hadoop API编写Map/Reduce函数、选择优化策略(如分区、Combiner和序列化)以及应用场景,如日志分析和机器学习。
24 2
|
14天前
|
分布式计算 监控 Hadoop
Hadoop【基础知识 02】【分布式计算框架MapReduce核心概念+编程模型+combiner&partitioner+词频统计案例解析与进阶+作业的生命周期】(图片来源于网络)
【4月更文挑战第3天】Hadoop【基础知识 02】【分布式计算框架MapReduce核心概念+编程模型+combiner&partitioner+词频统计案例解析与进阶+作业的生命周期】(图片来源于网络)
61 0
|
14天前
|
分布式计算 Java Hadoop
MapReduce编程:数据过滤保存、UID 去重
MapReduce编程:数据过滤保存、UID 去重
58 0
|
14天前
|
缓存 分布式计算 Java
MapReduce编程:join操作和聚合操作
MapReduce编程:join操作和聚合操作
40 0