MapReduce编程:自定义分区和自定义计数器

简介: MapReduce编程:自定义分区和自定义计数器


MapReduce编程:自定义分区和自定义计数器

一、实验目标

  1. 熟练掌握Mapper类,Reducer类和main函数的编写方法
  2. 掌握用mapreduce计算框架中本地聚合的基本用法
  3. 掌握MapReduce编程的自定义分区操作
  4. 掌握用mapreduce计算框架中partitioner的基本用法和实现效果
  5. 掌握MapReduce编程的自定义计数器操作

二、实验要求及注意事项

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

三、实验内容及步骤

实验任务1:自定义分区,mapreduce计算框架中partitioner可以将需要归为一类的数据输出到同一个文件中。使用mapreduce编程,读取文本文件,对其中的单词进行计数,并设置2个分区,将单词首字母包含“h”的放入第一个分区,其余的放入第二个分区。实现效果参考图1:

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

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

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

(3)完成代码编写。

PartitionMap

package hadoop;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;
import org.apache.hadoop.io.*;
public class WjwPartitionMap extends Mapper<Object, Text, Text, IntWritable>{
    public void map(Object key, Text value, Context context) throws IOException, InterruptedException{
      String arr[] = value.toString().split(" ");
      for(String word:arr){
        context.write(new Text(word), new IntWritable(1));
      }
    }
}

PartitionReduce

package hadoop;
import java.io.IOException;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapreduce.Reducer;
public class WjwPartitionReduce extends Reducer<Text, IntWritable, Text, IntWritable>{
  protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException{
    int sum = 0;
    for(IntWritable val:values){
      sum += val.get();
    }
    context.write(key, new IntWritable(sum));
  }
}

Partitioner

package hadoop;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapreduce.*;
public class WjwPartitioner extends Partitioner<Text, IntWritable>{
  public int getPartition(Text key, IntWritable value, int numPartition){
    String str = key.toString();
    if(str.startsWith("h")){
      return 0;
    }else{
      return 1;
    }
  }
}

PartitionMain

package hadoop;
import org.apache.hadoop.mapreduce.*;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.*;
public class WjwPartitionMain {
  public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException{
    if(args==null || args.length!=2){
      System.out.println("error");
    }
    Job job = Job.getInstance(new Configuration(), "WjwPartitionMain");
    job.setJarByClass(WjwPartitionMain.class);
    job.setMapperClass(WjwPartitionMap.class);
    job.setReducerClass(WjwPartitionReduce.class);
    job.setNumReduceTasks(2);
    job.setPartitionerClass(WjwPartitioner.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(IntWritable.class);
    FileInputFormat.addInputPath(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));
    job.waitForCompletion(true);
  }
}

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

实验任务2:自定义计数器,使用mapreduce编程,并在编程中利用自定义计数器统计sogou.txt文件中符合指定条件的uid等于”88f8ec0baee999cb1f30ffecda27cd86”出现的次数,实现效果如图2所示。

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

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

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

(3)完成代码编写。

CountMap

package hadoop;
import org.apache.hadoop.mapreduce.*;
import java.io.*;
import org.apache.hadoop.io.*;
public class WjwCountMap extends Mapper<Object, Text, Text, IntWritable>{
    public void map(Object key, Text value, Context context) throws IOException, InterruptedException{
      String arr[] = value.toString().split("\t");
      String uid = arr[1];
      Counter mycounter = context.getCounter("zidingyi","uid-counter");
      if("88f8ec0baee999cb1f30ffecda27cd86".equals(uid)){
        mycounter.increment(1);
        context.write(new Text(uid), new IntWritable(1));
      }
    }
}

CountReduce

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

CountMain

package hadoop;
import org.apache.hadoop.mapreduce.*;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.*;
public class WjwCountMain {
  public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException{
    if(args==null || args.length!=2){
      System.out.println("error");
    }
    Job job = Job.getInstance(new Configuration(), "WjwCountMain");
    job.setJarByClass(WjwCountMain.class);
    job.setMapperClass(WjwCountMap.class);
    job.setReducerClass(WjwCountReduce.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(IntWritable.class);
    FileInputFormat.addInputPath(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));
    job.waitForCompletion(true);
  }
}

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

附:系列文章

实验 文章目录 直达链接
实验01 Hadoop安装部署 https://want595.blog.csdn.net/article/details/132767284
实验02 HDFS常用shell命令 https://want595.blog.csdn.net/article/details/132863345
实验03 Hadoop读取文件 https://want595.blog.csdn.net/article/details/132912077
实验04 HDFS文件创建与写入 https://want595.blog.csdn.net/article/details/133168180
实验05 HDFS目录与文件的创建删除与查询操作 https://want595.blog.csdn.net/article/details/133168734
实验06 SequenceFile、元数据操作与MapReduce单词计数 https://want595.blog.csdn.net/article/details/133926246
实验07 MapReduce编程:数据过滤保存、UID 去重 https://want595.blog.csdn.net/article/details/133947981
实验08 MapReduce 编程:检索特定群体搜索记录和定义分片操作 https://want595.blog.csdn.net/article/details/133948849
实验09 MapReduce 编程:join操作和聚合操作 https://want595.blog.csdn.net/article/details/133949148
实验10 MapReduce编程:自定义分区和自定义计数器 https://want595.blog.csdn.net/article/details/133949522
目录
相关文章
|
2月前
|
分布式计算 负载均衡 Hadoop
MapReduce 分区器的作用与重要性
【8月更文挑战第31天】
37 1
|
2月前
|
分布式计算 大数据 Hadoop
揭秘MapReduce背后的魔法:从基础类型到高级格式,带你深入理解这一大数据处理利器的奥秘与实战技巧,让你从此不再是编程门外汉!
【8月更文挑战第17天】MapReduce作为分布式计算模型,是大数据处理的基石。它通过Map和Reduce函数处理大规模数据集,简化编程模型,使开发者聚焦业务逻辑。MapReduce分单阶段和多阶段,支持多种输入输出格式如`TextInputFormat`和`SequenceFileInputFormat`。例如,简单的单词计数程序利用`TextInputFormat`读取文本行并计数;而`SequenceFileInputFormat`适用于高效处理二进制序列文件。合理选择类型和格式可有效解决大数据问题。
30 1
|
4月前
|
分布式计算 Hadoop Java
MapReduce编程模型——在idea里面邂逅CDH MapReduce
MapReduce编程模型——在idea里面邂逅CDH MapReduce
65 15
|
4月前
|
分布式计算 Hadoop Java
Hadoop MapReduce编程
该教程指导编写Hadoop MapReduce程序处理天气数据。任务包括计算每个城市ID的最高、最低气温、气温出现次数和平均气温。在读取数据时需忽略表头,且数据应为整数。教程中提供了环境变量设置、Java编译、jar包创建及MapReduce执行的步骤说明,但假设读者已具备基础操作技能。此外,还提到一个扩展练习,通过分区功能将具有相同尾数的数字分组到不同文件。
47 1
|
4月前
|
存储 分布式计算 Hadoop
MapReduce编程模型——自定义序列化类实现多指标统计
MapReduce编程模型——自定义序列化类实现多指标统计
33 0
|
4月前
|
机器学习/深度学习 分布式计算 并行计算
MapReduce是一种用于并行计算的编程模型和处理大规模数据集的实现
MapReduce是一种用于并行计算的编程模型和处理大规模数据集的实现
54 0
|
5月前
|
分布式计算 资源调度 Hadoop
MapReduce分布式编程
MapReduce分布式编程
56 1
|
4月前
|
存储 分布式计算 Hadoop
Hadoop生态系统详解:HDFS与MapReduce编程
Apache Hadoop是大数据处理的关键,其核心包括HDFS(分布式文件系统)和MapReduce(并行计算框架)。HDFS为大数据存储提供高容错性和高吞吐量,采用主从结构,通过数据复制保证可靠性。MapReduce将任务分解为Map和Reduce阶段,适合大规模数据集的处理。通过代码示例展示了如何使用MapReduce实现Word Count功能。HDFS和MapReduce的结合,加上YARN的资源管理,构成处理和分析大数据的强大力量。了解和掌握这些基础对于有效管理大数据至关重要。【6月更文挑战第12天】
125 0
|
4月前
|
分布式计算 自然语言处理 大数据
【大数据】MapReduce JAVA API编程实践及适用场景介绍
【大数据】MapReduce JAVA API编程实践及适用场景介绍
89 0
|
5月前
|
分布式计算 数据可视化 Hadoop
大数据实战——基于Hadoop的Mapreduce编程实践案例的设计与实现
大数据实战——基于Hadoop的Mapreduce编程实践案例的设计与实现