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

这篇具有很好参考价值的文章主要介绍了【智能大数据分析】实验1 MapReduce实验:单词计数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【智能大数据分析】实验1 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

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

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

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

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

3 上传数据文件到HDFS

wordcount.txt:
【智能大数据分析】实验1 MapReduce实验:单词计数,大数据学习,数据分析,mapreduce,大数据
【智能大数据分析】实验1 MapReduce实验:单词计数,大数据学习,数据分析,mapreduce,大数据

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);    //提交任务并监控任务状态
    }
}

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

5 使用命令将代码打包

上述代码在编译运行的时候会进行报错:
【智能大数据分析】实验1 MapReduce实验:单词计数,大数据学习,数据分析,mapreduce,大数据

主要是在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/h
    
    adoop-common-3.1.3.jar:/usr/local/servers/hadoop/share/hadoop/mapreduce/hadoop-map
    
    reduce-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

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

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

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

hdfs dfs -ls /wordcount

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

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

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

【智能大数据分析】实验1 MapReduce实验:单词计数,大数据学习,数据分析,mapreduce,大数据
可以看见运行出我们想要的结果了,至此本次实验结束。文章来源地址https://www.toymoban.com/news/detail-728917.html

到了这里,关于【智能大数据分析】实验1 MapReduce实验:单词计数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】计数排序 & 排序系列所有源代码 & 复杂度分析(终章)

    目录 一,计数排序 1,基本思想 2,思路实现 3,计数排序的特性总结: 二,排序算法复杂度及稳定性分析 三,排序系列所有源代码 Sort.h Sort.c Stack.h Stack.c 计数排序也叫非比较排序; 1,基本思想 计数排序又称为 鸽巢原理 ,是对 哈希直接定址法 的变形应用 操作步骤 : 1

    2024年02月08日
    浏览(43)
  • 【数据分析入门】Seaborn[散点图、条形图、计数图、热力图、箱型图、小提琴图]

       Seaborn 是 基于 matplotlib 开发 的高阶 Python 数据可视图库 ,用于绘制优雅、美观的统计图形。   使用下列别名导入该库:    使用 Seaborn 创建图形的基本步骤 :   1. 准备数据 :我们要 确保绘制的数据集 。   2. 设定画布外观 :在创建图形之前,我们可以 设定画

    2024年02月09日
    浏览(49)
  • Hadoop3.0大数据处理学习3(MapReduce原理分析、日志归集、序列化机制、Yarn资源调度器)

    前言:如果想知道一堆牌中有多少张红桃,直接的方式是一张张的检查,并数出有多少张红桃。 而MapReduce的方法是,给所有的节点分配这堆牌,让每个节点计算自己手中有几张是红桃,然后将这个数汇总,得到结果。 官方介绍:MapReduce是一种分布式计算模型,由Google提出,

    2024年02月08日
    浏览(55)
  • PHP分析二维数据表(长度|数字字段|空值|纯姓名|英文用户名|科学计数|是否等长|是否唯一)

    先看图,后有完整代码    仅供娱乐!

    2024年02月22日
    浏览(62)
  • Hive数据分析实验报告

    1 完成本地数据user_log文件上传至HDFS中 2 完成HDFS文件上传至Hive中 用户行为日志user_log.csv,日志中的字段定义如下: user_id | 买家id item_id | 商品id cat_id | 商品类别id merchant_id | 卖家id brand_id | 品牌id month | 交易时间:月 day | 交易事件:日 action | 行为,取值范围{0,1,2,3},0表示点击,

    2024年02月06日
    浏览(47)
  • Python机器学习实验 Python 数据分析

    掌握常见数据预处理方法,熟练运用数据分析方法,并掌握 Python 中的 Numpy、 Pandas 模块提供的数据分析方法。 1.   P a nd a s   基本数据处理 使用 Pandas 模块,完成以下操作。 (1)创建一个由 0 到 50 之间的整数组成的 10 行 5 列的 dataframe。如下: (2)汇总每一列的

    2024年04月09日
    浏览(40)
  • 【玩转 TableAgent 数据智能分析】引领数据分析新革命

    年底快到了,公司需要对今年的一些业务数据进行年终总结,我的第一反应是直接让 AI 总结呗, 但是经过我的再三尝试,发现AI输出的结果一直在胡说八道,而且分析过程也不够透明,导致我一直要去调整提示词,既然AI行不通,那我就转专业的数据分析产品工具,看到网络

    2024年02月04日
    浏览(54)
  • 云计算实验4 面向行业背景的大数据分析与处理综合实验

    掌握分布式数据库接口Spark SQL基本操作,以及训练综合能力,包括:数据预处理、向量处理、大数据算法、预测和可视化等综合工程能力 Linux的虚拟机环境和实验指导手册 完成Spark SQL编程实验、交通数据综合分析平台环境部署和综合实验。 请按照实验指导手册,完成以下实

    2024年02月02日
    浏览(51)
  • 数据分析、大数据分析和人工智能之间的区别

    数据分析、大数据分析和人工智能近年来十分热门,三者之间看起来有相似之处,也有不同之处。今天就来谈谈三者间的区别。 数据分析 数据分析是指对数据进行分析,从中提取有价值的信息,以支持企业或组织的决策制定。数据分析可以针对不同的数据来源和类型,包括

    2024年02月06日
    浏览(76)
  • 大数据课程综合实验案例:网站用户行为分析

    大数据课程实验案例:网站用户行为分析,由厦门大学数据库实验室团队开发,旨在满足全国高校大数据教学对实验案例的迫切需求。本案例涉及数据预处理、存储、查询和可视化分析等数据处理全流程所涉及的各种典型操作,涵盖Linux、MySQL、Hadoop、HBase、Hive、Sqoop、R、Ec

    2024年02月06日
    浏览(124)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包