MapReduce 单词统计案例编程

MapReduce
单词统计案例编程

一、在Linux环境安装Eclipse软件

1、   解压tar包

下载安装包eclipse-jee-kepler-SR1-linux-gtk-x86_64.tar.gz到/opt/software目录下。

解压到/opt/tools目录下:

[[email protected] tools]$ tar -zxf
/opt/sofeware/eclipse-jee-kepler-SR1-linux-gtk-x86_64.tar.gz -C /opt/tools/

2、   创建存放源代码的目录

[[email protected] eclipse]$ sudo
mkdir -p /opt/mysource/workspace

修改mysource的所有者为hadoop用户

[[email protected] opt]$ sudo chown
-R  hadoop:hadoop /opt/mysource/

3、   启动Eclipse

在XWindow环境中,进入/opt/tools/eclipse目录,执行eclipse打开eclipse界面。

[[email protected] eclipse]$
/opt/tools/eclipse/eclipse

设置Workspace目录为:/opt/mysource/workspace。

二、Hadoop Maven配置

1、 安装Apache Maven

(1)    解压Maven

[[email protected]
sofeware]$ tar -zxf apache-maven-3.0.5-bin.tar.gz -C /opt/modules/

(2)    配置/etc/profile文件

export MAVEN_HOME="/opt/modules/apache-maven-3.0.5"

export
PATH=$MAVEN_HOME/bin:$PATH

(3)    生效配置文件

[[email protected]
sofeware]# source /etc/profile

(4)    确认Maven配置成功

[[email protected]
sofeware]# mvn -version

Apache Maven
3.0.5 (r01de14724cdef164cd33c7c8c2fe155faf9602da; 2013-02-19 21:51:28+0800)

Maven home:
/opt/modules/apache-maven-3.0.5

Java version:
1.7.0_67, vendor: Oracle Corporation

Java home:
/opt/modules/jdk1.7.0_67/jre

Default locale:
en_US, platform encoding: UTF-8

OS name:
"linux", version: "2.6.32-504.el6.x86_64", arch:
"amd64", family: "unix"

2、 设置Eclipse中设置Maven路径

(1)    Preferences对话框左侧选择Maven下的Installations,右侧点击Add,添加一个Maven位置。

(2)    选择自己的maven目录:/opt/modules/apache-maven-3.0.5

3、 查看home目录下是否有.m2目录

在Preferences左侧的Maven下的User Setting中,查看右侧是否提示.m2目录不存在,如果不存在,要手动创建。

4、 拷贝maven的settings.xml

[[email protected] ~]$ cp
/opt/modules/apache-maven-3.0.5/conf/settings.xml ~/.m2/

三、创建WordCount程序项目

1、 创建一个Maven项目

(1)    File菜单中,新建Maven Project。

2、 添加Source Folder用来存放配置文件

将来core-site.xml、hdfs-site.xml、yarn-site.xml等配置文件存放在这个目录下。

3、 为src/main/resource指定输出路径

4、 编辑pom.xml文件

修改pom.xml后保存后,maven会自动去下载依赖包

四、编写MapReduce方法

1、   添加一个类WordCountMapReduce

WordCountMapReduce类继承org.apache.hadoop.con类并实现org.apache.hadoop.util接口。


package com.chybinmy.hadoop.mapreduce;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.util.Tool;

public class WordCountMapReduce extends Configuration
implements Tool {

}

2、   Map类


public
static class
WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {

@Override

public void map(LongWritable key, Text value, Context context)

throws IOException,
InterruptedException {

String line = value.toString();

String[] cols = line.split("\t");

for (String col : cols) {

context.write(new Text(col),
new IntWritable(1));

}

}

// step 2: Reducer Class

@Override

protected void cleanup(Context context) throws IOException,

InterruptedException {

// TODO

}

@Override

protected void setup(Context context) throws IOException,

InterruptedException {

// TODO

}

}

3、   Reduce类

public static class WordCountReduce extends Reducer<Text, IntWritable, Text, IntWritable> {
    @Override
    public void reduce(Text key, Iterable<IntWritable> values,
                       Context context) throws IOException, InterruptedException {
        int sum=0;
        for (IntWritable count :values)
        {
            sum+=count.get();
        }
        context.write(new Text(key),new IntWritable(sum));
    }

    @Override
    public void cleanup(Context context) throws IOException,
            InterruptedException {
        // TODO

    }

    @Override
    public void setup(Context context) throws IOException,
            InterruptedException {
        // TODO

    }
}

4、   run方法

public int run(String[] args) throws Exception {

    Configuration configuration = this.getConf();
    Job job = Job.getInstance(configuration, this.getClass()
            .getSimpleName());

    job.setJarByClass(this.getClass());
    Path inpath = new Path(args[0]);
    FileInputFormat.addInputPath(job, inpath);

    // output:
    Path outpath = new Path(args[1]);
    FileOutputFormat.setOutputPath(job, outpath);

    // mapper
    job.setMapperClass(WordCountMapper.class);
    job.setMapOutputKeyClass(Text.class);
    job.setMapOutputValueClass(IntWritable.class);

    // ================shuffle====================
    // 1.分区
    // job.setPartitionerClass(cls);

    // 2.排序
    // job.setSortComparatorClass(cls);

    // 3.combiner优化
    // job.setCombinerClass(WordCountCombiner.class);

    // 4.compress 压缩

    // 5.group分组
    // job.setGroupingComparatorClass(cls);

    // ================shuffle====================

    // reducer
    job.setReducerClass(WordCountReduce.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(IntWritable.class);

    //reduce个数可以指定
    //job.setNumReduceTasks(tasks);

    // submit job
    boolean isSucces = job.waitForCompletion(true);
    return isSucces ? 0 : 1;
}

5、   main方法

public static void main(String[] args) throws Exception {
    args = new String[] {
            "hdfs://bigdata-senior01.chybinmy.com:8020/wordcountdemo/input/wordcount.input",
            "hdfs://bigdata-senior01.chybinmy.com:8020/wordcountdemo/output1" };

    Configuration configuration = new Configuration();
    int status = ToolRunner.run(configuration, new WordCountMapReduce(), args);
    System.exit(status);
}

五、打包JAR,在YARN上运行

1、   将打包好的jar包放在

2、   运行jar

[[email protected] hadoop-2.5.0]$ bin/yarn jar
/opt/mysource/mapreduce.jar com.chybinmy.hadoop.mapreduce.WordCountMapReduce /wordcountdemo/input/wordcount.input
/wordcountdemo/output3

3、   查看结果


[[email protected]
hadoop-2.5.0]$ bin/hdfs dfs -text /wordcountdemo/output3/part*

hadoop  3

hbase   1

hive   
2

mapreduce      
1

spark   2

sqoop   1

storm   1

六、以WordCount为例理解MapReduce并行运行过程

1、 流程图

2、 执行过程描述

(1)    每个分片数据分配一个map任务,任务内容是用户写的map函数,map函数是尽量运行在数据分片的机器上,这样保证了“数据本地优化”。

(2)    map任务的结果是各自排好序的,各个map结果进行再次排序合并后,作为reduce任务的输入。

(3)    reduce任务执行reduce函数来处理数据,得到最终结果后,存入HDFS。

(4)    会有多个reduce任务,每个reduce任务的输入都来自于许多map任务,map任务和reduce任务之间是需要传输数据的,占用网络资源,影响效率,为了减少数据传输,可以在map()函数后,添加一个combiner函数来对结果做预处理。

来自为知笔记(Wiz)

附件列表

时间: 2024-08-01 16:13:48

MapReduce 单词统计案例编程的相关文章

Python 的mapreduce 单词统计(转载)

#!/usr/bin/env python import random # 'abc..z' alphaStr = "".join(map(chr, range(97,123))) fp = open("word.txt", "w") maxIter = 100000 for i in range(maxIter): word = "" len =random.randint(1,5) for j in range(len):

大数据阶段划分及案例单词统计

大数据阶段的重要课程划分 离线分析 : hadoop生态圈 HDFS, MapReduce(概念偏多), hive(底层是MapReduce), 离线业务分析80%都是使用hive 实时分析 : spark 数据结构 : 二叉树(面试) 动态规划, redis数据库, SSM三大框架 1. spring 2. springMVC 3. mybatis HDFSAPI HDFS创建目录 @Test public void mkdirTest() throws IOException { //1 获

手动实现一个单词统计MapReduce程序与过程原理分析

[toc] 手动实现一个单词统计MapReduce程序与过程原理分析 前言 我们知道,在搭建好hadoop环境后,可以运行wordcount程序来体验一下hadoop的功能,该程序在hadoop目录下的share/hadoop/mapreduce目录中,通过下面的命令: yarn jar $HADOOP_HOME/share/hadoop/mapreducehadoop-mapreduce-examples-2.6.4.jar wordcount inputPath outPath 即可对输入文

运行Hadoop自带的wordcount单词统计程序

0.前言 前面一篇<Hadoop初体验:快速搭建Hadoop伪分布式环境>搭建了一个Hadoop的环境,现在就使用Hadoop自带的wordcount程序来做单词统计的案例. 1.使用示例程序实现单词统计 (1)wordcount程序 wordcount程序在hadoop的share目录下,如下: [[email protected] mapreduce]# pwd /usr/local/hadoop/share/hadoop/mapreduce [[email protected] mapr

Exercise: Maps (单词统计)

A Tour of Go Exercise: Maps https://tour.golang.org/moretypes/23 WordCount (单词统计) 是一个很经典的小程序了,在很多编程入门教程中都会出现. 这道题比较简单,但也有一些知识点值得一提. 上面这个答案我是参考了网上别人写的.但在参考别人之前我也自己解题了,其中,唯一不同之处是这一句: m[word]++ 我本来写的是: _, ok := m[word] if ok { m[word]++ } else { m[word]

一步一步写算法(之单词统计)

原文:一步一步写算法(之单词统计) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 在面试环节中,有一道题目也是考官们中意的一道题目:如果统计一段由字符和和空格组成的字符串中有多少个单词? 其实,之所以问这个题目,考官的目的就是想了解一下你对状态机了解多少. (1) 题目分析 从题目上看,如果对一个字符串进行处理,那么可以有下面几种情形:初始状态,字符状态,空格状态,结束状态.那么这几种状态之间应该怎么迁移呢? 初始状态: 如果输入符号是

Spark入门(三)--Spark经典的单词统计

spark经典之单词统计 准备数据 既然要统计单词我们就需要一个包含一定数量的文本,我们这里选择了英文原著<GoneWithTheWind>(<飘>)的文本来做一个数据统计,看看文章中各个单词出现频次如何.为了便于大家下载文本.可以到GitHub上下载文本以及对应的代码.我将文本放在项目的目录下. 首先我们要读取该文件,就要用到SparkContext中的textFile的方法,我们尝试先读取第一行. scala实现 import org.apache.spark.{SparkCo

Java实现单词统计

原文链接: https://www.toutiao.com/i6764296608705151496/ 单词统计的是统计一个文件中单词出现的次数,比如下面的数据源 其中,最终出现的次数结果应该是下面的显示 那么在MapReduce中该如何编写代码并出现最终结果? 首先我们把文件上传到HDFS中(hdfs dfs –put …) 数据名称:data.txt,大小是size是2G 红黄绿三个块表示的是数据存放的块 然后数据data.txt进入map阶段,会以<K,V>(KV对)的形式进入,K表示的

《C++ Primer》P314中使用insert重写单词统计程序的扩展

编写程序统计并输出所读入的单词出现的次数 想与习题10-1相结合,也就是先输入几组 map<string, int>类型,存入vector中. 再输入单词word,如果已经存在则在key对应的value+1 如果不存在,则插入并使得其value为1. 之前的问题是->输入了一次之后,再要输入单词word,读不进.(呵呵 果然小白) 看到11章之后,知道要用语句cin.clear;使得输入流重新有效. 再然后 重新熟悉了iterator对map的操作. #include <iostr