首页 > 其他分享 >MapReduce入门案例——wordcount词频统计分析

MapReduce入门案例——wordcount词频统计分析

时间:2023-12-19 12:33:48浏览次数:26  
标签:wordcount hadoop MapReduce job 词频 org apache import class

        说实话,wordcount这个案例挺土的,但是作为入门案例,还是值得学习的,本篇就通过MapReduce来对词频进行一个统计分析,并写出核心代码。

一:案例介绍:

        

  • Input : 读取文本文件;
  • Splitting : 将文件按照文件块(block)或者行进行拆分,此时得到的K1为偏移量,V1表示对应行的文本内容
  • Mapping : 并行将每一行按照空格进行拆分,拆分得到的 List(K2,V2),其中 K2 代表每一个单词,由于是做词频统计,所以 V2 的值为 1,代表出现 1 次;
  • Shuffling:由于 Mapping 操作可能是在不同的机器上并行处理的,所以需要通过 shuffling 将相同 key 值的数据分发到同一个节点上去合并,这样才能统计出最终的结果,此时得到 K2 为每一个单词,List(V2) 为可迭代集合,V2就是 Mapping 中的V2;
  • Reducing : 这里的案例是统计单词出现的总次数,所以 Reducing 对 List(V2) 进行归约求和操作,最终输出。

 

二:代码实现:

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;
 // Mapper实现
/**
 * KEYIN: Map任务读数据的key类型,offset,是每行数据起始位置的偏移量,Long
 * VALUEIN:Map任务读数据的value类型,其实就是一行行的字符串,String
 *
 * hello world welcome
 * hello welcome
 *
 * KEYOUT: map方法自定义实现输出的key的类型,String
 * VALUEOUT: map方法自定义实现输出的value的类型,Integer
 *
 *
 * 词频统计:相同单词的次数   (word,1)
 *
 * Long,String,String,Integer是Java里面的数据类型
 * Hadoop自定义类型:序列化和反序列化
 *
 * LongWritable,Text
 *
 */

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

	@Override
	protected void map(LongWritable key, Text value, Context context)
			throws IOException, InterruptedException {
		
		// 把value对应的行数据按照指定的分隔符拆开
        String[] words = value.toString().split("\t");
        for(String word : words) {
            // (hello,1)  (world,1)
            context.write(new Text(word.toLowerCase()), new IntWritable(1));
        }
	}
}

// Reducer实现

import java.io.IOException;
import java.util.Iterator;

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

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

/**
* (hello,1) (world,1)
* (hello,1) (world,1)
* (hello,1) (world,1)
* (welcome,1)
*
* map的输出到reduce端,是按照相同的key分发到一个reduce上去执行
*
* reduce1: (hello,1)(hello,1)(hello,1) ==> (hello, <1,1,1>)
* reduce2: (world,1)(world,1)(world,1) ==> (world, <1,1,1>)
* reduce3 (welcome,1) ==> (welcome, <1>)
*
*
*/
@Override
protected void reduce(Text key, Iterable<IntWritable> values,
Context context) throws IOException, InterruptedException {
int count = 0;

Iterator<IntWritable> iterator = values.iterator();

//<1,1,1>
while (iterator.hasNext()) {
IntWritable value = iterator.next();
count += value.get();
}

context.write(key, new IntWritable(count));
}

}

 

Combiner操作:map端的聚合操作(这个聚合操作和reducer逻辑是完全一样的)
 优点:能减少IO,提升作业的执行性能,节省网络开销
 局限性:求平均数

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
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 java.net.URI;

// Combiner实现
/** * Combiner操作:map端的聚合操作(这个聚合操作和reducer逻辑是完全一样的) * 优点:能减少IO,提升作业的执行性能,节省网络开销 * 局限性:求平均数 */ public class WordCountCombinerLocalApp { public static void main(String[] args) throws Exception{ Configuration configuration = new Configuration(); // 创建一个Job Job job = Job.getInstance(configuration); // 设置Job对应的参数: 主类 job.setJarByClass(WordCountCombinerLocalApp.class); // 设置Job对应的参数: 设置自定义的Mapper和Reducer处理类 job.setMapperClass(WordCountMapper.class); job.setReducerClass(WordCountReducer.class); // 添加Combiner的设置即可 job.setCombinerClass(WordCountReducer.class); // 设置Job对应的参数: Mapper输出key和value的类型 job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(IntWritable.class); // 设置Job对应的参数: Reduce输出key和value的类型 job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); // 设置Job对应的参数: 作业输入和输出的路径 FileInputFormat.setInputPaths(job, new Path("input/wc.input")); FileOutputFormat.setOutputPath(job, new Path("output/wc")); // 提交job boolean result = job.waitForCompletion(true); System.exit(result ? 0 : -1); } }

  

 

标签:wordcount,hadoop,MapReduce,job,词频,org,apache,import,class
From: https://www.cnblogs.com/tianpan666/p/17913457.html

相关文章

  • MapReduce基本介绍
    MapReduce也是Hadoop里的核心内容,非常著名,五星级必须要掌握哦,本篇文章就先抛砖引玉,对MapReduce做一个基本介绍。到底什么是MapReduce     HadoopMapReduce是一个分布式计算框架,用于编写批处理应用程序。编写好的程序可以提交到Hadoop集群上用于并行处理大规模的数......
  • 大数据实验(MapReduce编程2)
    代码参考:MapReduce实验-CodeDancing-博客园(cnblogs.com)编程实现总代码:编译工具:IDEA说明:1.完成不同的任务的时候,需要修改cmd的值2.conf.set("fs.default.name","hdfs://node1:8020");换上自己的连接路径3.System.setProperty("HADOOP_USER_NAME","root");不加上这个......
  • 武汉星起航:解密成功选品的秘籍,词频分析揭示市场脉搏
    在电商时代,选品成为创业者们摆在首要位置的一项任务。然而,要想在激烈的市场竞争中脱颖而出,仅仅依赖传统的市场分析可能不够。本文武汉星起航将介绍一种基于统计学原理的独特分析方法——词频分析,它不仅简单易懂,而且能够迅速洞悉消费者的需求,助您在选品过程中事半功倍。词频分析的核......
  • 大数据 - MapReduce:从原理到实战的全面指南
    本文深入探讨了MapReduce的各个方面,从基础概念和工作原理到编程模型和实际应用场景,最后专注于性能优化的最佳实践。关注【TechLeadCloud】,分享互联网架构、云服务技术的全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验......
  • 大数据 - MapReduce:从原理到实战的全面指南
    本文深入探讨了MapReduce的各个方面,从基础概念和工作原理到编程模型和实际应用场景,最后专注于性能优化的最佳实践。关注【TechLeadCloud】,分享互联网架构、云服务技术的全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验......
  • 大数据 - MapReduce:从原理到实战的全面指南
    本文深入探讨了MapReduce的各个方面,从基础概念和工作原理到编程模型和实际应用场景,最后专注于性能优化的最佳实践。关注【TechLeadCloud】,分享互联网架构、云服务技术的全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验......
  • Hadoop三大组件(HDFS,MapReduce,Yarn)
    1、HDFSHDFS是Hadoop分布式文件系统。一个HDFS集群是由一个NameNode和若干个DataNode组成的。其中NameNode作为主服务器,管理文件系统的命名空间和客户端对文件的访问操作;集群中的DataNode管理存储的数据。2、MapReduceMapReduce是一个软件框架,基于该框架能够容易地编写应用......
  • 大数据从入门到实战 - 第3章 MapReduce基础实战——信息挖掘 - 挖掘父子关系
    输出一直顺序不正确,把正确答案和我自己写的混了混,目前感觉是mapper的问题正确输出:grand_childgrand_parentMarkJesseMarkAlicePhilipJessePhilipAliceJoneJesseJoneAliceStevenJesseStevenAliceStevenFrankStevenMaryJo......
  • spark的shuffle和mapreduce的shuffle的区别
    功能上,MR的shuffle和Spark的shuffle是没啥区别的,都是对Map端的数据进行分区,要么聚合排序,要么不聚合排序,然后Reduce端或者下一个调度阶段进行拉取数据,完成map端到reduce端的数据传输功能。方案上,有很大的区别,MR的shuffle是基于合并排序的思想,在数据进入reduce端之前,都会进行sor......
  • HDFS与MAPREDUCE操作
     HDFS文件操作在分布式文件系统上验证HDFS文件命令,如下。hadoopfs[genericOpitions][-ls<path>] //显示目标路径当前目录下的所有文件[-lsr<path>] //递归显示目标路径下的所有目录及文件(深度优先)[-du<path>] //以字节为单位显示目录中所有文件的大小,或该文......