【Hadoop】WordCount源码分析

  • MapReduce
  • WordCount单词统计
  • WordCount源码分析
  • 参考

MapReduce

MapReduce是一种可用于数据处理的编程模型。它的任务过程分为两个处理阶段: map 阶段和 reduce 阶段。每阶段都以 键-值对 作为输入和输出,其类型由我们按需选择。我们还需要写两个函数: map 函数和 reduce 函数。

map 函数由Mapper类来表示,后者声明一个抽象的 map() 方法。Mapper类是一个泛型类型,它有四个形参类型,分别指定 map 函数的输入键、输入值、输出键、输出值的类型。

同样, reduce 函数也有四个形式参数类型用于指定输入和输出类型。 reduce 函数的输入类型必须匹配 map 函数的输出类型。


WordCount单词统计

首先有这么一个文件,文件内容如下:

hello world hello java  
hello hadoop

那么hadoop是怎么做单词统计的呢?我们用步骤来描述下:

  • 第一步:读取这个文件,按行来将这个文件每一行的单词给拆分出来,然后形成很多key/value的结果,处理完就是这样
    <hello,1>
    <world,1>
    <hello,1>
    <java,1>
    <hello,1>
    <hadoop,1>
  • 第二步:排序
    排序完会变成这样的结果
    <hadoop,1>
    <hello,1>
    <hello,1>
    <hello,1>
    <java,1>
    <world,1>
  • 第三步:合并
    合并后的结果如下
    <hadoop,1>
    <hello,1,1,1>
    <java,1>
    <world,1>
  • 第四步:汇聚结果
    <hadoop,1>
    <hello,3>
    <java,1>
    <world,1>

第二步和第三步是hadoop框架帮助我们完成的,我们实际上需要写代码的地方是第一步和第四步。 第一步对应的就是Map的过程,第四步对应的是Reduce的过程。


WordCount源码分析

import java.io.IOException;
import java.util.StringTokenizer;import org.apache.hadoop.conf.Configuration;
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.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;public class WordCount {// TokenizerMapper作为Map阶段,需要继承Mapper,并重写map()函数public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable>{//这个泛型声明告诉MapReduce框架,Mapper的输入是不加限制的通用对象和文本,而输出是文本和整数private final static IntWritable one = new IntWritable(1);//IntWritable 是 Hadoop 提供的用于表示整数的数据类型。这里是为每个单词设置一个计数,表示单词在文本中出现的次数private Text word = new Text();public void map(Object key, Text value, Context context) throws IOException, InterruptedException {// 用StringTokenizer作为分词器,对value进行分词StringTokenizer itr = new StringTokenizer(value.toString());//默认情况下使用空格作为分隔符。// 遍历分词后结果while (itr.hasMoreTokens()) {// itr.nextToken() 逐个获取单词。每个String类型的单词都会被设置到 Text 类型的 word 变量中word.set(itr.nextToken());// 将(word,1),即(Text,IntWritable)写入上下文context,供后续Reduce阶段使用context.write(word, one);}}}// IntSumReducer作为Reduce阶段,需要继承Reducer,并重写reduce()函数public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> {private IntWritable result = new IntWritable();//reduce方法对每个键(单词)的值列表进行迭代,累加计算单词出现的总次数,并将结果输出为(word, total_count)。public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {int sum = 0;// 遍历map阶段输出结果中的values中每个val,累加至sumfor (IntWritable val : values) {sum += val.get();}// 将sum设置入IntWritable类型resultresult.set(sum);// 通过上下文context的write()方法,输出结果(key, result),即(Text,IntWritable)context.write(key, result);}}public static void main(String[] args) throws Exception {// 加载hadoop配置Configuration conf = new Configuration();// 校验命令行输入参数,确保用户提供了输入路径和输出路径if (args.length < 2) {System.err.println("Usage: wordcount <in> [<in>...] <out>");//要求用户提供输入路径(可能是多个),然后一个输出路径。System.exit(2);//在这里,退出码是 2,通常表示程序由于错误的使用方式而被终止}// 构造一个Job实例job,并命名为"word count"Job job = new Job(conf, "word count");// 设置jar,指定运行该作业的Jar文件。Hadoop利用方法中的类来查找包含它的JAR文件,进而找到相关的JAR文件。job.setJarByClass(WordCount.class);// 设置Mapperjob.setMapperClass(TokenizerMapper.class);// 设置Combinerjob.setCombinerClass(IntSumReducer.class);// 设置Reducerjob.setReducerClass(IntSumReducer.class);// 设置OutputKeyjob.setOutputKeyClass(Text.class);// 设置OutputValuejob.setOutputValueClass(IntWritable.class);// 添加输入路径。通过循环,将所有的输入路径添加到作业的配置中for (int i = 0; i < args.length - 1; ++i) {FileInputFormat.addInputPath(job, new Path(args[i]));}// 添加输出路径。通常是HDFS上的一个目录FileOutputFormat.setOutputPath(job,new Path(args[args.length - 1]));// 等待作业job运行完成并退出System.exit(job.waitForCompletion(true) ? 0 : 1);}
}

参考

https://juejin.cn/post/6844903942183190541

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/225288.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于嵌入式开发的一些信息汇总:C标准、芯片架构、编译器、MISRA-C

关于嵌入式开发的一些信息汇总&#xff1a;C标准、芯片架构、编译器、MISRA-C 关于C标准芯片架构是什么&#xff1f;架构对芯片有什么作用&#xff1f;arm架构X86架构mips架构小结 编译器LLVM是什么&#xff1f;前端在干什么&#xff1f;后端在干什么&#xff1f; MISRA C的诞生…

​LeetCode解法汇总1631. 最小体力消耗路径

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 描述&#xff1a; 你准备参…

计算机网络中的通信子网主要有哪些功能?

计算机网络中的通信子网主要具有以下功能&#xff1a; 负责全网的数据通信&#xff1a;通信子网通过使用各种通信协议和传输控制功能&#xff0c;能够确保数据从一台主机安全、准确地传输到另一台主机。这包括数据的封装、解封装、传输控制、差错控制等过程。 完成各种网络数据…

【Linux】使用官方脚本自动安装 Docker(Ubuntu 22.04)

前言 Docker是一种开源平台&#xff0c;用于开发、交付和运行应用程序。它利用了容器化技术&#xff0c;使开发人员能够将应用程序及其依赖项打包到一个称为Docker容器的可移植容器中。这些容器可以在任何运行Docker的机器上快速、一致地运行&#xff0c;无论是开发环境、测试…

make没有更新最新的uImage

在 LCD 驱动的时候发现&#xff0c;linux logo一直弄不出来&#xff0c;猜想可能是因为uImage的问题&#xff0c;就看了一眼 uImage 时间&#xff1a; ​ 我现在的时间是 &#xff0c;那可能就是没有更新make的时候没有更新&#xff0c;就上网搜了一下用下面的命令输出 uImage&…

Vue学习笔记-Vue3对响应式数据的判断

导入 import {isRef,isReactive,isReadonly,isProxy} from vue作用 isRef&#xff1a; 检查一个值是否为ref对象isReactive&#xff1a; 检查一个对象是否由reactive创建的响应式代理**isReadonly&#xff1a;**检查一个对象是否由readonly创建的只读代理**isProxy&#xff1…

数据结构(七):树介绍及面试常考算法

一、树介绍 1、定义 树形结构是一种层级式的数据结构&#xff0c;由顶点&#xff08;节点&#xff09;和连接它们的边组成。 树类似于图&#xff0c;但区分树和图的重要特征是树中不存在环路。树有以下特点&#xff1a; &#xff08;1&#xff09;每个节点有零个或多个子节点…

为什么 GAN 不好训练

为什么 GAN 不好训练&#xff1f;先看 GAN 的损失&#xff1a; 当生成器固定时&#xff0c;堆D(x)求导&#xff0c;推理得到&#xff08;加号右边先对log求导&#xff0c;再对负项求导&#xff09; 然后在面对最优Discriminator时&#xff0c;Generator的优化目标就变成了&…

微积分-三角函数2

三角函数 在上一节中&#xff0c;讨论了如何在直角三角形中定义三角函数&#xff0c;限制让我们扩展三角函数的定义域。 事实上我们可以取任意角的正弦和余弦&#xff0c;而不只是局限于 0 0 0~ π 2 \frac{\pi}{2} 2π​当中。 当然需要注意的是&#xff0c;正切函数对不是对…

指数分布的随机变量

如果连续型随机变量的概率密度满足如下条件&#xff1a; 其中为常数&#xff0c;那么就称服从参数为的指数分布。 指数分布的重要性质---无记忆性&#xff1a;

数据结构(7.5)-- 树扩展之字典树

一、字典树 1、字典树介绍 字典树&#xff0c;也称为“前缀树”&#xff0c;是一种特殊的树状数据结构&#xff0c;对于解决字符串相关问题非常有效。典型 用于统计、排序、和保存大量字符串。所以经常被搜索引擎系统用于文本词频统计。它的优点是&#xff1a; 利用字符串的…

(1)(1.8) MSP(MultiWii 串行协议)(4.1 版)

文章目录 前言 1 协议概述 2 配置 3 参数说明 前言 ArduPilot 支持 MSP 协议&#xff0c;可通过任何串行端口进行遥测和传感器。这允许 ArduPilot 将其遥测数据发送到 MSP 兼容设备&#xff08;如大疆护目镜&#xff09;&#xff0c;用于屏幕显示&#xff08;OSD&#xff…

VR智慧眼:为各行业打造3D数字化业务协同平台

自改革开放以来&#xff0c;城镇化建设一直在不断推进实施&#xff0c;如今各城市化速度虽然在不断加快&#xff0c;但随之而来的部分城市开始出现资源短缺、环境污染、交通拥堵、安全隐患等问题&#xff0c;因此为了满足智慧城市大型区域场景数字化升级需求&#xff0c;助力区…

【深入浅出SpringCloud源码探究】「Netflix系列之Ribbon+Fegin」微服务化的负载均衡组件源码剖析与实战开发全流程(Ribbon篇)

微服务化的负载均衡组件源码剖析与实战开发全流程 什么是负载均衡负载均衡的种类服务器端负载均衡&#xff08;S-LB&#xff09;客户端负载均衡&#xff08;C-LB&#xff09;注解LoadBalancedLoadBalancerAutoConfiguration类LoadBalancerClient类源码分析 ServiceInstanceChoo…

ToolLLM model 以及LangChain AutoGPT Xagent在调用外部工具Tools的表现对比浅析

文章主要谈及主流ToolLLM 以及高口碑Agent 在调用Tools上的一些对比&#xff0c;框架先上&#xff0c;内容会不断丰富与更新。 第一部分&#xff0c;ToolLLM model 先来说主打Function Call 的大模型们 OpenAI GPT 宇宙第一LLM&#xff0c;它的functionCall都知道&#xff0…

python 小程序学生选课系统源码

开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 学生&#xff1a; 登录&#xff0c;选课&#xff08;查看课程及选择&#xff09;&#xff0c;我的成绩&#xff0c;…

Axure中动态面板使用及轮播图多种登录方式左侧导航栏之案列

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《产品经理如何画泳道图&流程图》 ⛺️ 越努力 &#xff0c;越幸运 目录 一、轮播图简介 1、什么是轮播图 2、轮播图有什么作用 3、轮播图有什么特点 4、轮播图适应范围 5、…

Elasticsearch磁盘占用大于95%时将所有索引置为只读

一个稳定运行的功能忽然收到报错,查明原因是在向Elasticsearch中插入文档时报错: AuthorizationException: AuthorizationException(403, ucluster_block_exception, ublocked by: [FORBIDDEN/12/index read-only / allow delete (api)];)网上也有其他人报TransportError: …

解决Chrome同一账号在不同设备无法自动同步书签的问题

文章目录 一、问题与原因&#xff1f;2. 解决办法 一、问题与原因&#xff1f; 1.问题 使用谷歌Chrome浏览器比较头疼的问题就是&#xff1a;使用同一个Google账号&#xff0c;办公电脑与家用电脑的数据无法同步。比如&#xff1a;办公电脑中的书签、浏览记录等数据&#xff0…

C语言----文件操作(二)

在上一篇文章中我们简单介绍了在C语言中文件是什么以及文件的打开和关闭操作&#xff0c;在实际工作中&#xff0c;我们不仅仅是要打开和关闭文件&#xff0c;二是需要对文件进行增删改写。本文将详细介绍如果对文件进行安全读写。 一&#xff0c;以字符形式读写文件&#xff…