当前位置: 首页 > news >正文

hadoop之旅6-windows本地MapReducer离线单词统计

通过上篇文章hadoop之旅5-idea通过maven搭建hdfs环境,相信大家都可以在idea上做hadoop访问hdfs文件系统的开发了。一个云盘其实就可以基于这样的系统做出来。有兴趣的大家可以试着自己去实战一下。

今天带大家在本地执行Mapreduce,进行单词个数的统计,一般用于调试。线上模式也很简单,只需要打好jar包,在线上服务通过 hadoop jar xxxx.jar 包名+类 命令执行即可,可自行探究

MapReduce

MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。他也属于hadoop的核心组件之一,hdfs是一个分布式文件系统,MapReduce就是一个分布式计算框架。专门为计算而生

最简单的流程图

  1. 读取文件
  2. map操作
  3. reduce操作
  4. 输出结果文件

详细过程图

在map,reduce中间还有一系列,合并,排序等等过程,系统会将复杂的数据进行整理筛选,最终到达我们需要用代码编写的业务端。我们一般情况做数据离线分析可以只考虑编写map端,reduce端即可。话不多说直接带大家上代码体会。

开始实现

1.首先

在准备好一个输入文件input.txt,放在项目任意一个目录下,我建的是SpringBoot项目放在resources下的map_input目录下

c	2
c++	1
java	2
python	1
复制代码

2.导入依赖

<properties>
	<hadoop.version>2.7.3</hadoop.version>
</properties>

<dependency>
	<groupId>org.apache.hadoop</groupId>
	<artifactId>hadoop-common</artifactId>
	<version>${hadoop.version}</version>
</dependency>
<dependency>
	<groupId>org.apache.hadoop</groupId>
	<artifactId>hadoop-client</artifactId>	
	<version>${hadoop.version}</version>
</dependency>
<dependency>
        <groupId>org.apache.hadoop</groupId>
	<artifactId>hadoop-hdfs</artifactId>
	<version>${hadoop.version}</version>
</dependency>
复制代码

3.准备自己map端

实现map端其实很简单,只需要创建一个类继承Mapper类,然后实现它的map方法即可。

public class MyMapper extends Mapper<Object, Text, Text, LongWritable> {
    /**
     *
     * @param key 当前行的标识(键),一般文件输入可以不用管
     * @param text 当前行的值
     * @param context 上下文内容
     * 文件内容:
     *  java,c++
     *  c,java
     *  python,c
     */
    @Override
    protected void map(Object key, Text text, Context context) throws IOException, InterruptedException {
        //拿到当前输入的行内容
        String line = text.toString();
        //拆分当前行,如 java,c++
        String[] lines = line.split(",");
        for (String word : lines) {
            /**
             * 也就是在map端,把输出置为: java 1,c 1,c++ 1等
             */
            context.write(new Text(word),new LongWritable(1));
        }
    }
}
复制代码

4.实现Reduce端

同理,继承Reducer类,实现reduce方法即可

/**
 * 前两个参数:reducer输入参数,即map输出的键,值集合(相同key的会整合在一起)
 * 后两个参数:reducer 输出的键,值(即最终结果)
 * 在reduce里做累加即可统计出每个单词的个数
 */
public class MyReduce extends Reducer<Text,LongWritable,Text,LongWritable>{
    @Override
    protected void reduce(Text key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException {
        /**
         * key,values
         * 以map里的输出的键值:如:map里输出的是:
         * c:[1,1]也可能是 c:[2] ,主要涉及MapReducer运行原理中的 分片合并 过程
         * c++:[1]
         * java:[1,1]也可能是java:[2]
         * python:[1]
         */
        long sum = 0; //该单词总共出现的次数
        for (LongWritable value : values) {
            sum+=value.get();
        }
        context.write(key,new LongWritable(sum)); //输出结果:如,c:2,java:1...
    }
}
复制代码

5. 实现客户端代码

调用代码很常规,基本上都是一样的模板

   public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
        Configuration conf = new Configuration();
        //线上运行在hadoop集群里需要配置
        //conf.set("fs.defaultFS", "hdfs://master:9000/");//主master访问路径
        //conf.set("mapreduce.framework.name", "yarn"); //运行框架yarn
        //conf.set("yarn.resourcemanager.hostname", "master"); //设置主机
        Job job = Job.getInstance(conf); //拿到一个作业job,来执行mapReduce
        //设置运行的主类
        job.setJarByClass(MapReduceClient.class);
        job.setJobName("wordCount"); //设置应用名称
        //设置输入文件的位置
        FileInputFormat.addInputPaths(job,"J:\\IDEA\\springboot-hadoop\\src\\main\\resources\\map_input");
        //设置输出文件的位置
        FileOutputFormat.setOutputPath(job,new Path("J:\\IDEA\\springboot-hadoop\\src\\main\\resources\\map_output"));
        //设置mapper类和reducer类
        job.setMapperClass(MyMapper.class);
        job.setReducerClass(MyReduce.class);

        //设置输入,输出类型,map和reduce是一样的话可以只写reducer的
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(LongWritable.class);

        //执行
        job.waitForCompletion(true);

    }
复制代码

在本地运行有个要求,需要本地hadoop的bin目录下拥有windows下的执行文件。大家可以下好hadoop之后直接解压,然后把windows执行包复制到bin目录即可

最终的运行结果如下

相关文章:

  • 获取全局上下文(getApplicationContext)_创建Shared Preference工具类_实现自动登录
  • 【火炉炼AI】机器学习053-数据降维绝招-PCA和核PCA
  • 兄弟连区块链教程Fabric1.0源代码分析Ledger(账本)一
  • 简单远程遥控程序【网络程序设计 - 简单远程遥控程序,C实现】
  • CStringArray error C2248: 'CObject::CObject' : cannot access private member declared in class
  • js 在光标处插入内容
  • fastcgi_param 详解
  • dup
  • 常用STL用法总结
  • SQLServer之事务简介
  • 个人笔记:ORACLE大页内存hugepage和SGA、PGA的经验,SGA并不是越大越好
  • JavaScript 类数组对象与 arguments
  • 点击按钮,找不到url
  • WPF模板(一)详细介绍
  • 猿课python第二天
  • [LeetCode] Wiggle Sort
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • FineReport中如何实现自动滚屏效果
  • github指令
  • HTML-表单
  • HTTP请求重发
  • Java 多线程编程之:notify 和 wait 用法
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • Java面向对象及其三大特征
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • python3 使用 asyncio 代替线程
  • 阿里云购买磁盘后挂载
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 诡异!React stopPropagation失灵
  • 技术:超级实用的电脑小技巧
  • 警报:线上事故之CountDownLatch的威力
  • 面试遇到的一些题
  • 排序(1):冒泡排序
  • 使用 Docker 部署 Spring Boot项目
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 一份游戏开发学习路线
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • ​卜东波研究员:高观点下的少儿计算思维
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • $GOPATH/go.mod exists but should not goland
  • (13)Hive调优——动态分区导致的小文件问题
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (分布式缓存)Redis分片集群
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (转)jQuery 基础
  • ... 是什么 ?... 有什么用处?
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选