从零开始 之 使用 MapReduce 对文件进行词频统计

从零开始 之 使用 MapReduce 对文件进行词频统计,第1张

从零开始 之 使用 MapReduce 对文件进行词频统计

文章目录
  • 1. Linux的选择
  • 2. 在 Ubuntu 中安装 Hadoop
    • 2.1 创建Hadoop用户
    • 2.2 下载并安装 Hadoop3.3.1
  • 3. 安装 Java 环境
    • 3.1 下载并进行配置
  • 4. 使用 MapReduce进行词频统计
    • 4.1 数据上传
    • 4.2 数据处理
      • 4.2.1 在Eclipse中创建项目
        • (1)设置工作空间
        • (2)创建一个Java工程
        • (3)为项目添加所用包
        • (4)编写WordCount.java
        • (5) 编写代码
        • (6)修改配置文件
        • (7)编译运行
      • 4.2.2 部署程序
        • (1)打包 WordCount 程序,生成 JAR 包
        • (2)部署到Hadoop平台上运行
    • 4.3、处理结果
      • 4.3.1 查看output文件夹中有无生成文件
      • 4.3.2 使用以下命令查看统计结果并将结果输入到 KarlMarxCount.txt文件中

1. Linux的选择

在Linux系统各个发行版中,Ubuntu系统在服务端和桌面端使用占比最高,网络上资料最是齐全,所以此处选择 Ubuntu 系统
Ubuntu 下载地址:百度网盘 ;提取码:ziyu

2. 在 Ubuntu 中安装 Hadoop
Hadoop的安装方式有三种,分别是单机模式,伪分布式模式,分布式模式。
  • 单机模式:单机模式:Hadoop 默认模式为非分布式模式(本地模式),无需进行其他配置即可运行。
  • 非分布式即单 Java 进程,方便进行调试。
  • 伪分布式模式:Hadoop 可以在单节点上以伪分布式的方式运行,Hadoop 进程以分离的 Java 进程来运行,节点既作为 NameNode 也作为 DataNode,同时,读取的是 HDFS 中的文件。
    分布式模式:使用多个节点构成集群环境来运行Hadoop。
2.1 创建Hadoop用户
  • 使用如下命令在终端中创建 hadoop 用户
sudo useradd -m hadoop -s /bin/bash #这条命令创建了可以登陆的 hadoop 用户,并使用 /bin/bash 作为 shell。
sudo passwd hadoop #设置密码
sudo adduser hadoop sudo #为 hadoop 用户增加管理员权限,方便部署
sudo adduser hadoop sudo

接着注销当前用户,选择用 hadoop 用户进行登录

hadoop 用户登录后,更新一下 apt,后续我们使用 apt 安装软件

sudo apt-get update	#更新 apt
2.2 下载并安装 Hadoop3.3.1

在上述百度网盘文件夹中的软件找到 hadoop-3.1.3.tar.gz 进行下载,将 hadoop-3.1.3.tar.gz文件,下载到本地。
选择将 Hadoop 安装至 /usr/local/ 中:

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

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

cd /usr/local/hadoop
./bin/hadoop version
3. 安装 Java 环境 3.1 下载并进行配置
  • 下载 jdk-8u162-linux-x64.tar.gz 安装包

Hadoop3.1.3需要JDK版本在1.8及以上,可在上述百度网盘中找到进行下载

Linux命令行界面中,执行如下Shell命令

cd /usr/lib
sudo mkdir jvm #创建/usr/lib/jvm目录用来存放JDK文件
cd ~ #进入hadoop用户的主目录
cd Downloads  #注意区分大小写字母,刚才已经通过FTP软件把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文件解压缩以后,可以执行如下命令到/usr/lib/jvm目录查看一下:

cd /usr/lib/jvm
ls

可以看到,在/usr/lib/jvm目录下有个jdk1.8.0_162目录。
下面继续执行如下命令,设置环境变量:

cd ~
vim ~/.bashrc

在这个文件的开头位置,添加如下几行内容:

export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_162
export JRE_HOME= J A V A H O M E / j r e e x p o r t C L A S S P A T H = . : {JAVA_HOME}/jre export CLASSPATH=.: JAVAH​OME/jreexportCLASSPATH=.:{JAVA_HOME}/lib: J R E H O M E / l i b e x p o r t P A T H = {JRE_HOME}/lib export PATH= JREH​OME/libexportPATH={JAVA_HOME}/bin:$PATH

保存.bashrc文件并退出vim编辑器。然后,继续执行如下命令让.bashrc文件的配置立即生效:

source ~/.bashrc

使用如下命令查看是否安装成功

java -version

如果能够在屏幕上返回如下信息,则说明安装成功:

hadoop@ubuntu:~$ java -version
java version “1.8.0_162”
Java™ SE Runtime Environment (build 1.8.0_162-b12)
Java HotSpot™ 64-Bit Server VM (build 25.162-b12, mixed mode)

4. 使用 MapReduce进行词频统计 4.1 数据上传

上网找一份 1w 以上英语单词量的文本进行测试

这里以 Karl Marx 整合成一份 .txt 文本为例。
在虚拟机中启动Hadoop:

将该文件上传到HDFS:
检查文件是否上传成功

4.2 数据处理 4.2.1 在Eclipse中创建项目 (1)设置工作空间

(2)创建一个Java工程

(3)为项目添加所用包
  • “/usr/local/hadoop/share/hadoop/common”目录下的 hadoop-common-3.1.3.jar 和 haoop-nfs-3.1.3.jar;
  • “/usr/local/hadoop/share/hadoop/common/lib”目录下的所有 JAR 包;
  • “/usr/local/hadoop/share/hadoop/mapreduce”目录下的所有 JAR 包,但是, 不包括 jdiff、lib、lib-examples 和 sources 目录;
  • “/usr/local/hadoop/share/hadoop/mapreduce/lib”目录下的所有 JAR 包。
(4)编写WordCount.java

选择New->Class新建Java类文件名称为WordCount;

(5) 编写代码
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 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);
            }
        }
    }
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);
        }
    }
}
(6)修改配置文件

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

(7)编译运行

控制台出现以下结果为成功:

4.2.2 部署程序 (1)打包 WordCount 程序,生成 JAR 包

(2)部署到Hadoop平台上运行
  • 启动Hadoop,命令如下:
cd /usr/local/hadoop
 ./sbin/start-dfs.sh
  • 删除HDFS中与当前Linux用户hadoop对应的input和output目录,确保后续程序的运行不会出现问题
 cd /usr/local/hadoop
 ./bin/hdfs dfs -rm -r input
 ./bin/hdfs dfs -rm -r output
  • 把需要统计的词频文件上传到input目录中
 ./bin/hdfs dfs -put /usr/local/hadoop/KarlMarx.txt input
  • 创建myapp文件
 cd /usr/local/hadoop
 mkdir myapp
  • 将词频统计程序放到/usr/local/Hadoop/myapp文件中
    cd到 /usr/local/hadoop中使用以下命令,运行打包的程序
./bin/hadoop jar ./myapp/WordCount.jar input output
4.3、处理结果 4.3.1 查看output文件夹中有无生成文件
./bin/hdfs dfs -ls output

4.3.2 使用以下命令查看统计结果并将结果输入到 KarlMarxCount.txt文件中
./bin/hdfs dfs -cat part-r-0000 | sudo tee /usr/local/KarlMarxCount.txt



自此,完成使用 MapReduce 对文件进行词频统计

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存