Hadoop实战——MapReduce-字符统计(超详细教学,算法分析)

目录

一、前提准备工作

启动hadoop集群

二、实验过程

1.虚拟机安装先设置端口转发

2.上传对应文件

3.编写Java应用程序

4. 编译打包程序

5. 运行程序

三、算法设计和分析

算法设计

算法分析

四、实验总结


实验目的:给定一份英文文本,统计每个字符在文本中出现的频率

完成时间:2024-4-22

一、前提准备工作

启动hadoop集群

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

第一步:首先登陆ssh,之前设置了无密码登陆,因此这里不需要密码;再切换目录至/usr/local/hadoop ;再启动hadoop,如果已经启动hadoop请跳过此步骤。命令如下:

ssh localhost
cd /usr/local/hadoop
./sbin/start-dfs.sh

启动成功,输入命令jps,能看到NameNode,DataNode和SecondaryNameNode都已经成功启动,表示hadoop启动成功,截图如下:

访问web界面

二、实验过程

实验流程图:

1.虚拟机安装先设置端口转发

虚拟机设置端口转发SSH使用22端口,将虚拟子机的22端口映射到主机的2022端口;9870端口是hadoop的web查看端口;9864是hadoop提供的下载文件的端口,虚拟机机IP地址根据自身实际情况来更改

2.上传对应文件

上传Windows对应的英文文件到Linux虚拟机中去,使用scp命令将文件上传到虚拟子机的/tmp目录,如图所示

通过ls命令进行查看,前后对比,发现文本成功上传

ls

3.编写Java应用程序

如果遇到这个问题,可以按照这个步骤进行解决
具体情况可参考这篇

彻底解决关于gedit的Unable to init server: Could not connect: Connection refused-CSDN博客

xhost local:gedit
export DISPLAY=:0
xhost local:gedit

如图,出现"non-network local connections being added to access control list",表示问题已解决

向该文件中输入完整的程序代码,具体如下:

import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
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.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 CharacterCount {// Mapper 类,处理输入文件的每一行,并将字符逐个传递给 Reducerpublic static class CharMapper extends Mapper<LongWritable, Text, Text, IntWritable> {private final static IntWritable one = new IntWritable(1);// map 方法将输入的每一行文本拆分为字符,并将每个字符写入上下文public void map(LongWritable key, Text value, Context context)throws IOException, InterruptedException {// 将输入行转换为小写以实现不区分大小写String line = value.toString().toLowerCase();for (int i = 0; i < line.length(); i++) {char c = line.charAt(i);// 检查字符是否为字母或数字,如果是,则将其写入上下文进行统计if (Character.isLetter(c) || Character.isDigit(c)) {context.write(new Text(String.valueOf(c)), one);}}}}// Reducer 类,接收来自 Mapper 的字符统计数据并进行合并public static class CharReducerextends Reducer<Text, IntWritable, Text, IntWritable> {private IntWritable result = new IntWritable();// reduce 方法将相同字符的统计数据合并为总数,并写入输出上下文public void reduce(Text key, Iterable<IntWritable> values, Context context)throws IOException, InterruptedException {int sum = 0;for (IntWritable val : values) {sum += val.get();}result.set(sum);context.write(key, result);}}// 主函数,设置作业的配置信息,并运行 MapReduce 任务public static void main(String[] args) throws Exception {Configuration conf = new Configuration();Job job = new Job(conf, "character count");job.setJarByClass(CharacterCount.class);job.setMapperClass(CharMapper.class);job.setReducerClass(CharReducer.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);FileInputFormat.addInputPath(job, new Path(args[0])); // 设置输入路径FileOutputFormat.setOutputPath(job, new Path(args[1])); // 设置输出路径System.exit(job.waitForCompletion(true) ? 0 : 1); // 运行作业并等待完成}
}

4. 编译打包程序

编译

 javac -classpath `/usr/local/hadoop/bin/hadoop classpath` CharacterCount.java 

打包

jar cf CharacterCount.jar *.class

5. 运行程序

在启动Hadoop之后,需要首先删除HDFS中与当前Linux用户hadoop对应的input和output目录(即HDFS中的“/user/hadoop/input”和“/user/hadoop/output”目录),这样确保后面程序运行不会出现问题,具体命令如下:

cd /usr/local/hadoop
./bin/hdfs dfs -rm -r input
./bin/hdfs dfs -rm -r output

然后,再在HDFS中新建与当前Linux用户hadoop对应的input目录,即“/user/hadoop/input”目录,具体命令如下:

cd /usr/local/hadoop
./bin/hdfs dfs -mkdir input

可以打开web进行查看,已成功建立input目录

然后,把Linux中1.txt(此处位于“/tmp”目录下),上传到HDFS中的“/user/hadoop/input”目录下,命令如下:

cd /usr/local/hadoop
./bin/hdfs dfs -put /tmp/1.txt input

可以打开web页面进行查看,已成功上传至input目录

HDFS中已经存在目录“/user/hadoop/output”,则使用如下命令删除该目录:

cd /usr/local/hadoop
./bin/hdfs dfs -rm -r /user/hadoop/output

现在,就可以在Linux系统中,使用hadoop jar命令运行程序,命令如下

cd ~
/usr/local/hadoop/bin/hadoop jar CharacterCount.jar CharacterCount input output

统计计结果已经被写入了HDFS的“/user/hadoop/output”目录中,可以执行如下命令查看结果:

cd /usr/local/hadoop
./bin/hdfs dfs -cat output/*

三、算法设计和分析

算法设计

  1. Mapper阶段

    • 每行文本被分割成字符,并且每个字符被映射为键值对 (字符, 1)
    • 在这个阶段,我们忽略了非字母和非数字的字符,只关注英文字母和数字的统计。
  2. Reducer阶段

    • Reducer接收到相同字符的键值对列表。
    • 它将这些值求和,以计算每个字符在整个文本中的出现次数。
    • 最后,输出结果为 (字符, 出现次数) 的键值对。

算法分析

  • 可扩展性:Hadoop MapReduce框架具有良好的可扩展性,可以处理大规模数据集。
  • 并行处理:Map阶段可以并行处理不同的文本行,而Reducer阶段可以并行处理不同的字符组。
  • 容错性:Hadoop提供了自动的任务重试和容错机制,以处理节点故障或其他异常情况。
  • 局限性:这个算法对于包含大量非字母和非数字字符的文本可能不太适用,因为它忽略了这些字符,导致统计不准确。此外,这个实现不考虑分布式环境下的性能优化,比如使用Combiner来减少中间数据传输量。

总体而言,这个算法在处理大型英文文本时表现良好,但在处理非英文文本或需要更精确统计的情况下可能需要进一步改进

四、实验总结

在本次实验中,我们使用Hadoop MapReduce框架统计了给定英文文本中每个字符的出现频率;整个过程可以分为几个步骤:

1. 准备工作:启动Hadoop集群,并上传所需文件
2. 编写Java应用程序:我们编写了一个Java程序,其中包括Mapper和Reducer类,分别用于处理输入文本和进行字符统计
3. 编译打包程序:将Java程序编译成可执行的Jar包
4. 运行程序:在Hadoop集群上运行MapReduce任务,将输入文本分析并得出结果
5. 算法设计和分析:我们设计了一个简单但有效的算法,利用MapReduce框架对文本进行字符频率统计,并分析了算法的可扩展性、并行处理能力和容错性

总的来说,本次实验通过运用Hadoop MapReduce框架,成功地统计了英文文本中字符的出现频率。实验流程涵盖了从集群准备到Java程序编写、编译、执行,再到算法分析与优化的完整过程。实验不仅验证了MapReduce在分布式环境下处理大数据的高效性和可扩展性,也揭示了算法在特定场景下的局限性和潜在优化空间。通过这次实践,我们深化了对MapReduce编程模型的理解,并积累了宝贵的分布式计算经验

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

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

相关文章

matlab新手快速上手5(蚁群算法)

本文根据一个较为简单的蚁群算法框架详细分析蚁群算法的实现过程&#xff0c;对matlab新手友好&#xff0c;源码在文末给出。 蚁群算法简介&#xff1a; 蚁群算法是一种启发式优化算法&#xff0c;灵感来源于观察蚂蚁寻找食物的行为。在这个算法中&#xff0c;解决方案被看作是…

平衡二叉树、红黑树、B树、B+树

Tree 1、前言2、平衡二叉树和红黑树3、B树和B树3.1、B树的构建3.2、B树和B树的区别3.3、数据的存储方式 1、前言 本文侧重在理论方面对平衡二叉树、红黑树、B树和B树的各方面性能进行比较。不涉及编程方面的实现。而关于于平衡二叉树在C中的实现&#xff0c;我的上一篇文章平衡…

Vue Router基础知识整理

Vue Router基础知识整理 1. 安装与使用&#xff08;Vue3&#xff09;安装使用 2. 配置路径别名和VSCode路径提示&#xff08;了解&#xff09;3. 使用查询字符串或路径传参query动态路由 与 params 4. router-link、定义别名、定义路由名称、编程式导航定义别名 aliasrouter-li…

李沐66_使用注意力机制的seq2seq——自学笔记

加入注意力 1.编码器对每次词的输出作为key和value 2.解码器RNN对上一个词的输出是query 3.注意力的输出和下一个词的词嵌入合并进入RNN 一个带有Bahdanau注意力的循环神经网络编码器-解码器模型 总结 1.seq2seq通过隐状态在编码器和解码器中传递信息 2.注意力机制可以根…

ELK技术介绍:背景、功能及应用场景全面解析

一、ELK概述 ELK是由Elasticsearch、Logstash和Kibana三个开源软件组成的日志管理解决方案&#xff0c;这一组合在近年来得到了广泛的关注和应用。ELK的出现&#xff0c;源于大数据和云计算技术的快速发展&#xff0c;以及对高效日志管理的迫切需求。 随着企业信息化程度…

【10-10-10旁观思维】项目管理必会的思维分析工具 08(送模板~)

&#x1f468;‍&#x1f4bb;&#x1f469;‍&#x1f4bb;面对一个决策或选择&#xff0c;当你犹豫不决时&#xff0c;可以想一下 ⏰10分钟后&#xff0c;自己是怎么看待自己现在的决策&#xff0c;依然保持一致亦或会后悔&#xff1b; ⏰10个月后&#xff0c;你又会如何思…

Javascript 插值搜索与二分搜索

插值搜索和二分搜索都是在有序数组中查找目标元素的算法。它们之间的核心区别在于确定中间元素的方式。 1、二分搜索&#xff08;Binary Search&#xff09;&#xff1a;二分搜索是一种通过将目标值与数组中间元素进行比较&#xff0c;然后根据比较结果缩小搜索范围的算…

Docker资源管理-数据管理

一、CPU 资源控制&#xff1a; 1.cgroups&#xff1a; cgroups&#xff0c;是一个非常强大的linux内核工具&#xff0c;他不仅可以限制被 namespace 隔离起来的资源&#xff0c; 还可以为资源设置权重、计算使用量、操控进程启停等等。 所以 cgroups&#xff08;Control grou…

深度剖析SSD掉电保护机制-1

随着固态硬盘&#xff08;Solid State Drives, SSD&#xff09;在数据中心、企业存储、个人计算设备等领域广泛应用&#xff0c;其数据安全性与可靠性成为至关重要的考量因素。其中&#xff0c;应对突发电源故障导致的数据丢失风险的掉电保护&#xff08;Power Loss Protection…

MA-Chitosan MA甲基丙烯酸修饰羧甲基壳聚糖 MA-Chitosan

MA-Chitosan MA甲基丙烯酸修饰羧甲基壳聚糖 MA-Chitosan、 【中文名称】甲基丙烯酸化羧甲基壳聚糖 【英文名称】Chitosan-MA 【结 构】 【纯 度】95%以上 【保 存】-20℃ 【规 格】10mg,500mg,1g,5g,10g 【产品特性】 Chitosan-MA&#xff08;壳聚糖-甲基丙烯酸…

Verilog基础语法——parameter、localparam与`define

Verilog基础语法——parameter、localparam与define 写在前面一、localparam二、parameter三、define写在最后 写在前面 在使用Verilog编写RTL代码时&#xff0c;如果需要定义一个常量&#xff0c;可以使用define、parameter和localparam三种进行定义与赋值。 一、localparam …

大模型都在用的:旋转位置编码

写在前面 这篇文章提到了绝对位置编码和相对位置编码&#xff0c;但是他们都有局限性&#xff0c;比如绝对位置编码不能直接表征token的相对位置关系&#xff1b;相对位置编码过于复杂&#xff0c;影响效率。于是诞生了一种用绝对位置编码的方式实现相对位置编码的编码方式——…

机器学习day1

一、人工智能三大概念 人工智能三大概念 人工智能&#xff08;AI&#xff09;、机器学习&#xff08;ML&#xff09;和深度学习&#xff08;DL&#xff09; 人工智能&#xff1a;人工智能是研究计算代理的合成和分析的领域。人工智能是使用计算机来模拟&#xff0c;而不是人类…

关于Android中的限定符

很多对于Android不了解或是刚接触Android的初学者来说&#xff0c;对于Android开发中出现的例如layout-large或者drawable-xxhdpi这样的文件夹赶到困惑&#xff0c;这这文件夹到底有什么用&#xff1f;什么时候用&#xff1f;这里简单的说一下。 其实&#xff0c;在上面例子中&…

基于OpenCV的人脸签到系统

效果图 目录文件 camerathread.h 功能实现全写在.h里了 class CameraThread : public QThread {Q_OBJECT public:CameraThread(){//打开序号为0的摄像头m_cap.open(0);if (!m_cap.isOpened()) {qDebug() << "Error: Cannot open camera";}//判断是否有文件,人脸…

iframe实现pdf预览,并使用pdf.js修改内嵌标题,解决乱码问题

项目中遇到文件预览功能,并且需要可以打印文件.下插件对于内网来说有点麻烦,正好iframe预览比较简单,且自带下载打印等功能按钮. 问题在于左上方的文件名乱码,网上找了一圈没有看到解决的,要么就是要收费要会员(ztmgs),要么直接说这东西改不了. 使用: 1.引入 PDF.js 库&…

Spring Boot集成Redisson实现延迟队列

项目场景&#xff1a; 在电商、支付等领域&#xff0c;往往会有这样的场景&#xff0c;用户下单后放弃支付了&#xff0c;那这笔订单会在指定的时间段后进行关闭操作&#xff0c;细心的你一定发现了像某宝、某东都有这样的逻辑&#xff0c;而且时间很准确&#xff0c;误差在1s内…

与AI对话:探索最佳国内可用的ChatGPT网站

与AI对话&#xff1a;探索最佳国内可用的ChatGPT网站 &#x1f310; 链接&#xff1a; GPTGod 点击可注册 &#x1f3f7;️ 标签&#xff1a; GPT-4 支持API 支持绘图 Claude &#x1f4dd; 简介&#xff1a;GPTGod 是一个功能全面的平台&#xff0c;提供GPT-4的强大功能&…

JavaEE——Spring Boot + jwt

目录 什么是Spring Boot jwt&#xff1f; 如何实现Spring Boot jwt&#xff1a; 1. 添加依赖 2、创建JWT工具类 3. 定义认证逻辑 4. 添加过滤器 5、 http请求测试 什么是Spring Boot jwt&#xff1f; Spring Boot和JWT&#xff08;JSON Web Token&#xff09;是一对常…

苍穹外卖学习

并不包含全部视频内容&#xff0c;大部分都按照操作文档来手搓代码&#xff0c;资料&#xff0c;代码都上传git。 〇、实际代码 0.1 Result封装 package com.sky.result;import lombok.Data;import java.io.Serializable;/*** 后端统一返回结果* param <T>*/ Data pub…