【智能大数据分析】实验1 MapReduce实验:单词计数

【智能大数据分析】实验1 MapReduce实验:单词计数

文章目录

  • 【智能大数据分析】实验1 MapReduce实验:单词计数
    • 一、实验目的
    • 二、实验要求
    • 三、实验原理
      • 1 MapReduce编程
      • 2 Java API解析
    • 四、实验步骤
      • 1 启动Hadoop
      • 2 验证HDFS上没有wordcount的文件夹
      • 3 上传数据文件到HDFS
      • 4 编写MapReduce程序
      • 5 使用命令将代码打包
      • 6 在Hadoop集群上提交jar文件来运行MapReduce作业

在我之前的一篇博客中:云计算中的大数据处理:尝试HDFS和MapReduce的应用有过类似的操作,具体不会的可以去这篇博客中看看。

一、实验目的

基于MapReduce思想,编写WordCount程序。

二、实验要求

1.理解MapReduce编程思想;

2.会编写MapReduce版本WordCount;

3.会执行该程序;

4.自行分析执行过程。

三、实验原理

MapReduce是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE)。这样做的好处是可以在任务被分解后,可以通过大量机器进行并行计算,减少整个操作的时间。

适用范围:数据量大,但是数据种类小可以放入内存。

基本原理及要点:将数据交给不同的机器去处理,数据划分,结果归约。

理解MapReduce和Yarn:在新版Hadoop中,Yarn作为一个资源管理调度框架,是Hadoop下MapReduce程序运行的生存环境。其实MapRuduce除了可以运行Yarn框架下,也可以运行在诸如Mesos,Corona之类的调度框架上,使用不同的调度框架,需要针对Hadoop做不同的适配。

一个完成的MapReduce程序在Yarn中执行过程如下:

(1)ResourcManager JobClient向ResourcManager提交一个job。

(2)ResourcManager向Scheduler请求一个供MRAppMaster运行的container,然后启动它。

(3)MRAppMaster启动起来后向ResourcManager注册。

(4)ResourcManagerJobClient向ResourcManager获取到MRAppMaster相关的信息,然后直接与MRAppMaster进行通信。

(5)MRAppMaster算splits并为所有的map构造资源请求。

(6)MRAppMaster做一些必要的MR OutputCommitter的准备工作。

(7)MRAppMaster向RM(Scheduler)发起资源请求,得到一组供map/reduce task运行的container,然后与NodeManager一起对每一个container执行一些必要的任务,包括资源本地化等。

(8)MRAppMaster 监视运行着的task 直到完成,当task失败时,申请新的container运行失败的task。

(9)当每个map/reduce task完成后,MRAppMaster运行MR OutputCommitter的cleanup 代码,也就是进行一些收尾工作。

(10)当所有的map/reduce完成后,MRAppMaster运行OutputCommitter的必要的job commit或者abort APIs。

(11)MRAppMaster退出。

1 MapReduce编程

编写在Hadoop中依赖Yarn框架执行的MapReduce程序,并不需要自己开发MRAppMaster和YARNRunner,因为Hadoop已经默认提供通用的YARNRunner和MRAppMaster程序, 大部分情况下只需要编写相应的Map处理和Reduce处理过程的业务程序即可。

编写一个MapReduce程序并不复杂,关键点在于掌握分布式的编程思想和方法,主要将计算过程分为以下五个步骤:

(1)迭代。遍历输入数据,并将之解析成key/value对。

(2)将输入key/value对映射(map)成另外一些key/value对。

(3)依据key对中间数据进行分组(grouping)。

(4)以组为单位对数据进行归约(reduce)。

(5)迭代。将最终产生的key/value对保存到输出文件中。

2 Java API解析

(1)InputFormat:用于描述输入数据的格式,常用的为TextInputFormat提供如下两个功能:

数据切分: 按照某个策略将输入数据切分成若干个split,以便确定Map Task个数以及对应的split。

为Mapper提供数据:给定某个split,能将其解析成一个个key/value对。

(2)OutputFormat:用于描述输出数据的格式,它能够将用户提供的key/value对写入特定格式的文件中。

(3)Mapper/Reducer: Mapper/Reducer中封装了应用程序的数据处理逻辑。

(4)Writable:Hadoop自定义的序列化接口。实现该类的接口可以用作MapReduce过程中的value数据使用。

(5)WritableComparable:在Writable基础上继承了Comparable接口,实现该类的接口可以用作MapReduce过程中的key数据使用。(因为key包含了比较排序的操作)。

四、实验步骤

本实验主要分为,确认前期准备,编写MapReduce程序,打包提交代码。查看运行结果这几个步骤,详细如下:

1 启动Hadoop

在这里插入图片描述

2 验证HDFS上没有wordcount的文件夹

在这里插入图片描述

此时HDFS上应该是没有wordcount文件夹。

3 上传数据文件到HDFS

wordcount.txt:
在这里插入图片描述
在这里插入图片描述

4 编写MapReduce程序

主要编写Map和Reduce类,其中Map过程需要继承org.apache.hadoop.mapreduce包中Mapper类,并重写其map方法;Reduce过程需要继承org.apache.hadoop.mapreduce包中Reduce类,并重写其reduce方法。

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
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.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.mapreduce.lib.partition.HashPartitioner;import java.io.IOException;
import java.util.StringTokenizer;public class WordCount {public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> {private final static IntWritable one = new IntWritable(1);private Text word = new Text();//map方法,划分一行文本,读一个单词写出一个<单词,1>public void map(Object key, Text value, Context context)throws IOException, InterruptedException {StringTokenizer itr = new StringTokenizer(value.toString());while (itr.hasMoreTokens()) {word.set(itr.nextToken());context.write(word, one);//写出<单词,1>}}}//定义reduce类,对相同的单词,把它们中的VList值全部相加public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {private IntWritable result = new IntWritable();public void reduce(Text key, Iterable<IntWritable> values,Context context)throws IOException, InterruptedException {int sum = 0;for (IntWritable val : values) {sum += val.get();//相当于<Hello,1><Hello,1>,将两个1相加}result.set(sum);context.write(key, result);//写出这个单词,和这个单词出现次数<单词,单词出现次数>}}public static void main(String[] args) throws Exception {//主方法,函数入口Configuration conf = new Configuration();           //实例化配置文件类Job job = new Job(conf, "WordCount");             //实例化Job类job.setInputFormatClass(TextInputFormat.class);     //指定使用默认输入格式类TextInputFormat.setInputPaths(job, args[0]);      //设置待处理文件的位置job.setJarByClass(WordCount.class);               //设置主类名job.setMapperClass(TokenizerMapper.class);        //指定使用上述自定义Map类job.setCombinerClass(IntSumReducer.class);        //指定开启Combiner函数job.setMapOutputKeyClass(Text.class);            //指定Map类输出的,K类型job.setMapOutputValueClass(IntWritable.class);     //指定Map类输出的,V类型job.setPartitionerClass(HashPartitioner.class);       //指定使用默认的HashPartitioner类job.setReducerClass(IntSumReducer.class);         //指定使用上述自定义Reduce类job.setNumReduceTasks(Integer.parseInt(args[2]));  //指定Reduce个数job.setOutputKeyClass(Text.class);                //指定Reduce类输出的,K类型job.setOutputValueClass(Text.class);               //指定Reduce类输出的,V类型job.setOutputFormatClass(TextOutputFormat.class);  //指定使用默认输出格式类TextOutputFormat.setOutputPath(job, new Path(args[1]));    //设置输出结果文件位置System.exit(job.waitForCompletion(true) ? 0 : 1);    //提交任务并监控任务状态}
}

在这里插入图片描述

5 使用命令将代码打包

上述代码在编译运行的时候会进行报错:
在这里插入图片描述

主要是在Hadoop版本3.x中,Job构造函数已过时,需要使用Job.getInstance构造函数。另外,有一个潜在的问题是设置job.setOutputValueClassText.class,但您的Reduce类输出类型是IntWritable,这两者需要匹配。

下面是修改之后的代码:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
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;import java.io.IOException;
import java.util.StringTokenizer;public class WordCount {public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> {private final static IntWritable one = new IntWritable(1);private Text word = new Text();public void map(Object key, Text value, Context context) throws IOException, InterruptedException {StringTokenizer itr = new StringTokenizer(value.toString());while (itr.hasMoreTokens()) {word.set(itr.nextToken());context.write(word, one);}}}public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {private IntWritable result = new IntWritable();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);}}public static void main(String[] args) throws Exception {Configuration conf = new Configuration();Job job = Job.getInstance(conf, "WordCount");job.setJarByClass(WordCount.class);job.setMapperClass(TokenizerMapper.class);job.setCombinerClass(IntSumReducer.class);job.setReducerClass(IntSumReducer.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);}
}

下面是打包过程:

  • 在我们创建的java项目根目录下创建一个名为src的文件夹。

  • 将所有的Java源代码文件(.java)移动到src文件夹中。

  • 在项目根目录中创建一个名为Manifest.txt的文件,用于指定JAR文件的入口点。

  • Manifest.txt文件中,添加以下内容:

    Main-Class: <Main-Class>
    

    <Main-Class>替换为包含main方法的主类的完整类名,例如我的是SalesDriver

  • 回到项目根目录下,使用以下命令编译Java源代码并创建一个临时目录来保存编译后的类文件:

    mkdir classes
    javac -d classes src/*.java
    

    如果你在使用编译命令时出现程序包×××存在的问题,这个时候我们需要将Hadoop相关的jar文件添加到编译路径中才可以解决:

    javac -classpath /usr/local/servers/hadoop/share/hadoop/common/hadoop-common-3.1.3.jar:/usr/local/servers/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-client-core-3.1.3.jar -d classes src/*.java
    

    注意上面的命令是一个而不是多个。

  • 创建一个空的JAR文件,命名为WordCount.jar

    jar -cvf WordCount.jar -C classes/ .
    
  • 将编译后的类文件和Manifest.txt添加到JAR文件中:

    jar -uf WordCount.jar -C classes/ .jar -uf WordCount.jar Mainfest.txt 
    

到现在,我们的整个java项目就打包成功了。

6 在Hadoop集群上提交jar文件来运行MapReduce作业

我们将打包好的WordCount.jar使用如下命令提交到集群上面:

hadoop jar WordCount.jar WordCount /user/wordcount.txt /wordcount

顺利执行之后终端会打印如下信息:

在这里插入图片描述

然后我们查看我们的输出目录:

hdfs dfs -ls /wordcount

在这里插入图片描述

红框所示就是我们需要的结果,我们将其下载下来进行查看:

hdfs dfs -get /wordcount1/part-r-00000 /root/WordCount
vim part-r-00000

在这里插入图片描述
可以看见运行出我们想要的结果了,至此本次实验结束。

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

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

相关文章

scannet v2 数据集下载(WP)

scannet数据集: 一共1513个采集场景数据(每个场景中点云数量都不一样,如果要用到端到端可能需要采样,使每一个场景的点都相同),共21个类别的对象,其中,1201个场景用于训练,312个场景用于测试,有四个评测任务:3D语义分割、3D实例分割、2D语义分割和2D实例分割。 本文…

线程池--简单版本和复杂版本

目录 一、引言 二、线程池头文件介绍 三、简单版本线程池 1.创建线程池 2.添加任务到线程池 3.子线程执行回调函数 4.摧毁线程池 5.简单版线程池流程分析 四、复杂版本线程池 1.结构体介绍 2.主线程 3.子线程 4.管理线程 一、引言 多线程版服务器一个客户端就需要…

我做云原生的那几年

背景介绍 在2020年6月&#xff0c;我加入了一家拥有超过500人的企业。彼时&#xff0c;前端团队人数众多&#xff0c;有二三十名成员。在这样的大团队中&#xff0c;每个人都要寻找自己的独特之处和核心竞争力。否则&#xff0c;你可能会沉没于常规的增删改查工作中&#xff0…

php 低版本getenv 无法获取变量值的替换方案

正常 7 的版本可以获取环境变量&#xff0c;getenv() 即可,但是到了低版本的&#xff0c;可能只能获取计算机的环境变量&#xff0c;在根目录的.env 文件中无法获取。 只能通过代码简单的转化获取 function env($variableName) {$dotenvFile file_get_contents(.env);$lines …

Qt 使用Quazip解压缩、压缩文件

1.环境搭建 Quazip&#xff0c;是在zlib基础上进行了简单封装的开源库&#xff0c;适用于多种平台&#xff0c;利用它可以很方便将单个或多个文件打包为zip文件&#xff0c;且打包后的zip文件可以通过其它工具打开。 下载Quazip QuaZIP download | SourceForge.net 解压后&…

项目进度管理:确保项目按时完成

项目进度管理是项目管理中至关重要的一环。它涉及到规划、跟踪和控制项目的进度&#xff0c;以确保项目能够按时完成。 一、项目进度管理方法 制定项目计划 项目计划是项目进度管理的基础。它包括确定项目的目标、范围、资源需求和时间表等内容。在制定项目计划时&#xff0…

代码随想录训练营第52天 | 300.最长递增子序列 ● 674. 最长连续递增序列 ● 718. 最长重复子数组

300.最长递增子序列 题目链接&#xff1a;https://leetcode.com/problems/longest-increasing-subsequence 解法&#xff1a; 1. dp[i]的定义 dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度。 2. 状态转移方程 位置i的最长升序子序列等于j从0到i-1各个位置…

Ubuntu更换镜像源

Ubuntu更换镜像源 镜像源设置文件镜像源设置focal版本镜像源设置bionic版本镜像源设置 更新源问题 镜像源设置文件 备份镜像源设置文件 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak编辑镜像源设置文件 sudo gedit /etc/apt/sources.list镜像源设置 Ubuntu有不…

STM32:使用蓝牙模块

一、蓝牙概要 蓝牙是一种常见的无线通信协议&#xff0c;通常用于短距离通信。蓝牙分为经典蓝牙和低功耗蓝牙(BLE)。经典蓝牙通常用于需要持续传输数据的设备&#xff0c;比如蓝牙耳机等。低功耗蓝牙通常用于只需要间歇性传输数据的设备&#xff0c;比如运动手环。 蓝牙…

python脚本监听域名证书过期时间,并将通知消息到钉钉

版本一&#xff1a; 执行脚本带上 --dingtalk-webhook和–domains后指定钉钉token和域名 python3 ssl_spirtime.py --dingtalk-webhook https://oapi.dingtalk.com/robot/send?access_tokenavd345324 --domains www.abc1.com www.abc2.com www.abc3.com脚本如下 #!/usr/bin…

实现基于 Azure DevOps 的数据库 CI/CD 最佳实践

数据库变更一直是整个应用发布过程中效率最低、流程最复杂、风险最高的环节&#xff0c;也是 DevOps 流程中最难以攻克的阵地。那我们是否能在具体的 CI/CD 流程中&#xff0c;像处理代码那样处理数据库变更呢&#xff1f; DORA 调研报告 DORA&#xff08;DevOps Research &am…

.net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池

using System; using System.Collections.Concurrent; using System.Net.Http; using System.Threading; using System.Threading.Tasks;/// <summary> /// 表示一个支持重试、熔断和超时策略的 HttpClient 实例池。 /// </summary> public class HttpClientPool :…

ESXI 的 OVF 文件编辑 方法。

方法一&#xff1a; 用Wrar解压OVF 文件&#xff0c;得到4个文件&#xff1b; 用记事本编辑 ".mf" 或 ".ovf" 文件保存退出&#xff0c;后续全部导入虚拟机ESXI。 方法二&#xff1a;要打开 OVF 文件并在其中查找清单文件 &#xff0c; 你可以按照以下步骤…

Android studio进入手机调试状态

首先usb插入电脑手机打开开发者模式进入点击就会在你的页面显示了

SpringCloud(二) Eureka注册中心的使用

在SpringCloud(一)中,我们学会了使用RestTemplate进行远程调用,但是在调用user-service时候需要在order-service中发送http请求,请求中需要书写对应微服务的ip和端口号,十分不方便,如果此时有多个user-service实例的话,就不知道调用哪个了(除非每次调用的时候都对ip和端口号进行…

设计模式(单例模式、工厂模式及适配器模式、装饰器模式)

目录 0 、设计模式简介 一、单例模式 二、工厂模式 三、适配器模式 四、装饰器模式 0 、设计模式简介 设计模式可以分为以下三种: 创建型模式&#xff1a;用来描述 “如何创建对象”&#xff0c;它的主要特点是 “将对象的创建和使用分离”。包括单例、原型、工厂方法、…

数据仓库-拉链表

在数据仓库中制作拉链表&#xff0c;可以按照以下步骤进行&#xff1a; 确定需求&#xff1a;首先明确需要使用拉链表的场景和需求。例如&#xff0c;可能需要记录历史数据的变化&#xff0c;以便进行时间序列分析等。设计表结构&#xff1a;在数据仓库中&#xff0c;拉链表通…

AutoX-对象、图片资源懒加载+Storage持久化

AutoX-对象、图片资源懒加载Storage持久化 一、使用场景 需要懒加载的场景有很多&#xff0c;我最开始是需要懒加载功能是在编写一个游戏自动化脚本时&#xff0c;需要事先检测某个物品的坐标&#xff0c;才能进行后续的点击操作&#xff0c;该物品在页面中的位置是固定的&am…

[SpringCloud | Linux] CentOS7 部署 SpringCloud 微服务

目录 一、环境准备 1、工具准备 2、虚拟机环境 3、Docker 环境 二、项目准备 1、配置各个模块&#xff08;微服务&#xff09;的 Dockerfile 2、配置 docker-compose.yml 文件 3、Maven 打包 4、文件整合并传输 三、微服务部署 1、部署至 Docker 2、访问微服务 四…

折纸达珠峰高度(forwhile循环、闭包函数循环)

对折0.1mm厚度的纸张多少次&#xff0c;高度可达珠峰高度8848180mm。 (本笔记适合熟悉循环和列表的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不仅…