Hadoop入门-自写实例 wordcount

原创 2018年04月16日 10:01:46

本文自写wordcount实例,以期熟悉Hadoop操作,以下为详细记录.

自写wordcount

新建wordcount目录,并在该目录下新建两个子目录分别为src和classes.分别存放源码和编译结果.
最简单的MapReduce程序,只需要三个Java文件即可

WordMapper

package com.linroid.hadoop;

import java.io.IOException;
import java.util.StringTokenizer;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

public class WordMapper extends Mapper<Object, Text, Text, IntWritable> {

    /**
     * IntWritable, Text 均是 Hadoop 中实现的用于封装 Java 数据类型的类,这些类实现了WritableComparable接口,
     * 都能够被串行化从而便于在分布式环境中进行数据交换,你可以将它们分别视为int,String 的替代品。
     * 声明one常量和word用于存放单词的变量
     */
    IntWritable one = new IntWritable(1);
    Text word = new Text();

    /**
     * Mapper中的map方法:
     * void map(K1 key, V1 value, Context context)
     * 映射一个单个的输入k/v对到一个中间的k/v对
     * 输出对不需要和输入对是相同的类型,输入对可以映射到0个或多个输出对。
     * Context:收集Mapper输出的<k,v>对。
     * Context的write(k, v)方法:增加一个(k,v)对到context
     * 程序员主要编写Map和Reduce函数.这个Map函数使用StringTokenizer函数对字符串进行分隔,通过write方法把单词存入word中
     * write方法存入(单词,1)这样的二元组到context中
     */ 
    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);
        }
    }
}

WordReduce

package com.linroid.hadoop;

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

public class WordReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
    IntWritable result = new IntWritable();

        /**
         * Reducer类中的reduce方法:
         * void reduce(Text key, Iterable<IntWritable> values, Context context)
         * 中k/v来自于map函数中的context,可能经过了进一步处理(combiner),同样通过context输出           
         */
    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);
    }
}

WordCount

package com.linroid.hadoop;

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.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;

public class WordCount {
    public static void main(String[] args) throws Exception {
        /**
         * Configuration:map/reduce的j配置类,向hadoop框架描述map-reduce执行的工作
         */
        Configuration conf = new Configuration();
        String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
        if(otherArgs.length != 2) {
            System.err.println("Usage: wordcount <in> <out>");
            System.exit(2);
        }

        Job job = new Job(conf, "wordcount"); //设置一个用户定义的job名称
        job.setJarByClass(WordCount.class); 
        job.setMapperClass(WordMapper.class); //为job设置Mapper类
        job.setCombinerClass(WordReducer.class); //为job设置Combiner类
        job.setReducerClass(WordReducer.class); //为job设置Reducer类
        job.setOutputKeyClass(Text.class); //为job的输出数据设置Key类
        job.setOutputValueClass(IntWritable.class); //为job输出设置value类
        FileInputFormat.addInputPath(job, new Path(otherArgs[0])); //为job设置输入路径
        FileOutputFormat.setOutputPath(job, new Path(otherArgs[1])); //为job设置输出路径
        System.exit(job.waitForCompletion(true)?0:1); 
    } 
}

理解MapReduce工作过程

此处输入图片的描述

此处输入图片的描述

编译

Hadoop2.x 版本编译不再集中到一个hadoop-core-*.jar中,而是需要多个jar,如下图找到这些jar的目录

此处输入图片的描述

然后使用javac命令进行编译

javac -classpath /usr/local/hadoop/share/hadoop/common/hadoop-common-2.6.5.jar:/usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.6.5.jar:/usr/local/hadoop/share/hadoop/common/lib/commons-cli-1.2.jar -d classes/ src/*.java

如图所示:

此处输入图片的描述

  • classpath,设置源代码里使用的各种类库所在的路径,多个路径用”:”隔开。
  • d,设置编译后的 class 文件保存的路径。
  • src/*.java,待编译的源文件。

打包

jar -cvf wordcount.jar classes

如图所示:

此处输入图片的描述

执行

  • 切换用户到hadoop并启动hadoop
su - hadoop #输入密码
start-all.sh #启动hadoop
  • 我们直接用上篇博文中的LIENCE.txt作为测试样本即可
hadoop jar /home/mutex/word-count/wordcount.jar com.linroid.hadoop.WordCount /input /otput

此处输入图片的描述

然后再otput目录中查看结果

hdfs dfs -cat /otput/part-r-00000

如图所示:
此处输入图片的描述

参考:初学Hadoop之图解MapReduce与WordCount示例分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Linux1s1s/article/details/79956847

IDEA + Hadoop工程入门实例 ——Word Count编程

一、       启动IDEA 进入/home/iespark/hadoop_program_files/idea-IC-143.1184.17/bin,执行“./idea.sh”。 二、    ...
  • lishuan182
  • lishuan182
  • 2016-04-26 09:16:56
  • 4356

Hadoop大数据平台入门——第一个小程序WordCount

首先我们需要安装Hadoop,并对Hadoop进行配置。这里我们就不赘述了,详情看这篇博客:Hadoop安装配置 值得注意的是,配置的时候,需要给Hadoop权限才能正确执行。最简单的办法就是讲ha...
  • a60782885
  • a60782885
  • 2017-05-07 10:42:30
  • 8854

hadoop简单实例-WordCount

开发环境:window7 如果不知道怎么在window环境下安装hadoop,请参考教你Windows平台安装配置Hadoop2.5.2(不借助cygwin) 本实例先贴源代码,再讲解步骤。 ...
  • antgan
  • antgan
  • 2016-07-29 19:15:04
  • 3966

hadoop自带示例wordcount

1.首先确认你的hadoop启动了。 master与slave启动方式相同,进入hadoop目录下的sbin目录,命令:$cd /home/hadoop/hadoop/sbin (根据个人安装的had...
  • xiakexiaohu
  • xiakexiaohu
  • 2017-01-17 22:18:11
  • 1910

Hadoop入门经典:WordCount

以下程序在hadoop1.2.1上测试成功。 本例先将源代码呈现,然后详细说明执行步骤,最后对源代码及执行过程进行分析。 一、源代码 package org.jediael.hadoopdemo.wo...
  • jediael_lu
  • jediael_lu
  • 2014-08-20 14:43:57
  • 43953

Hadoop安装配置、运行第一个WordCount示例程序

操作系统ubuntu。本篇目的是在单机模式下运行成功WordCount示例程序。 本篇小结安装步骤,遇到的问题和解决办法。 疑惑点及其思考。 Hadoop是为linux而开发的,...
  • qq_23617681
  • qq_23617681
  • 2016-04-17 11:21:45
  • 782

Hadoop伪分布式运行wordcount小例子

先说点小知识 hadoop fs 使用面最广,可以操作任何文件系统 hadoop dfs和hdfs dfs只能操作HDFS相关的 在上一篇博客中,我们已经成功启动了HDFS和YARN,接下来 先建数...
  • Dr_Guo
  • Dr_Guo
  • 2016-03-14 22:33:18
  • 2430

Hadoop入门-WordCount示例

WordCount的过程如图,这里记录下入门的过程,虽然有很多地方理解的只是皮毛。 Hadoop的安装 安装比较简单,安装完成后进行单机环境的配置。 hadoop-env.sh:指定JAVA_HOM...
  • H12KJGJ
  • H12KJGJ
  • 2017-11-27 09:42:47
  • 123

运行hadoop自带wordcount例子

运行hadoop自带wordcount例子 GSS initiate failed
  • T555222
  • T555222
  • 2017-09-07 16:00:18
  • 2074

Hadoop(4-2)-MapReduce程序案例-WordCount(Intellij Idea环境)

一、软件环境 我使用的软件版本如下: 1. Intellij Idea 2017.1二、创建maven工程及配置 2.1创建工程 打开Idea,file->new->Project,左...
  • yyl424525
  • yyl424525
  • 2017-08-10 00:00:26
  • 389
收藏助手
不良信息举报
您举报文章:Hadoop入门-自写实例 wordcount
举报原因:
原因补充:

(最多只允许输入30个字)