手写WordCount示例编写

简介: 手写WordCount示例编写

手写WordCount示例编写

需求:在给定的文本文件中统计输出每一个单词出现的总次数

数据格式准备如下:

cd /export/servers
vim wordcount.txt
hello,world,hadoop
hive,sqoop,flume,hello
kitty,tom,jerry,world
hadoop
hdfs dfs -mkdir /wordcount/
hdfs dfs -put wordcount.txt /wordcount/

定义一个mapper类

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;
public class WordCountMapper extends Mapper<LongWritable,Text,Text,LongWritable> {
    @Override
    public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        String line = value.toString();
        String[] split = line.split(",");
        for (String word : split) {
            context.write(new Text(word),new LongWritable(1));
        }
    }
}

定义一个reducer类

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;
public class WordCountReducer extends Reducer<Text,LongWritable,Text,LongWritable> {
    /**
     * 自定义reduce逻辑
     * 所有的key都是单词,所有的values都是单词出现的次数
     * @param key
     * @param values
     * @param context
     * @throws IOException
     * @throws InterruptedException
     */
    @Override
    protected void reduce(Text key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException {
        long count = 0;
        for (LongWritable value : values) {
            count += value.get();
        }
        context.write(key,new LongWritable(count));
    }
}

定义一个主类,用来描述job并提交job

public class JobMain extends Configured implements Tool {
@Override
public int run(String[] args) throws Exception {
    Job job = Job.getInstance(super.getConf(), JobMain.class.getSimpleName());
    //打包到集群上面运行时候,必须要添加以下配置,指定程序的main函数
    job.setJarByClass(JobMain.class);
    //第一步:读取输入文件解析成key,value对
    job.setInputFormatClass(TextInputFormat.class);
    TextInputFormat.addInputPath(job,new Path("hdfs://192.168.100.129:8020/wordcount"));
    //第二步:设置mapper类
    job.setMapperClass(WordCountMapper.class);
    //设置map阶段完成之后的输出类型
    job.setMapOutputKeyClass(Text.class);
    job.setMapOutputValueClass(LongWritable.class);
    //第三步,第四步,第五步,第六步,省略
    //第七步:设置reduce类
    job.setReducerClass(WordCountReducer.class);
    //设置reduce阶段完成之后的输出类型
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(LongWritable.class);
    //第八步:设置输出类以及输出路径
    job.setOutputFormatClass(TextOutputFormat.class);
    TextOutputFormat.setOutputPath(job,new Path("hdfs://192.168.100.129:8020/wordcount_out"));
    boolean b = job.waitForCompletion(true);
    return b?0:1;
}
/**
 * 程序main函数的入口类
 * @param args
 * @throws Exception
 */
public static void main(String[] args) throws Exception {
    Configuration configuration = new Configuration();
    Tool tool  =  new JobMain();
    int run = ToolRunner.run(configuration, tool, args);
    System.exit(run);
}

}

代码编写完毕后将代码打成jar包放到服务器上面去运行,实际工作当中,都是将代码打成jar包,开发main方法作为程序的入口,然后放到集群上面去运行

运行命令

hadoop jar hadoop_hdfs_operate-1.0-SNAPSHOT.jar cn.itcast.hdfs.demo1.JobMain

纯手写代码时出现Bug:

1.

运行集群并未报错,

开启JobHistory,打开浏览器19888页面找报错


目录
相关文章
|
5月前
编写Groovy Hello World 程序
编写Groovy Hello World 程序
|
6月前
|
Java
用Java编写一个代码实现计算器功能
【1月更文挑战第17天】用Java编写一个代码实现计算器功能
66 0
|
6月前
|
编译器 C++
【C++】lambda表达式语法详细解读(代码演示,要点解析)
【C++】lambda表达式语法详细解读(代码演示,要点解析)
|
6月前
|
Unix Java C语言
C 语言入门:如何编写 Hello World
C 语言是由 Dennis Ritchie 于 1972 年在贝尔实验室创建的一种通用编程语言。尽管年代久远,它仍然是一款非常流行的语言。它之所以受欢迎的主要原因是它是计算机科学领域的基础语言之一。C 语言与 UNIX 紧密相连,因为它被用于编写 UNIX 操作系统。
204 0
|
分布式计算 Hadoop Java
动手写的第一个MapReduce程序--wordcount
动手写的第一个MapReduce程序--wordcount
116 0
|
分布式计算 Hadoop 大数据
Spark 原理_总结介绍_案例编写 | 学习笔记
快速学习 Spark 原理_总结介绍_案例编写
114 0
Spark 原理_总结介绍_案例编写 | 学习笔记
|
Scala
scala多种杨辉三角简洁输出方式
scala多种杨辉三角简洁输出方式
326 0
|
自然语言处理 算法 Java
java伪代码规范,伪代码在线编辑器,
java伪代码规范,伪代码在线编辑器,
660 0
|
存储 Java 搜索推荐
记录一次solr自定义函数编写及使用的过程
solr基本查询已经可以满足大多数查询场景,不过作为一款成熟的搜索引擎solr也可以支持编写自定义函数udf并在查询中使用以应对各种复杂的查询场景。
828 1
记录一次solr自定义函数编写及使用的过程
|
分布式计算 Hadoop