B站视频操作过程

Hadoop实战——对单词文本进行统计和排序_哔哩哔哩_bilibili

更多MapReduce设计案例地址

https://github.com/yuanprogrammer/MapReduce-Case-Statistics

目录

一、前提准备工作

启动hadoop集群

windows可以访问

二、整体流程

三、核心代码讲解

四、生成jar包上传

五、运行程序

Gitee仓库Hadoop项目下载地址

其他系列技术教学、实战开发



一、前提准备工作

启动hadoop集群

必须已经成功搭建好了hadoop集群,打开主节点和子节点全部虚拟机,启动hadoop

windows可以访问

关闭主节点虚拟机的防火墙,在windows的hosts文件添加配置信息

二、整体流程

整体流程如下

程序内部执行过程如下

三、核心代码讲解

Mapper类

将单词文本进行切割,切割成一个个的单词,写入到上下文中

(1)按行读取,通过split函数进行切割,将切割出来的一个个单词放到数组ars中

(2)遍历数组ars,将存在的单词数据存储到word中,然后将word写入到context上下文(使Redcue程序能访问到数据)

​​​​​​​​

package com.itcast;import java.io.IOException;
import java.util.Date;import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;/*** FileName:    WordMapper* Author:      Yuan-Programmer* Date:        2021/11/8 23:29* Description:*/
// 创建一个 WordMapper类 继承于 Mapper抽象类
public class WordMapper extends Mapper<Object, Text, Text, IntWritable> {private final static IntWritable one = new IntWritable(1);private Text word = new Text();// Mapper抽象类的核心方法,三个参数public void map(Object key, // 首字符偏移量Text value, // 文件的一行内容Context context) // Mapper端的上下文,与 OutputCollector 和 Reporter 的功能类似throws IOException, InterruptedException {String[] ars = value.toString().split("['.;,?| \t\n\r\f]");for (String tmp : ars) {if (tmp == null || tmp.length() <= 0) {continue;}word.set(tmp);System.out.println(new Date().toGMTString() + ":" + word + "出现一次,计数+1");context.write(word, one);}}
}

Reduce类(部分代码展示)

(1)将每个单词统计次数结果进行求和合并,写入到map集合里

(2)调用Utils工具类的sortValue方法对map集合进行排序

(3)遍历排序好的map集合,依次写入到context上下文中

​​​​​​​​

package com.itcast;import java.io.IOException;
import java.util.*;import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;/*** FileName:    WordReduce* Author:      Yuan-Programmer* Date:        2021/11/8 23:32* Description:*/
// 创建一个 WordReducer类 继承于 Reducer抽象类
public class WordReducer extends Reducer<Text, IntWritable, Text, IntWritable> {private IntWritable result = new IntWritable(); // 用于记录 key 的最终的词频数HashMap<String, Integer> map = new HashMap();// Reducer抽象类的核心方法,三个参数public void reduce(Text key, // Map端 输出的 key 值Iterable<IntWritable> values, // Map端 输出的 Value 集合(相同key的集合)Context context) // Reduce 端的上下文,与 OutputCollector 和 Reporter 的功能类似throws IOException, InterruptedException {int sum = 0;for (IntWritable val : values) // 遍历 values集合,并把值相加{sum += val.get();}map.put(key.toString(), sum);System.out.println(new Date().toGMTString() + ":" + key + "出现了" + result);}@Overrideprotected void cleanup(Context context) throws IOException, InterruptedException {//  根据map中的value进行排序Map<String, Integer> sortedMap = MapUtils.sortValue(map);Set<Map.Entry<String, Integer>> entries = sortedMap.entrySet();Iterator<Map.Entry<String, Integer>> it = entries.iterator();/*** 不设置count,对全部单词进行排序* 循环获取迭代器的Map对象,再获取对应K,V* 将K,V封装到上下文中*/while (it.hasNext()) {//  获取MapMap.Entry<String, Integer> entry = it.next();String key = entry.getKey();Integer value = entry.getValue();//  封装k3,v3Text k3 = new Text();k3.set(key);IntWritable v3 = new IntWritable();v3.set(value);//  写入上下文context.write(k3, v3);}}
}

 Utils类(对map进行排序)

(1)继承Comparable类,复写compare方法

(2)通过map<k,v>集合的value(也就是单词次数)进行排序

(3)将排序好的map返回

package com.itcast;/*** FileName:    MapUtils* Author:      Yuan-Programmer* Date:        2021/11/9 0:05* Description:*/import java.util.*;/**•    Map工具类*/
public class MapUtils {/**– 根据Map的value值降序排序–   @param map–    @param–    @param–    @return*/public static <K, V extends Comparable<? super V>> Map<K, V> sortValue(Map<K, V> map) {List<Map.Entry<K, V>> list = new ArrayList(map.entrySet());Collections.sort(list, new Comparator<Map.Entry<K, V>>() {@Overridepublic int compare(Map.Entry<K, V> o1, Map.Entry<K, V> o2) {/*** o1-o2:升序* o2-o1:降序* 返回结果加上“-”表示取反操作(升序->降序,降序->升序)*/int compare = (o1.getValue()).compareTo(o2.getValue());return -compare;}});//将排序结果返回上一级Map<K, V> returnMap = new LinkedHashMap<K, V>();for (Map.Entry<K, V> entry : list) {returnMap.put(entry.getKey(), entry.getValue());}return returnMap;}
}

新建一个测试类测试一下,可以看到排序OK

四、生成jar包上传

先点击右边的 clean 清理一下,然后点击 package 生成打包jar包

运行完毕,会在左边生成一个 target 的文件夹,展开可以看到生成jar包程序

选中jar包,右键选择复制,粘贴到桌面

打开 winscp 工具,连接主节点虚拟机,将刚刚粘贴在桌面的jar包拷贝到虚拟机里(路径自己选,知道在哪就行)

打开虚拟机,跳转到刚刚复制的路径目录下,可以看到已经拷贝进来了

五、运行程序

(1)创建单词文本并上传

在下面可以看到有一个words.txt文本,这是我之前创好的

more指令查看文本,可以看到文本里有很多的英文单词

(2)上传到HDFS文件系统

首先创建一个文件夹存放统计前的单词文本(words.txt)

将单词文本(words.txt)上传到刚刚创建的文件夹下

执行jar包程序,hadoop   jar   jar包名称   包名称+主类名   输入路径   输出路径

包名称+主类名如下

回车执行命令,等待提示运行完毕,运行结束后

打开HDFS文件系统的output目录下,就能看到输出结果,打开文件点击Download下载

以文本方式打开,可以看到已经对单词进行了统计并且对其进行降序操作

Gitee仓库Hadoop项目下载地址

Gitee仓库地址:Hadoop实战项目源码集合: https://blog.csdn.net/weixin_47971206CSDN文章教学中的源码汇总集合

其他系列技术教学、实战开发

https://github.com/yuanprogrammer/MapReduce-Case-Statistics


- 本次文章分享就到这,有什么疑问或有更好的建议可在评论区留言,也可以私信我
- 感谢阅读~


Hadoop实战——MapReduce对英文单词文本进行统计和排序(超详细教学,算法分析)相关推荐

  1. 【云计算与大数据技术】Hadoop MapReduce的讲解(图文解释,超详细必看)

    一.Hadoop MapReduce架构 MapReduce 是一种分布式计算框架,能够处理大量数据 ,并提供容错 .可靠等功能 , 运行部署在大规模计算集群中,MapReduce计算框架采用主从架构 ...

  2. Hadoop实战——MapReduce实现主播的播放量等数据的统计及TopN排序(第一篇)

    本次实战项目一共分三篇教学(二三篇后续更新) 第一篇:对主播文本数据的清洗,从大量数据中获取我们所需要的数据(如播放量,时长等) 第二篇:对清洗后的数据进行统计求和处理操作,按照主播id号依次整齐显示 ...

  3. MapReduce基础开发之一词汇统计和排序(wordcount)

    统计/var/log/boot.log中含k的字符的数量,并对含k的字符按照数量排序.需分两个job完成,一个用来统计,一个用来排序. 一.统计 1.上传文件到hadoop:    1)新建文件夹:h ...

  4. 【Android App】人脸识别中扫描识别二维码实战解析(附源码和演示 超详细)

    需要源码请点赞关注收藏后评论区留言私信~~~ 一.扫描识别二维码 不仅可以利用zxing库生成二维码,同样利用zxing库可以扫描二维码并解析得到原始文本,此时除了给build.gradle添加如下一 ...

  5. Android开发系列——实战篇5:自适应屏幕尺寸(超详细教程)

    在实战篇4中构建了界面之后,在模拟器中完好的布局,在实际下载到手机上的时候,却出现了布局不协调的问题. 在模拟器Nexus6上的布局界面: 在真机HUWEI P10 Plus上的布局界面: 在真机HU ...

  6. 利用python爬取租房信息_Python爬虫实战(1)-爬取“房天下”租房信息(超详细)

    #前言html 先看爬到的信息:python 今天主要用到了两个库:Requests和BeautifulSoup.因此我先简单的说一下这两个库的用法,提到的都是此文须要用到的.编程 #Requests ...

  7. 【Android App】勾勒出三维立方体和球体以及它们的转动图形讲解及实战(附源码和演示视频 超详细)

    需要源码或运行有问题请点赞关注收藏后评论区留言~~~ 一.轮廓勾勒 勾勒三维物体轮廓线条的步骤如下: (1)调用glEnableClientState方法启用顶点开关 (2)调用glVertexPoi ...

  8. Python爬虫实战(1)-爬取“房天下”租房信息(超详细)

    前言 先看爬到的信息: 今天主要用到了两个库:Requests和BeautifulSoup.所以我先简单的说一下这两个库的用法,提到的都是此文需要用到的. Requests requests是一个很实 ...

  9. 【Android App】利用腾讯地图获取地点信息和规划导航线路讲解及实战(附源码和演示视频 超详细必看)

    需要源码请点赞关注收藏后评论区留言~~~ 一.获取地点信息 至于如何集成腾讯地图和调用腾讯地图接口此处不再赘述,有需要请参见我之前的博客 腾讯地图用来搜索POI地点的工具是TencentSearch, ...

最新文章

  1. 1、Kubernetes 简介
  2. 这些片段在Android编程中很有用 (ZT)
  3. 趣谈网络协议笔记-二(第十讲)
  4. mse函数(均方误差函数)
  5. flink 自定义 窗口_【Flink 精选】阐述 Watermark 机制,剖析 Watermark 的产生和传递流程...
  6. c++primer书上习题date类的部分源代码(待整理)
  7. 保护个人信息需出“重典”
  8. 华为ensp命令大全_电脑网络:华为交换机基础知识及基本命令配置大全,新手的福音...
  9. mysql自动拉入黑名单_利用MySQL实现域名黑名单过滤10W记录1ms匹配
  10. 伪响应式开发(PC和Mobile分离)
  11. 推荐几个机器学习的干货公众号!
  12. MySQL表空间碎片产生原因和优化
  13. python数据挖掘入门与实践-第一章-用最简单OneR算法对Iris植物分类
  14. LVM 'Can’t open /dev/sdb1 exclusively. Mounted filesystem?' Problem
  15. Vue里的ElementUi点击行 如何获取 Table 的行索引
  16. epoll的反应堆实现模式
  17. 第4期:大学生提前职业技能准备之一
  18. visualGDB配合VS2015使用,出现函数内部局部变量无法跳转到定义的解决方法。
  19. Microchip中文资料下载 .
  20. js设置页面语音播放

热门文章

  1. Arduino语法详解,部分带注释(学习笔记)
  2. 播放失败246106异常代码_美的燃气热水器修理分享(附代码解释)
  3. lammps 案例in文件汇总
  4. 20本英文书点亮你的人生智慧
  5. GameFramework篇:Font texture for dynamic font MainFont is missing. Please reimport the Font. All dyna
  6. 教你如何用免费软件来发布活动直播
  7. 换行样式不要首行缩进_正文样式设置必看:你知道最好不要直接在正文样式中设置首行缩进吗...
  8. [Practical.Vim(2012.9)].Drew.Neil.Tip09学习摘要
  9. 如何教幼儿园孩子学10以内的加减法
  10. 【高中数学】三棱锥体积公式