Hadoop学习笔记之WordCount

        WordCount是hadoop的一个入门程序,其地位相当与java中的HelloWorld,它使用map/reduce对文本中出现的单词进行计数。

 

    程序分三个部分:

    Map类  Reduce类 和主函数

    Map类:Map类继承Mapreducebase类并实现了Mapper接口,其中 MapReduceBase类:实现了Mapper和Reducer接口的基类(其中的方法只是实现接口,而未作任何事情)。Map在实现Mapper接口之后重写其map方法,将输入的<k1/v1>进行处理生成<k2/v2>作为reduce输入。

  Reduce类:同样继承MapReduceBase类。实现Reducer接口,重写reduce()方法,将输入的<k2/v2>进行处理生成<k3/v3>输出。

  主函数 :主函数是程序的入口,生成JobConf对象向hadoop框架描述map/reduce执行的工作。

 

源码详细分析:一、Map类, Map类实现了Mapper接口并对map()方法进行了重写。

 public static class Map extends MapReduceBase implements  
            Mapper<LongWritable, Text, Text, IntWritable> 
 //Mapper<k1,v1,k2,v2> k  v 表示输入和输出的数据类型,其中k1应为Object或者LongWritable
,因为map在读取文本时是一行一行读取的。
    {  
        private final static IntWritable one = new IntWritable(1);//将每个单词的数量都设成1.  
        private Text word = new Text();  //Text一个变量相当于String,用来存储传来的文本的值
        public void map(LongWritable key, Text value,  
                OutputCollector<Text, IntWritable> output, Reporter reporter)  
                throws IOException  //具体的map函数在每个节点上执行,将<k1/v1>处理成<k2/v2>用output.collect()输出给
Reduce。
        {  
            String line = value.toString();  //将Text类型转换成String
            StringTokenizer tokenizer = new StringTokenizer(line); //再转换成StringTokenizer 
            while (tokenizer.hasMoreTokens())  //当文本有分割符时
            {  
                word.set(tokenizer.nextToken());  //返回从当前位置到下一个分割符的字符串
                output.collect(word, one);  
            }  
        }  
    }  
比如一行文本: welcome to lanjie  laijie lead to success
Map进行处理之后的结果是:
welcome 1
to 1
lanjie 1
lanjie 1
lead 1
to 1
success 1

二、Reduce类

 public static class Reduce extends MapReduceBase implements  
            Reducer<Text, IntWritable, Text, IntWritable>  //<Text, IntWritable, Text, IntWritable>字段对应
着<k2,v2,k3,v3>
    {  
        public void reduce(Text key, Iterator<IntWritable> values,  
                OutputCollector<Text, IntWritable> output, Reporter reporter)  
                throws IOException  //Text key, Iterator<IntWritable> values 对应从map传来的<k2/v2>,
 OutputCollector<Text, IntWritable> output用来保存结果
        {  
            int sum = 0;  
            while (values.hasNext())  
            {  
                sum += values.next().get();  //计算每个key的数量,得到总数保存在sum中
            }  
            output.collect(key, new IntWritable(sum)); //将数据写到文件中 
        }  
    }  
比如:welcome to lanjie laijie lead to success
输出
lanjie 2
lead 1
success 1
to 2
welcome 1
系统默认排序为升序。
        

三、主函数

 //程序的入口,即住函数
    public static void main(String[] args) throws Exception  
    {  
    	String path1="hdfs://master:9000/xiong/test";//要统计的文件
    	String path2="hdfs://master:9000/xiong/result";//保存结果的文件
    	
        /** 
         * JobConf:map/reduce的job配置类,向hadoop框架描述map-reduce执行的工作 
         * 构造方法:JobConf()、JobConf(Class exampleClass)、JobConf(Configuration conf)等 
         */  
        JobConf conf = new JobConf(WordCount.class);  
        conf.setJobName("wordcount");           //设置一个用户定义的job名称  
  
        conf.setOutputKeyClass(Text.class);    //为job的输出数据设置Key类  
        conf.setOutputValueClass(IntWritable.class);   //为job输出设置value类  
  
        conf.setMapperClass(Map.class);         //为job设置Mapper类  
        conf.setCombinerClass(Reduce.class);      //为job设置Combiner类  
        conf.setReducerClass(Reduce.class);        //为job设置Reduce类  
  
        conf.setInputFormat(TextInputFormat.class);    //为map-reduce任务设置InputFormat实现类  
        conf.setOutputFormat(TextOutputFormat.class);  //为map-reduce任务设置OutputFormat实现类  
  
        /** 
         * InputFormat描述map-reduce中对job的输入定义 
         * setInputPaths():为map-reduce job设置路径数组作为输入列表 
         * setInputPath():为map-reduce job设置路径数组作为输出列表 
         */  
        FileInputFormat.setInputPaths(conf, new Path(path1));  
        FileOutputFormat.setOutputPath(conf, new Path(path2));  
  
        JobClient.runJob(conf);         //运行一个job  
    }  
    
    

}

具体完整代码如下:

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

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.FileInputFormat;
import org.apache.hadoop.mapred.FileOutputFormat;
import org.apache.hadoop.mapred.JobClient;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.MapReduceBase;
import org.apache.hadoop.mapred.Mapper;
import org.apache.hadoop.mapred.OutputCollector;
import org.apache.hadoop.mapred.Reducer;
import org.apache.hadoop.mapred.Reporter;
import org.apache.hadoop.mapred.TextInputFormat;
import org.apache.hadoop.mapred.TextOutputFormat;


public class WordCount{
    public static class Map extends MapReduceBase implements  
            Mapper<LongWritable, Text, Text, IntWritable>  
    {  
        private final static IntWritable one = new IntWritable(1);  
        private Text word = new Text();  
        public void map(LongWritable key, Text value,  
                OutputCollector<Text, IntWritable> output, Reporter reporter)  
                throws IOException  
        {  
            String line = value.toString();  
            StringTokenizer tokenizer = new StringTokenizer(line);  
            while (tokenizer.hasMoreTokens())  
            {  
                word.set(tokenizer.nextToken());  
                output.collect(word, one);  
            }  
        }  
    }  
    /**
     * 这是一个实现reduce的类
     * @author hadoop
     *
     */
    public static class Reduce extends MapReduceBase implements  
            Reducer<Text, IntWritable, Text, IntWritable>  
    {  
        public void reduce(Text key, Iterator<IntWritable> values,  
                OutputCollector<Text, IntWritable> output, Reporter reporter)  
                throws IOException  
        {  
            int sum = 0;  
            while (values.hasNext())  
            {  
                sum += values.next().get();  
            }  
            output.collect(key, new IntWritable(sum)); //将数据写到文件中 
        }  
    }  
    //程序的入口,即住函数
    public static void main(String[] args) throws Exception  
    {  
    	String path1="hdfs://master:9000/xiong/test";//要统计的文件
    	String path2="hdfs://master:9000/xiong/result";//保存结果的文件
    	
        /** 
         * JobConf:map/reduce的job配置类,向hadoop框架描述map-reduce执行的工作 
         * 构造方法:JobConf()、JobConf(Class exampleClass)、JobConf(Configuration conf)等 
         */  
        JobConf conf = new JobConf(WordCount.class);  
        conf.setJobName("wordcount");           //设置一个用户定义的job名称  
  
        conf.setOutputKeyClass(Text.class);    //为job的输出数据设置Key类  
        conf.setOutputValueClass(IntWritable.class);   //为job输出设置value类  
  
        conf.setMapperClass(Map.class);         //为job设置Mapper类  
        conf.setCombinerClass(Reduce.class);      //为job设置Combiner类  
        conf.setReducerClass(Reduce.class);        //为job设置Reduce类  
  
        conf.setInputFormat(TextInputFormat.class);    //为map-reduce任务设置InputFormat实现类  
        conf.setOutputFormat(TextOutputFormat.class);  //为map-reduce任务设置OutputFormat实现类  
  
        /** 
         * InputFormat描述map-reduce中对job的输入定义 
         * setInputPaths():为map-reduce job设置路径数组作为输入列表 
         * setInputPath():为map-reduce job设置路径数组作为输出列表 
         */  
        FileInputFormat.setInputPaths(conf, new Path(path1));  
        FileOutputFormat.setOutputPath(conf, new Path(path2));  
  
        JobClient.runJob(conf);         //运行一个job  
    }  
    
    

}
 

 

   

hadoop学习笔记:运行wordcount对文件字符串进行统计案例 在开头跟大家分享的时候我就说,面试我是没有做好准备的,全靠平时的积累,确实有点临时抱佛脚了,以至于我自己还是挺懊恼的。(准备好了或许可以拿个40k,没做准备只有30k+,你们懂那种感觉吗)如何准备面试?1、前期铺垫(技术沉积)程序员面试其实是对于技术的一次摸底考试,你的技术牛逼,那你就是大爷。大厂对于技术的要求主要体现在:基础,原理,深入研究源码,广度,实战五个方面,也只有将原理理论结合实战才能把技术点吃透。 阅读详情

相关推荐

hadoop实现wordcount的三种方法

很多小伙伴在搭建完hadoop集群后,还不太会在上面跑测试程序,作为大数据入门学习的Hello world程序,我总结了三种方法。 第一种:用hadoop上自带的jar包(hadoop-mapreduce-examples-2.7.0.jar)实现 第二种:不用自带的包,我们自己导出JAR包,在集群中运行(3个java源程序,我这里就不提供了) 第三种:在IDE中运行,eclipse怎么连接集群请参考这篇博文:http://blog.youkuaiyun.com/dopamy_busymonkey/article/de

cai_4399的博客 1万+

数据挖掘实验:使用 Hadoop 实现 WordCount 应用

数据挖掘实验:使用 Hadoop 实现 WordCount 应用

ProgramNovice的博客 9155

电脑蓝牙与ESP32蓝牙连接,让电脑发现ESP32

让PC发现ESP32蓝牙

injre! injre~ 5449

hadoop wordcount

wordcount

yandao的博客 2820

利用makehumancommunity导入人体模型到COMSOL里(需要solidwork)

#makehumancommunity #solidwork #COMSOL

qq_41227634的博客 2158

未来智能家居解决方案:AI应用架构师的前沿探索

当你加班到深夜回家时,门锁自动识别你的脚步声解锁,玄关灯渐亮成你最爱的暖光,空调早已调到25℃(你夏天的习惯温度),音箱播放着最近循环的爵士乐,茶几上的智能水壶烧好了温水——这不是科幻电影,而是未来智能家居的日常。如何让“冰冷的设备”变成“懂你的伙伴”。我们将深入探讨五大前沿技术(边缘AI、多模态融合、联邦学习、数字孪生、个性化推荐)的底层原理,用“家里的小管家”“邻居互相学习”等生活化比喻简化复杂概念,结合代码示例与架构图还原实现流程,并通过智能卧室、智能厨房等真实案例展示落地路径。

AI天才研究院 1411

Hadoop学习笔记(1):WordCount程序的实现与总结

Hadoop中的HelloWord--WordCount!!!!!

JD_Beatles的专栏 711

RK3588 实战级 YOLOv5 Android 全解析:NPU 量化 + 多线程 + 跟踪算法,源码一次买齐

本文将带你完成一个完整的AI视觉项目:在搭载RK3588芯片的Android开发板上运行实时目标检测与跟踪应用。实战目标:成功运行官方YOLOV5摄像头实时检测案例技术深度:深入理解RKNN开发框架和源码实现核心技能:掌握NPU推理、多线程并发、目标跟踪等关键技术。

FJN110的博客 157

hadoop学习笔记(三)mapreduce程序wordcount

Mapreduce程序WordCount 参考: http://www.cnblogs.com/xia520pi/archive/2012/05/16/2504205.html http://www.cnblogs.com/taven/archive/2012/11/03.html http://luluq1987.blog.163.com/blog/static/407906812011

ptrdu的专栏 1338

SLAM Cartographer(18)后端优化问题求解器

了解经过闭环检测构建了子图与节点之间的约束之后,通过后端优化求解器进行优化求解。核心是基于Ceres库进行SPA(Sparse Pose Adjustment)的优化方法,把后端优化问题描述成为一个最小二乘的问题求解

氢键H-H 5681

基于Python的雪球网投资组合数据爬取与分析实战:从入门到精通

在当今数字化投资时代,数据已成为投资者最重要的资产之一。雪球网作为中国领先的投资社交平台,汇聚了大量优质的投资组合数据,这些数据对于量化投资研究和个人投资决策具有重要价值。本文将详细介绍如何使用Python最新技术栈构建一个高效、稳定的雪球网投资组合爬虫,并深入分析获取的数据。投资组合持仓明细及变动历史投资收益率曲线与风险指标投资者操作策略与调仓频率热门行业与个股关注度。

2201_76125261的博客 920

菜鸟的Hadoop (Before YARN) 学习笔记 (一) WordCount

Hadoop wordCount

lemongrassstaste的专栏 527

【Dify】PPT生成工具应用

本文介绍了一款自动化PPT生成工具,通过智能接口将文本内容高效转化为结构化演示文档。该系统采用三阶段工作流(内容输入、HTTP请求上传、文件输出),无需复杂操作即可生成专业PPT。工具适用于教学课件、产品发布、企业培训等场景,能显著提升内容表达效率,特别适合初学者快速制作演示材料。文章详细说明了核心节点、应用场景及开发资源,为文本到PPT的自动化转换提供了实用解决方案。

Mr数据杨 1218

【转】Hadoop学习笔记(1):WordCount程序的实现与总结

原文地址:Hadoop学习笔记(1):WordCount程序的实现与总结

TRX的博客 373

AUTOSAR-SOMEIP配置总结

导入arxml之后someip信号一般以“pduSomeIp”开头或者“SomeIp”开头。以某个pdu为例,设置项“Pdu Default Partition Ref”主要是根据模块设计,配置相应的Ecuc核分区。在导入arxml之后someip信号中有三个特殊的信号,形如“SdInstance”开头的信号,设置项“Pdu Default Partition Ref”主要是根据模块设计,配置相应的Ecuc核分区。“EcuC”模块主要关注“EcucPduCollection”中的“Pdus”下面的配置。

xiandang8023的博客 4655

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【hadoop 学习笔记-2】wordcount 完整实例

开发工具 IDEA 创建Maven项目 New Project-> Maven ,取名为 WordCountDemo ,然后点Finish即可。 POM.XML中添加项目依赖 <dependencies> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-c...

金戈铁马 2345

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Hadoop学习笔记——简介及WordCount

注:此文摘自方宸 2013.06.09 ppt Hadoop简介 •Hadoop集群是主从关系:一个Master,多个Slave •Master充当NameNode,管理文件系统,运行着JobTracker,负责整个作业的调度。 •Slave充当DataNode,是数据存储的真正所在地,运行着TaskTracker,负责完成由JobTracker分配过来的任务。

u011497897的博客 509

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

hadoop学习笔记之wordcount

package cn.yws; 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;

云守护的专栏 988

WordCount实现--Hadoop学习笔记

首先添加依赖pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apac

liuliusix的博客 193

【hadoop 学习笔记-1】wordcount 遇到的问题记录

问题一: FileInputFormat.setInputPaths(xx,xx) FileOuputFormat.setOutputPath(xx, xx) 这两行报错,参数不匹配。 解决: 导入的类不对,IDEA默认导入的FileInputFormat和FileOuputFormat不对, 修改为 import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapred...

金戈铁马 470

Hadoop MapReduce(WordCount)学习笔记七

MapReduce是一种程序开发模式,可以使用大量服务器来并行处理。MapReduce,简单地说,Map就是分配工作,Reduce就是将工作结果汇总整理。 ·首先使用Map将待处理的数据分割成很多的小分数据,由每台服务器分别运行。再通过Reduce程序进行数据合并,最后汇总整理出结果。 本章将以WordCount.java作为范例来介绍MapReduce。 7.1简单介绍WordCount.jav...

停止的闹钟博客 233

Hadoop学习笔记——WordCount

1.在IDEA下新建工程,选择from Mevan GroupId:WordCount ArtifactId:com.hadoop.1st Project name:WordCount 2.pom.xml文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.o...

weixin_30502965的博客 153

Hadoop学习笔记API(1)wordcount

package com.zhangbk.mapreduce; import java.io.IOException; import java.util.StringTokenizer; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.conf.Configured; import org.apache...

磨刀大神的博客 222

hadoop学习笔记-3-运行wordcount示例

1.      启动hadoop,运行命令:start-all.sh 2.      在Linux创建输入目录和文件, mkdir ~/input cd ~/input echo “hello world” > text1.txt echo “hello hadoop” > text2.txt 3.      将文件目录拷贝至hdfs中的in目录,并查看是否拷贝成功 hadoop f

专注 1163
上一篇: I/O应用之24位真彩BMP文件的读取
下一篇: File应用之文件搜索器(关键字搜索)
rootke
博客等级 码龄12年 1粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值