Hadoop实现WordCount(从零开始)

主要是做个笔记,记录一下自己学习实现的过程(参考了一些博文),同时留给大家做参考

1、首先搭建Hadoop全分布模式集群,参考博主 码仙♥ 的博客,链接如下 :                        Hadoop环境搭建_码仙♥的博客-CSDN博客

2、直接在master本地根目录下创建一个项目的文件夹,写一个java源文件:

cd
mkdir wordcount
cd wordcount
vim WordCount.java

3、按i键打开编辑,粘贴下面的代码,按esc,然后输入 :wq 保存退出

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.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{

    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 {
    private IntWritable result = new IntWritable();

    public void reduce(Text key, Iterable 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);
  }
}

 (当前wordcount文件夹)

4、启动hadoop

cd /opt/hadoop/hadoop/sbin
start-all.sh

5、 修改.bashrc文件,添加Hadoop 的classhpath 路径(据我理解,这一步让我们的WordCount可以使用Mapper、Reducer等作为基类)

cd
vim .bashrc

(.bashrc文件是隐藏文件,如果在根目录下查看需要使用ls -a)

在文件末尾添加如下两行:(路径根据你安装hadoop时的路径可能有所不同)

export HADOOP_HOME="/opt/hadoop/hadoop"
export CLASSPATH="$($HADOOP_HOME/bin/hadoop classpath):$CLASSPATH"

保存退出,运行以下代码,使配置生效

source .bashrc

6、编译并打包WordCount程序

先编译(编译不过的话,看看源码有没有粘全)

cd
cd wordcount
javac WordCount.java

 (当前wordcount文件夹)

在当前wordcount目录输入命令,把class文件打包成jar:

jar -cvf WordCount.jar WordCount*.class

  (当前wordcount文件夹)

 jar命令具体用法可见:

Jar命令使用_Apple-yeran的博客-CSDN博客_往jar包添加文件

7、在hdfs上搞一个输入文件

hdfs用法参考:

【hadoop系列】Hadoop HDFS命令_我去图书馆了的博客-CSDN博客_hadoop查看hdfs目录

在本地创建一个file0文件:

cd
cd wordcount
vim file0

自己写点英文就行,我写的是下面的:

I am your father!
No! No!
That's not true!
That's impossible!

然后你的wordcount文件夹下就多了一个file0文件,我先把它传到hdfs上

先在hdfs上建一个input文件夹,再把file0从本地传上去

cd
hadoop fs -mkdir /wc
hadoop fs -mkdir /wc/input
hadoop fs -copyFromLocal ~/wordcount/file0 /wc/input

输入下面的代码应该能看到

hadoop fs -ls /wc/input

 8、运行

OK!然后就可以跑了

cd
hadoop jar ~/wordcount/WordCount.jar WordCount /wc/input /wc/output

运行结果会自动存储在hdfs的/wc/output文件夹里,注意运行前不要提前建这个文件夹,不然会报错!

hadoop 用MapReduce运行jar的命令可以参考:

hadoop jar 命令 执行MapReduce 任务_柱子z的博客-CSDN博客

(有这玩意儿应该就是成了)

9、看一下运行结果

 hadoop fs -cat /wc/output/part-r-00000

Hadoop实现WordCount(从零开始)_第1张图片

捏麻麻地终于写完了! ( •̀ ω •́ )y

如果有错误欢迎指正!

参考文章:

代码取自——Mapreduce官方教程

Apache Hadoop 3.3.4 – MapReduce Tutorial

本文主要参考了 银晗 dalao的博客

Hadoop完全分布式实现WordCount_银晗的博客-CSDN博客_hadoop实现wordcount

其他参考文章已在文中注出!(●'◡'●)

你可能感兴趣的:(hadoop,大数据,hdfs,mapreduce)