调用MapReduce对文件中各个单词出现的次数进行统计

调用MapReduce对文件中各个单词出现的次数进行统计,第1张

调用MapReduce对文件中各个单词出现的次数进行统计

一、环境介绍

    通过在本机Oracle VM VirtualBox上安装Ubuntu系统,并在Ubuntu系统中安装Hadoop,Eclipse。下载文件jdk-8u162-linux-x64.tar.gz并解压配置JAVA环境变量。对Hadoop进行伪分布式的配置,成功显示HDFS网页后到Ubuntu自带的软件中心下载Eclipse。完成安装后将需要分析的文件拖放到Ubuntu系统中,并在Eclipse中创建并配置好MapReduce所需要的环境。

二、数据来源及数据上传

为Ubuntu安装增强功能,并开启文件双向拖放功能:

图 1

图 2

文件已经拖放到Ubuntu系统/home/hadoop文件夹中:

图 3

三、数据上传结果查看

提前启动好hadoop,将lpj.txt上传至HDFS:

图 4

确认HDFS input文件里面是否收到lpj.txt。

图 5

四、数据处理过程的描述

1.要在Eclipse上编译和运行MapReduce程序,需要安装Hadoop-Eclipse-Plugin,将下载好的hadoop2x-eclipse-plugin-master.zip文件解压到“/usr/lib/eclipse/plugins”目录中

图 6

图 7

2.完成上一个步骤后,我们需要重启Eclipse使插件生效

图 8

3.启动Eclipse后我们可以看到在左侧的“Project Explorer”面板中会有DFS Locations文件

图 9

4.插件安装完成后,我们还需要对Eclipse进行一些配置

  1. 选择Window菜单下的Perference

图 10

  1. 在d出的窗口左侧栏中找到“Hadoop Map/Reduce”栏,选择Hadoop的安装目录,我的安装目录是“/usr/local/hadoop”

图 11

  1. 建立与 Hadoop 集群的连接,点击 Eclipse软件右下角的 Map/Reduce Locations 面板,在面板中单击右键,选择 New Hadoop Location

图 12

  1. 在d出来的页面中,我们将“General”选项卡中“Port”选项修改为“9000”即可,“Location name”可以随便命名,完成后点击“Finish”

图 13

5.接着我们点击左侧“Project Explorer”中的MapReduce Location就能查看到HDFS中的文件列表了

图 14

6.在eclipse中创建MapReduce项目,点击 “File”菜单,选择“New->Project”

图 15

7. 选择 Map/Reduce Project,点击 Next

图 16

8.在 “Project name” 为取名为“WordCount”,点击 Finish 就创建好了项目

图 17

9.回到界面右键点击刚创建的“WordCount”项目,选择“New->Class”

图 18

10.在d出的窗口中,需要填写两个地方:在“Package”处填写“org.apache.hadoop.examples”;在“Name”处填写“WordCount”

图 19

11.创建完成后,我们找到“WordCount.java”文件,鼠标左键点击打开,将文件内容修改如下代码

package org.apache.hadoop.examples;

import java.io.IOException;

import java.util.Iterator;

import java.util.StringTokenizer;

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 org.apache.hadoop.util.GenericOptionsParser;

public class WordCount {

    public WordCount() {

    }

    public static void main(String[] args) throws Exception {

        Configuration conf = new Configuration();

        String[] otherArgs = (new GenericOptionsParser(conf, args)).getRemainingArgs();

        if(otherArgs.length < 2) {

            System.err.println("Usage: wordcount [...] ");

            System.exit(2);

        }

        Job job = Job.getInstance(conf, "word count");

        job.setJarByClass(WordCount.class);

        job.setMapperClass(WordCount.TokenizerMapper.class);

        job.setCombinerClass(WordCount.IntSumReducer.class);

        job.setReducerClass(WordCount.IntSumReducer.class);

        job.setOutputKeyClass(Text.class);

        job.setOutputValueClass(IntWritable.class);

        for(int i = 0; i < otherArgs.length - 1; ++i) {

            FileInputFormat.addInputPath(job, new Path(otherArgs[i]));

        }

        FileOutputFormat.setOutputPath(job, new Path(otherArgs[otherArgs.length - 1]));

        System.exit(job.waitForCompletion(true)?0:1);

    }

    public static class IntSumReducer extends Reducer

IntWritable, Text, IntWritable> {

        private IntWritable result = new IntWritable();

        public IntSumReducer() {

        }

        public void reduce(Text key, Iterable values, Reducer.Context context) throws IOException, InterruptedException {

            int sum = 0;

            IntWritable val;

            for(Iterator i$ = values.iterator(); i$.hasNext(); sum += val.get()) {

                val = (IntWritable)i$.next();

            }

            this.result.set(sum);

            context.write(key, this.result);

        }

    }

    public static class TokenizerMapper extends Mapper {

        private static final IntWritable one = new IntWritable(1);

        private Text word = new Text();

        public TokenizerMapper() {

        }

        public void map(Object key, Text value, Mapper.Context context) throws IOException, InterruptedException {

            StringTokenizer itr = new StringTokenizer(value.toString());

            while(itr.hasMoreTokens()) {

                this.word.set(itr.nextToken());

                context.write(this.word, one);

            }

        }

    }

}

12.运行之前我们仍有一项重要的配置,将“/usr/local/hadoop/etc/hadoop”中将有修改过的配置文件(如伪分布式需要“core-site.xml”和“hdfs-site.xml”),以及“log4j.properties”复制到“WordCount”项目下的“src 文件夹(~/workspace/WordCount/src)”中,修改完成后我们回到“Eclipse”中,将“WordCount”文档刷新一下

图 20

图 21

13. 右键点击刚创建的“WordCount.java”,选择“Run As -> Run Configurations”,按照如下内容设置参数

图 22

14.点击工具栏中的“Run”图标,选择 Run As -> Run on Hadoop,就可以运行 MapReduce 程序了

图 23

15.将我们完成的Java项目打包生成JAR包,部署到Hadoop平台上运行。现在可以把词频统计程序放在“/usr/local/hadoop/myapp”目录下

$ cd /usr/local/Hadoop

$ mkdir myapp

16.在Eclipse工作界面左侧的“Package Explorer”面板中,鼠标右键“WordCount”项目,在菜单中选中“Export”,在d出的窗口中,选择“Java->Runnable JAR file”,接着再根据图片填写如下信息。

图 24

图 25

图 26

17.我们选择忽略接下来的d窗,点击OK即可

图 27

在该界面中“Launch configuration”用于设置生成的JAR包被部署启动时运行的 主类,需要在下拉列表中选择刚才配置的类“WordCount-WordCount”。在“Export destination”中需要设置 JAR 包要输出保存到哪个目录,比如,这里设置为“/usr/local/hadoop/myapp/WordCount.jar”。在“Library handling”下面选择“Extract required libraries into generated JAR”。然后,点击“Finish”按钮,会出现如下图所示界面。

18.自动打包完成后会d出一个警告信息界面,我们仍然选择OK,至此,已经顺利把WordCount项目打包生成了“WordCount.jar”

五、处理结果的下载及命令行展示

使用hadoop jar 命令运行程序

$ cd /usr/local/hadoop

$ ./bin/hadoop jar ./myapp/WordCount.jar input output

查看output文件夹是否有运行成功后生成的文件

图 28

查看运行后生成的“output/part-r-00000”文件

图 29

将output文件夹下载至本地并查看本地文件

图 30

查看“part-r-00000”文件

图 31

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5688226.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存