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

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

实验配置:系统:Ubuntu Kylin | 环境:Hadoop | 软件:Eclipse

一、安装Linux

一般来说,如果要做服务器,我们选择CentOS或者Ubuntu Server;如果做桌面系统,我们选择Ubuntu Desktop。但是在学习Hadoop方面,虽然两个系统没有多大区别,但是个人在学习生活中常用Ubuntu,所以本实验采用Ubuntu Kylin版本。相关下载文件可以从参考资料[1]中获取。

二、准备工作

1.创建Hadoop账户

1.首先按 ctrl+alt+t 打开终端窗口,输入如下命令创建新用户
代码如下:

1|sudo useradd -m hadoop -s /bin/bash

这条命令创建了可以登陆的 hadoop 用户,并使用 /bin/bash 作为 shell。

2.设置hadoop密码

代码如下:

1|sudo passwd hadoop

3.为hadoop用户增加管理员权限

代码如下:

1|sudo adduser hadoop sudo

最后注销当前用户(点击屏幕右上角的齿轮,选择注销),返回登陆界面。在登陆界面中选择刚创建的 hadoop 用户进行登陆。
在这里插入图片描述

4.更新 apt

用 hadoop 用户登录后,先更新一下 apt,后续将使用 apt 安装软件,如果没更新可能有一些软件安装不了。 打开终端窗口,执行如下命令:

1|sudo apt-get update

在这里插入图片描述
如果出现“Hash校验和不符”的提示,可以通过更改软件源解决。
在这里插入图片描述
这里安装一下vim

1|sudo apt-get install vim

5.安装SSH并配置免密登录

系统已经默认安装SSH client,我们需要额外安装SSH server

1|sudo apt-get install openssh-server

在这里插入图片描述
安装后,尝试登陆本机

1|ssh localhost

在这里插入图片描述
这样SSH server就安装好了,接下来配置免密登录

1|exit		# 退出刚才的 ssh localhost(如果刚刚没登录则省略)
2|cd ~/.ssh/		# 若没有该目录,请先执行一次ssh localhost
3|ssh-keygen -t rsa		# 会有提示,一直按回车即可
4|cat ./id_rsa.pub >> ./authorized_keys	# 加入授权

此时再用ssh localhost命令,即可免密登录
在这里插入图片描述

6.安装Java环境

我这里使用手动安装JDK的方式,可以用其他方式代替

把JDK安装包放到下载目录下(如果系统语言是英文则为Download)

为了方便后续安装,一并把hadoop安装包和hadoop-eclipse-plugin放置在此目录下
在这里插入图片描述
在终端执行如下命令

1|cd /usr/lib
2|sudo mkdir jvm		#创建/usr/lib/jvm目录用来存放JDK文件
3|cd ~		#进入hadoop用户的主目录
4|cd 下载		#英文注意区分大小写字母,刚才已经通过把JDK安装包jdk-8u162-linux-x64.tar.gz上传到该目录下
sudo tar -zxvf ./jdk-8u162-linux-x64.tar.gz -C /usr/lib/jvm		#把JDK文件解压到/usr/lib/jvm目录下

JDK文件解压缩以后,可以执行如下命令到解压目录下查看

1|cd /usr/lib/jvm
2|ls

在这里插入图片描述
接下来设置环境变量
使用如下命令打开环境变量配置文件

1|cd ~
2|vim ~/.bashrc

在开头添加以下内容(这里需要注意,进入到配置文件的时候,按i进行插入,按esc退出编辑,然后按:w代表写入,q是退出)

export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_162
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

在这里插入图片描述
按 :wq 保存文件并退出编辑器,执行如下命令使得配置生效

1|source ~/.bashrc

这时候可以使用如下命令查看是否安装成功

1|java -version

在这里插入图片描述

7.安装Hadoop

先将Hadoop安装到目标文件夹

1|sudo tar -zxf ~/下载/hadoop-2.10.0.tar.gz -C /usr/local		#解压到/usr/local中
2|cd /usr/local/
3|sudo mv ./hadoop-2.6.0/ ./hadoop		#将文件夹名改为hadoop
4|sudo chown -R hadoop ./hadoop		#修改文件权限

Hadoop 解压后即可使用。输入如下命令来检查 Hadoop 是否可用,成功则会显示 Hadoop 版本信息

1|cd /usr/local/hadoop
2|./bin/hadoop version

在这里插入图片描述
接下来进行Hadoop伪分布式配置
我们要修改位于/usr/local/hadoop/etc/hadoop/中的core-site.xml 和hdfs-site.xml两个配置文件

1|cd /usr/local/hadoop/etc/hadoop/
2|vim core-site.xml

修改配置文件 core-site.xml 将当中的

1|<configuration>
2|</configuration>

修改成下面配置

<configuration>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>file:/usr/local/hadoop/tmp</value>
        <description>Abase for other temporary directories.</description>
    </property>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://localhost:9000</value>
    </property>
</configuration>

在这里插入图片描述
同理,修改配置文件 hdfs-site.xml

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/usr/local/hadoop/tmp/dfs/name</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/usr/local/hadoop/tmp/dfs/data</value>
    </property>
</configuration>

在这里插入图片描述
配置完成后,执行NameNode的格式化

1|cd /usr/local/hadoop
2|./bin/hdfs namenode -format

成功如下所示
在这里插入图片描述
接着开启NameNode 和 DataNode 进程

1|cd /usr/local/hadoop
2|./sbin/start-dfs.sh

出现SSH提示输入yes即可,接着用jps命令查看,可以看到NameNode和DataNode进程在这里插入图片描述
成功启动后,可以访问 Web 界面http://localhost:50070查看 NameNode 和 DataNode 信息,还可以在线查看 HDFS 中的文件
在这里插入图片描述

三、调用MapReduce执行WordCount对单词进行计数

1.安装Eclipse

首先安装 Eclipse,在桌面左侧任务栏,点击“Ubuntu Kylin软件中心”,可以搜索直接安装
在这里插入图片描述
然后安装 Hadoop-Eclipse-Plugin,先解压文件

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

把release 中的 hadoop-eclipse-kepler-plugin-2.6.0.jar复制到复制到 Eclipse 安装目录的 plugins 文件夹中

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

重启Eclipse,安装完第一次要用此方法重启,之后使用可以正常启动

1|/usr/lib/eclipse/eclipse -clean

2.配置Hadoop-Eclipse-Plugin

在继续配置前确保已经开启Hadoop
启动eclipse后可以在左侧看到插件安装成功
在这里插入图片描述

插件需要进一步的配置

第一步:选择 Window 菜单下的 Preference
在这里插入图片描述
此时会弹出一个窗口,点击左侧Hadoop Map/Reduce 选项,选择 Hadoop 的安装目录(如/usr/local/hadoop,Ubuntu不好选择目录,直接输入就行)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第三步:建立与 Hadoop 集群的连接,点击 Eclipse软件右下角的 Map/Reduce Locations 面板,在面板中单击右键,选择 New Hadoop Location
在这里插入图片描述
在弹出来的General 选项面板中,取一个名称,因为我使用的是Hadoop伪分布,DFS Master的Port要改成9000,其余默认
在这里插入图片描述
点击finsh,Map/Reduce Location 就创建好了

需要注意的是,Hadoop系统安装好以后,第一次使用HDFS时,需要首先在HDFS中创建用户目录
可以使用如下命令创建一个input目录

1|./bin/hdfs dfs –mkdir input

然后,可以使用如下命令把需要WordCount记数的文件上传到HDFS中的当前用户目录的input目录下
我使用的文件是king.txt,目录为"/usr/local/hadoop"
在这里插入图片描述

3.在 Eclipse 中创建 MapReduce 项目

首先,点击File菜单,选择New——Project
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201219174253905.png#pic_center在这里插入图片描述

选择 Map/Reduce Project,点击 Next
在这里插入图片描述

填写 Project name,名字自己定,点击 Finish 就创建好了项目
在这里插入图片描述
此时在左侧的 Project Explorer 就能看到刚才建立的项目了
在这里插入图片描述

4.进行WordCount,输出结果,保存到本地

右键点击创建的 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();
        String[] otherArgs=new String[]{"input","output"};
        if(otherArgs.length < 2) {
            System.err.println("Usage: wordcount <in> [<in>...] <out>");
            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<Text, IntWritable, Text, IntWritable> {
        private IntWritable result = new IntWritable();
 
        public IntSumReducer() {
        }
 
        public void reduce(Text key, Iterable<IntWritable> values, Reducer<Text, IntWritable, Text, IntWritable>.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<Object, Text, Text, IntWritable> {
        private static final IntWritable one = new IntWritable(1);
        private Text word = new Text();
 
        public TokenizerMapper() {
        }
 
        public void map(Object key, Text value, Mapper<Object, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException {
            StringTokenizer itr = new StringTokenizer(value.toString());
 
            while(itr.hasMoreTokens()) {
                this.word.set(itr.nextToken());
                context.write(this.word, one);
            }
 
        }
    }
}

复制完成后,刷新可以看到文件结构
在这里插入图片描述
点击工具栏中的 Run 图标,或者右键点击 Project Explorer 中的 WordCount.java,选择 Run As -> Run on Hadoop,就可以运行 MapReduce 程序了
在这里插入图片描述
出现如下信息则表示运行成功
在这里插入图片描述
此时可以在DFS Locations-Map ReduceLocation-user-adoop-output中看到part-r-00000文件,就是运行结果
在这里插入图片描述
也可以通过输入下面命令进行查看

1|cd /usr/local/haddop
2|./bin/hdfs dfs -cat output/part-r-00000

在这里插入图片描述
输入下面命令,可以把HDFS中文件下载到本地文件系统中的“/home/hadoop/下载/”这个目录下

1|./bin/hdfs dfs -get output/part-r-00000  /home/hadoop/下载  

四、参考材料

  1. http://dblab.xmu.edu.cn/blog/285/
  2. http://dblab.xmu.edu.cn/blog/290-2/
  3. http://dblab.xmu.edu.cn/blog/hadoop-build-project-using-eclipse/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
首先,你需要编写 MapReduce 程序来对文件单词出现次数进行统计。下面是一个简单的示例程序: ```java import java.io.IOException; 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.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 WordCount { public static class TokenizerMapper extends Mapper<LongWritable, Text, Text, IntWritable>{ private final static IntWritable one = new IntWritable(1); private Text word = new Text(); public void map(LongWritable 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, "word count"); 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); } } ``` 在这个程序,`TokenizerMapper` 类将输入文件的每行按空格分割为单词,然后将每个单词作为键,将值设置为 `1`,并发射到上下文。 `IntSumReducer` 类对每个键的值进行求和,并将结果输出。 在 `main` 方法,我们设置了 Mapper 和 Reducer 类、输入和输出路径,并启动了我们的作业。 接下来,你可以通过以下步骤使用 IntelliJ IDEA 来运行该程序: 1. 打开 IntelliJ IDEA,并创建一个新项目。 2. 将上述代码复制到新项目的 `WordCount.java` 文件。 3. 点击菜单栏的 `File -> Project Structure`,在弹出的窗口选择 `Libraries`,然后点击 `+` 按钮添加 Hadoop JARs。 4. 在 `Project Structure` 窗口选择 `Artifacts`,然后点击 `+` 按钮添加一个可执行的 JAR 文件。 5. 在 `Main Class` 输入 `WordCount`,然后点击 `OK`。 6. 点击菜单栏的 `Build -> Build Artifacts`,然后选择 `Build`。 7. 在 `out/artifacts/WordCount_jar` 目录下找到生成的 JAR 文件。 8. 在命令行输入以下命令来运行程序: ``` hadoop jar WordCount.jar <input_file_path> <output_directory_path> ``` 注意,你需要将 `<input_file_path>` 替换为包含输入文件的路径,将 `<output_directory_path>` 替换为输出目录的路径。 当作业完成后,你可以在输出目录找到一个包含单词计数的文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值