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 类,处理输入文件的每一行,并将字符逐个传递给 Reducer
  public 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 CharReducer
    extends 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编程模型的理解,并积累了宝贵的分布式计算经验

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ResNet详解

一、认识ResNet ResNet&#xff08;Residual Network&#xff09;是一种深度神经网络结构&#xff0c;被广泛应用于图像分类、目标检测和语义分割等计算机视觉任务中。它是由微软亚洲研究院的何凯明等人于2015年提出的&#xff0c;通过引入残差连接&#xff08;residual conne…

携程 Java 暑期实习一面:HashMap 的 key 可以设置为 null 吗?那 ConcurrentHashMap 呢?

更多大厂面试内容可见 -> http://11come.cn 携程 Java 暑期实习一面&#xff1a;HashMap 的 key 可以设置为 null 吗&#xff1f;那 ConcurrentHashMap 呢&#xff1f; Java 基础 1、Java 中有哪些常见的数据结构&#xff1f; 图片来源于&#xff1a;JavaGuide Java 中常…

【数学归纳法 反证法】菲蜀定理

裴蜀定理&#xff08;或贝祖定理&#xff0c;Bzout’s identity&#xff09;得名于法国数学家艾蒂安裴蜀&#xff0c;说明了对任何整数a、b和它们的最大公约 数d&#xff0c;关于未知数x和y的线性不定方程&#xff08;称为裴蜀等式&#xff09;&#xff1a;若a,b是整数,且&…

C++异常和断言

C异常 异常的理念看似有前途&#xff0c;但实际的使用效果并不好。编程社区达成的一致意见是&#xff0c;最好不要使用这项功能。C98引入异常规范&#xff0c;C11已弃用。 例如&#xff1a;我们输入1时抛出异常。 #include <iostream> #include <vector> #includ…

macbook内存怎么清理?2024年有哪些好用的软件

当你的MacBook运行缓慢时&#xff0c;这很可能是因为内存&#xff08;RAM&#xff09;满了。内存是计算机的临时存储区&#xff0c;用于存放当前正在使用的程序和数据。当内存满时&#xff0c;MacBook就会使用硬盘作为临时内存&#xff0c;这大大降低了运行速度。那么&#xff…

Hadoop3:HDFS、YARN、MapReduce三部分的架构概述及三者间关系(Hadoop入门必须记住的内容)

一、HDFS架构概述 Hadoop Distributed File System&#xff0c;简称HDFS&#xff0c;是一个分布式文件系统。 1&#xff09;NameNode(nn)&#xff1a;存储文件的元数据&#xff0c;如文件名&#xff0c;文件目录结构&#xff0c;文件属性&#xff08;生成时间、副本数、文件…

基于Tensorflow完成mnist数据集的数字手写体识别

基于Tensorflow完成mnist数据集的数字手写体识别 关于知识背景CNNFCNN 关于数据集新的改变 关于知识背景 CNN 卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;简称CNN&#xff09;是一种具有局部连接、权值共享等特点的深层前馈神经网络&#xff08;Feed…

【CAD打开提示未处理异常C0000027(c0000027h)的两种解决方法。】

cad打开提示错误c0000027h的第一种解决方法 去掉区域里的beta语言勾选。 https://autodesk8.com/cad/86.html 如果第一种方法没解决&#xff0c;尝试第二种方法大概率能解决 点击autoremove的扩展功能&#xff0c;输入c0000027点击搜索&#xff0c;然后双击出现的这个按钮既可…

【AI开发:音频】一、GPT-SoVITS整合工具包的部署问题解决(GPU版)

前言 目前GPT-SoVITS的合成效果比较不错&#xff0c;相比较其他厂商的产品要规整的多。众多厂家中也是国内使用最多的一款了&#xff0c;并且这个整合包里携带了&#xff0c;除背景音、切割、训练、微调、合成、低成本合成等一些列完整的工具&#xff0c;也可以作为API进行使用…

近年数一,数二难度如何,听说24是像张宇那样的题?

直接上分数&#xff01; “估分一百零几&#xff0c;平时李林130-140&#xff0c;张八110-125的样子&#xff0c;超越做的分数也是100出头。” 24学长说&#xff1a; “远离李林张八&#xff01;张四没做不评价。” “李林张八暑假前做完当作打基础即可。超越才是真题难度”…

利用regress绘制拟合图,利用Slope的趋势分析(5)

code如下&#xff1a; % SCD,积雪日数 % SCS,积雪初日 % SCM,积雪终日% SCS SCD SCM clc; clear; % 读取 Excel 表 excel_file E:\work\2024年\April20\积雪作图\tif文件\excel表\SCS.xlsx; % Excel 文件路径 data readtable(excel_file);datavalue data{:,2:end}; year (…

【工具-pip】

工具-pip ■ pip-工具■ pip-安装■ pip-卸载■ pip-帮助■ pip- 批量安装库■ 批量卸载库■ 提高pip下载速度 ■ pip-工具 pip 是 Python 标准库中的一个包&#xff0c;这个包是用来管理 Python 第三方库。 通用的 Python 包管理工具。提供了对 Python 包的查找、下载、安装、…

【分治算法】Hanoi塔问题Python实现

文章目录 [toc]问题描述Python实现 个人主页&#xff1a;丷从心 系列专栏&#xff1a;Python基础 学习指南&#xff1a;Python学习指南 问题描述 设 a a a、 b b b、 c c c是三个塔座&#xff0c;开始时&#xff0c;在塔座 a a a上有一叠共 n n n个圆盘&#xff0c;这些圆盘…

设备运行远程监控系统

在信息化、智能化的浪潮下&#xff0c;设备运行远程监控系统已经成为企业提升运营效率、降低运营成本、保障生产安全的重要工具。HiWoo Cloud作为设备运行远程监控系统&#xff0c;以其卓越的性能和稳定的运行&#xff0c;赢得了众多企业的青睐。 一、设备运行远程监控系统的概…

动手学大模型应用开发--Chapter 03搭建并使用向量数据库

文章目录 前言一、学习目标二、学习知识点概要2.1 什么是词向量2.2 词向量的意义2.3 文本转为词向量的方法 三、总结四、引申阅读 前言 本学习笔记为datawhale动手学大模型应用开发的第三章&#xff0c;学习链接为&#xff1a; https://datawhalechina.github.io/llm-universe…

ARTS Week 24

Algorithm 本周的算法题为 21. 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; img 输入&#xff1a;list1 [1,2,4], list2 [1,3,4]输出&#xff1a;[1,1,2,3,4,4] 实现代码如下&…

Web3钱包开发获取测试币-Polygon Mumbai(一)

Web3钱包开发获取测试币-Polygon Mumbai(一) 由于主网区块链上的智能合约需要真正的代币&#xff0c;而部署和使用需要花费真金白银&#xff0c;因此测试网络为 Web3 开发人员提供了一个测试环境&#xff0c;用于部署和测试他们的智能合约&#xff0c;以识别和修复在将智能合约…

海康Visionmaster-常见问题排查方法-安装阶段

VM软加密安装失败&#xff0c;报错&#xff1a;软件未激活&#xff0c;是否进行授权激活&#xff1b; 解决方法&#xff1a;如确认已完成授权&#xff0c;此时打上试用用补丁即可。补充VM400试用版本正确安装顺序如下&#xff1a; 安装顺序&#xff1a; ①安装基础安装包&…

计算机网络3——数据链路层5高速以太网

文章目录 一、100BASE-T 以太网二、吉比特以太网三、10吉比特以太网(10GbE)和更快的以太网四、使用以太网进行宽带接入 随着电子技术的发展&#xff0c;以太网的速率也不断提升。从传统的10Mbits以太网一直发展到现在常用的速率为1Gbits的吉比特以太网&#xff0c;甚至更快的以…

项目管理中,项目团队如何高效的协作与沟通?

目 录 一、项目团队高效的协作与沟通&#xff0c;可以通过以下几个方面来实现&#xff1a; 二、如何在项目团队中明确和共享愿景以提高协作效率&#xff1f; 三、有效的沟通策略在项目管理中的应用案例有哪些&#xff1f; 四、建立哪些具体的沟通机制可以提升团队协作效率…