手写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页面找报错


目录
相关文章
|
8月前
|
存储 SQL 数据库
超级实用的python代码片段汇总和详细解析(16个)(下)
超级实用的python代码片段汇总和详细解析(16个)
138 0
|
4月前
|
SQL JavaScript 前端开发
基于Python访问Hive的pytest测试代码实现
根据《用Java、Python来开发Hive应用》一文,建立了使用Python、来开发Hive应用的方法,产生的代码如下
88 6
基于Python访问Hive的pytest测试代码实现
|
5月前
|
Python
Python一行代码能做什么,30个实用案例代码详解
Python一行代码能做什么,30个实用案例代码详解
40 0
|
5月前
|
测试技术 Python
Python接口自动化测试框架(基础篇)-- 常用数据类型Number
这篇文章是关于Python接口自动化测试中常用数据类型Number的基础介绍,涵盖了int、float、bool类型以及数学函数和常量的使用,强调了这些数据类型在自动化测试框架中的广泛应用。
34 0
Python接口自动化测试框架(基础篇)-- 常用数据类型Number
|
7月前
|
机器学习/深度学习 算法 开发者
极简Python代码和编写技巧
极简Python代码和编写技巧
36 0
|
8月前
|
Python
Python 的编码规范和最佳实践: 解释 Python 的文档字符串(docstring)是什么?如何编写好的文档字符串?
【4月更文挑战第16天】Python docstrings是注释,用于说明代码功能。放置于对象定义前,用三引号包围。遵循PEP 257,使用reStructuredText格式,确保简洁、完整、准确。例如: ```markdown ```python def add(a, b): """ 计算两数之和。 参数: a -- 第一加数 b -- 第二加数 返回: 和 """ return a + b ``` ```
120 0
|
XML 存储 数据采集
如何使用Python和正则表达式处理XML表单数据
如何使用Python和正则表达式处理XML表单数据
|
程序员 开发工具 数据库
如何用PEP 8编写优雅的Python代码
如何用PEP 8编写优雅的Python代码
|
Python
一日一技:使用doctest测试Python代码的注释
一日一技:使用doctest测试Python代码的注释
168 0
|
XML JSON 编解码
python+pytest接口自动化(6)-请求参数格式的确定(一)
我们在做接口测试之前,先需要根据接口文档或抓包接口数据,搞清楚被测接口的详细内容,其中就包含请求参数的编码格式,从而使用对应的参数格式发送请求。例如某个接口规定的请求主体的编码方式为 application/json,那么在请求该接口时,请求参数格式必须是 json 格式,使用其他的编码方式请求不会成功。 那么,在http请求中,请求主体常用的编码方式有哪些?每种编码方式在python中需要对应使用什么样格式的请求参数?这便是咱们在本篇博客要弄明白的地方。
python+pytest接口自动化(6)-请求参数格式的确定(一)