栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

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

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

  • 需求描述

本次实验,我们需要实现的是调用MapReduce对文件中各个单词出现的次数进行统计。要求在Linux系统中实现上述操作。首先要安装Ubuntu系统,然后要配置Java环境,安装JDK。Ubuntu提供了一个健壮,功能丰富的计算环境。

二、环境介绍

Ubuntu 14.04

Hadoop 2.6.0(伪分布式)

Eclipse 3.8

在VirtualBox上安装Ubuntu。在Ubuntu中安装Hadoop,Eclipse。安装Java环境,下载文件jdk-8u162-linux-x64.tar.gz(可以其他版本)。配置Hadoop伪分布式。在Ubuntu软件中心中下载并安装Eclipse。

三、数据来源及数据上传

数据来源:网查数据英文20000字

  • 数据上传结果查看

在hadoop目录下使用命令:

./bin/hadoop dfs -put /usr/local/hadoop/test/1.txt  /input

  • 数据处理过程的描述

安装 Hadoop-Eclipse-Plugin

要在 Eclipse 上编译和运行 MapReduce 程序,需要安装 hadoop-eclipse-plugin,可下载 Github 上的 hadoop2x-eclipse-plugin(备用下载地址:hadoop2x-eclipse-plugin-master.zip_免费高速下载|百度网盘-分享无限制)。

下载后,将 release 中的 hadoop-eclipse-kepler-plugin-2.6.0.jar (还提供了 2.2.0 和 2.4.1 版本)复制到 Eclipse 安装目录的 plugins 文件夹中,运行 eclipse -clean 重启 Eclipse 即可(添加插件后只需要运行一次该命令,以后按照正常方式启动就行了)。

所需命令如下:

unzip -qo ~/下载/hadoop2x-eclipse-plugin-master.zip -d ~/下载   

 // 解压到 ~/下载 中

sudo cp ~/下载/hadoop2x-eclipse-plugin-master/release/hadoop-eclipse-plugin-2.6.0.jar /usr/lib/eclipse/plugins/

//复制到 eclipse 安装目录的 plugins 目录下

/usr/lib/eclipse/eclipse -clean    

//添加插件后需要用这种方式使插件生效

配置 Hadoop-Eclipse-Plugin

在继续配置前请确保已经开启了 Hadoop。

启动 Eclipse 后就可以在左侧的Project Explorer中看到 DFS Locations(若看到的是 welcome 界面,点击左上角的 x 关闭就可以看到了。CentOS 需要切换 Perspective 后才能看到,即接下来配置步骤的第二步)。

安装好Hadoop-Eclipse-Plugin插件后的效果:

插件需要进一步的配置。

第一步:选择 Window 菜单下的 Preference。

此时会弹出一个窗体,窗体的左侧会多出 Hadoop Map/Reduce 选项,点击此选项,选择 Hadoop 的安装目录(如/usr/local/hadoop,Ubuntu不好选择目录,直接输入就行)。

第二步:切换 Map/Reduce 开发视图,选择 Window 菜单下选择 Open Perspective -> Other(CentOS 是 Window -> Perspective -> Open Perspective -> Other),弹出一个窗体,从中选择 Map/Reduce 选项即可进行切换。

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

在弹出来的 General 选项面板中,General 的设置要与 Hadoop 的配置一致。一般两个 Host 值是一样的,如果是伪分布式,填写 localhost 即可,另外我使用的Hadoop伪分布式配置,设置 fs.defaultFS 为 hdfs://localhost:9000,则 DFS Master 的 Port 要改为 9000。Map/Reduce(V2) Master 的 Port 用默认的即可,Location Name 随意填写。

最后的设置如下图所示:

Advanced parameters 选项面板是对 Hadoop 参数进行配置,实际上就是填写 Hadoop 的配置项(/usr/local/hadoop/etc/hadoop中的配置文件),如我配置了 hadoop.tmp.dir ,就要进行相应的修改。但修改起来会比较繁琐,我们可以通过复制配置文件的方式解决(下面会说到)。

总之,我们只要配置 General 就行了,点击 finish,Map/Reduce Location 就创建好了。

在 Eclipse 中创建 MapReduce 项目

点击 File 菜单,选择 New -> Project…:

选择 Map/Reduce Project,点击 Next。

填写 Project name 为 WordCount 即可,点击 Finish 就创建好了项目。

此时在左侧的 Project Explorer 就能看到刚才建立的项目了。

接着右键点击刚创建的 WordCount 项目,选择 New -> Class

需要填写两个地方:在 Package 处填写 org.apache.hadoop.examples;在 Name 处填写 WordCount。

创建 Class 完成后,在 Project 的 src 中就能看到 WordCount.java 这个文件。将如下 WordCount 的代码复制到该文件中。

代码如下:

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 {

        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);

            }

 

        }

    }

}

通过 Eclipse 运行 MapReduce

在运行 MapReduce 程序前,还需要执行一项重要操作(也就是上面提到的通过复制配置文件解决参数设置问题):将 /usr/local/hadoop/etc/hadoop 中将有修改过的配置文件(如伪分布式需要 core-site.xml 和 hdfs-site.xml),以及 log4j.properties 复制到 WordCount 项目下的 src 文件夹(~/workspace/WordCount/src)中:

cp /usr/local/hadoop/etc/hadoop/core-site.xml ~/workspace/WordCount/src

cp /usr/local/hadoop/etc/hadoop/hdfs-site.xml ~/workspace/WordCount/src

cp /usr/local/hadoop/etc/hadoop/log4j.properties ~/workspace/WordCount/src

没有复制这些文件的话程序将无法正确运行,复制完成后,务必右键点击 WordCount 选择 refresh 进行刷新(不会自动刷新,需要手动刷新),可以看到文件结构如下所示:

三个文件:

点击工具栏中的 Run 图标,或者右键点击 Project Explorer 中的 WordCount.java,选择 Run As -> Run on Hadoop,就可以运行 MapReduce 程序了。不过由于没有指定参数,运行时会提示 “Usage: wordcount “,需要通过Eclipse设定一下运行参数。

右键点击刚创建的 WordCount.java,选择 Run As -> Run Configurations,在此处可以设置运行时的相关参数(如果 Java Application 下面没有 WordCount,那么需要先双击 Java Application)。切换到 “Arguments” 栏,在 Program arguments 处填写 “input output” 就可以了。

运行程序,可以看到运行成功的提示

至此,就可以使用 Eclipse 方便的进行 MapReduce程序的开发了。

将WordCount方法打包生成JAR包

在HDFS上创建input目录 ,在本地创建一个test目录 ,在test中创建20000字测试文档,将测试文档上传到HDFS的input目录中。

运行WordCount.jar 处理1.txt文件,实现词频统计,存放在output1文件目录中。

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

浏览器登录10.0.2.15:50070查看词频统计结果:

将part-r-00000 目标文件下载,词频统计结果为下图:

参考文献

[1厦门大学数据库实验室

[2]陆嘉恒.Hadoop 实战.第 2 版.北京:机械工业出版社,2012.

[3]王鹏.云计算的关键技术与应用实例.北京:人民邮电出版社,2010.

[4]刘鹏,黄宜华,陈卫卫.实战 Hadoop.北京:电子工业版社.2011.

[5]项亮.推荐系统实践.北京:人民邮电出版社,2012.

[6]胡铮.物联网.北京:科学出版社,2010.

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/687698.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号