Hadoop系列(七)Hadoop三大核心之MapReduce-程序编写

目录

  • 1. 准备部分
  • 2. jar包依赖
  • 3. Map部分
  • 4.Reduce部分
  • 5.提交部分
  • 6.打包提交

接下来以一个简单的WordCount为例子,介绍Java版本的MapReduce的程序编写。

mapreduce程序主要分三部分:1.map部分,2.reduce部分,3.提交部分。

1. 准备部分

hadoop中,针对数据类型自成一体,与java的数据类型对应。封装在hadoop.io包中,主要分为基本类型和其它类型。

  • 基本数据类型
数据类型 hadoop数据类型 Java数据类型
布尔 BooleanWritable boolean
整型 IntWritable int
长整型 LongWritable long
浮点型 FloatWritable float
双精浮点 DoubleWritable double
字节 ByteWritable byte
  • 其它类型
数据类型 hadoop数据类型 Java数据类型
字符串 Text String
数组 ArrayWritable Array
Map MapWritable Map

2. jar包依赖

创建一个maven工程,pom.xml文件中,添加以下依赖

<dependencies>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>2.6.0</version>
    </dependency>

    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-hdfs</artifactId>
        <version>2.6.0</version>
    </dependency>

    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-client</artifactId>
        <version>2.6.0</version>
    </dependency>
</dependencies>

3. Map部分

映射部分,将数据逐条处理

首先,需要继承Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>类

四个泛型参数分别代表:输入key 输出value 输出key 输出value

然后重写mapper的map方法

map(KEYIN key, VALUEIN value, Context context) throws IOException, InterruptedException

主体代码:

public class WordCountMap extends Mapper<LongWritable, Text, Text, IntWritable> {

    /**
     *  流程,输入key和value,map的结果写入到context中
     */
    @Override
    public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        //读取一行数据
        String line = value.toString();
        //因为英文字母是以“ ”为间隔的,因此使用“ ”分隔符将一行数据切成多个单词并存在数组中
        String str[] = line.split(" ");
        //循环迭代字符串,将一个单词变成<key,value>形式,及<"hello",1>
        for (String s : str) {
            context.write(new Text(s), new IntWritable(1));
        }
    }

}

4.Reduce部分

归并部分,将map处理和shuffle之后的数据进行归并。shuffle过程由hadoop控制

Reducer<KEYIN,VALUEIN,KEYOUT,VALUEOUT>

四个泛型参数分别代表:输入key 输出value 输出key 输出value

然后重写reducer的reduce方法

reduce(KEYIN key, Iterable<VALUEIN> values, Context context) throws IOException, InterruptedException

主体代码:

public class WordCountReduce extends Reducer<Text,IntWritable,Text, IntWritable> {
    /**
     *  流程,输入key和value,map的结果写入到context中
     */
    @Override
    public void reduce(Text key, Iterable<IntWritable> values,Context context)throws IOException,InterruptedException{
        int count = 0;

        for(IntWritable value: values) {
            count++;
        }
        context.write(key,new IntWritable(count));
    }
}

5.提交部分

mapreduce的入口

public static void main(String[] args) throws Exception{
    Configuration conf = new Configuration();
    // 构造一个job对象来封装本mapreduce业务到所有信息
    Job mrJob = Job.getInstance(conf);
    // 指定本job工作用到的jar包位置
    mrJob.setJarByClass(WordCount.class);
    // 指定本job用到的mapper类
    mrJob.setMapperClass(WordCountMap.class);
    // 指定本job用到的reducer类
    mrJob.setReducerClass(WordCountReduce.class);

    // 指定mapper输出的kv类型
    mrJob.setMapOutputKeyClass(Text.class);
    mrJob.setMapOutputValueClass(IntWritable.class);

    // 指定reducer输出到kv数据类型(setOutputKeyClass 会对mapper和reducer都起作用,如果上面mapper不设置的话)
    mrJob.setOutputKeyClass(Text.class);
    mrJob.setOutputValueClass(IntWritable.class);

    FileInputFormat.addInputPath(mrJob,new Path(args[0]));

    //设置mapreduce程序的输出路径,MapReduce的结果都是输入到文件中
    FileOutputFormat.setOutputPath(mrJob,new Path(args[1]));

    // 最后提交任务
    boolean waitForCompletion = mrJob.waitForCompletion(true);
    System.exit(waitForCompletion ? 0 : 1);
}

6.打包提交

将程序打成jar包,提交到hadoop集群中,然后使用命令行进行任务提交

对于输入输出路径,均可接受本地路径和hdfs路径。

本地路径前缀:file://

hdfs路径前缀:hdfs://

/hadoop-3.1.2/bin/hadoop jar my_mapreduce-1.0-SNAPSHOT.jar com.breakthrough.wordcount.WordCount file:///home/hadoop/english.txt file:///home/hadoop/output

原文地址:https://www.cnblogs.com/valjeanshaw/p/11679956.html

时间: 2024-11-10 08:42:06

Hadoop系列(七)Hadoop三大核心之MapReduce-程序编写的相关文章

基于HBase Hadoop 分布式集群环境下的MapReduce程序开发

HBase分布式集群环境搭建成功后,连续4.5天实验客户端Map/Reduce程序开发,这方面的代码网上多得是,写个测试代码非常容易,可是真正运行起来可说是历经挫折.下面就是我最终调通并让程序在集群上运行起来的一些经验教训. 一.首先说一下我的环境: 1,集群的环境配置请见这篇博文. 2,开发客户机环境:操作系统是CentOS6.5,JDK版本是1.7.0-60,开发工具是Eclipse(原始安装是从google的ADT网站下载的ADT专用开发环境,后来加装了Java企业开发的工具,启动Flas

为Hadoop的MapReduce程序编写makefile

最近需要把基于hadoop的MapReduce程序集成到一个大的用C/C++编写的框架中,需要在make的时候自动将MapReduce应用进行编译和打包.这里以简单的WordCount1为例说明具体的实现细节,注意:hadoop版本为2.4.0. 源代码包含两个文件,一个是WordCount1.java是具体的对单词计数实现的逻辑:第二个是CounterThread.java,其中简单的当前处理的行数做一个统计和打印.代码分别见附1. 编写makefile的关键是将hadoop提供的jar包的路

mapreduce程序编写(WordCount)

折腾了半天.终于编写成功了第一个自己的mapreduce程序,并通过打jar包的方式运行起来了. 运行环境: windows 64bit eclipse 64bit jdk6.0 64bit 一.工程准备 1.新建java project 2.导入jar包 新建一个user library 把hadoop文件夹里的hadoop-core和lib包里的所有包都导入进来,以免出错. 二.编码 1.主要是计算单词的小程序,测试用 package com.hirra; import java.io.IO

安装Hadoop系列 — 导入Hadoop源码项目

将Hadoop源码导入Eclipse有个最大好处就是通过 "ctrl + shift + r" 可以快速打开Hadoop源码文件. 第一步:在Eclipse新建一个Java项目,hadoop-1.0.3 第二步:将Hadoop程序src下core, hdfs, mapred, tools几个目录copy到上述新建项目的src目录 第三步:修改将Java Build Path,删除src,添加src/core, src/hdfs....几个源码目录 第四步:为Java Build Pat

用PHP编写Hadoop的MapReduce程序

用PHP写hadoop的mapreduce程序 Hadoop本身是Java写的,所以,给hadoop写mapreduce,人们会自然地想到java 但hadoop里面有个contrib叫做hadoop streaming,这是一个小工具,为hadoop提供streaming支持,使得任何支持标准IO (stdin, stdout)的可执行程序都能成为hadoop的mapper 或者 reducer 例如:hadoop jar hadoop-streaming.jar -input SOME_IN

大数据时代之hadoop(一):hadoop安装

1.hadoop版本介绍 0.20.2版本以前(不含该版本)的配置文件都在default.xml中. 0.20.x以后的版本不含有eclipse插件的jar包,由于eclipse的版本不一,所以就需要自己编译源码生成对应的插件. 0.20.2——0.22.x版本的配置文件集中在conf/core-site.xml. conf/hdfs-site.xml  和 conf/mapred-site.xml. 中. 0.23.x 版本有添加了yarn技术,配置文件集中在  conf/core-site.

Hadoop系列(二)Hadoop三大核心之HDFS基础

目录 hdfs基础 重要概念 Hadoop 特点 Hadoop HA 针对海量数据,核心问题始终是计算和存储.当数据集的大小超过一台独立物理计算机的存储能力时,就有必要对它进行分区并存储到多台机器上.跨机器存储的文件系统就被成为分布式文件系统.分布式系统架构于网络之上,势必引入网络编程的复杂性,如何实现容忍节点故障但不丢失数据,是HDFS的重要挑战. hdfs基础 Hadoop 自带HDFS分布式文件系统:Hadoop Distributed Filesystem.也简称DFS.主要用来解决海量

Hadoop系列(八)Hadoop三大核心之Yarn-资源调度初探

目录 0. Yarn的来源 1. YARN概述 2. YARN的重要组成部分 2.1 ResourceManager 2.2 NodeManager 2.3 逻辑上的组件Application Master 3. Container 资源池 4. 小结 0. Yarn的来源 ? hadoop 1.x的时代,并没有Yarn,hadoop核心组件只有HDFS和MapReduce.到了hadoop2.x才有了Yarn的诞生,组件包含HDFS,MapReduce和Yarn. ? 诞生原因:hadoop

hadoop系列三:mapreduce的使用(一)

转载请在页首明显处注明作者与出处 http://www.cnblogs.com/zhuxiaojie/p/7224772.html 一:说明 此为大数据系列的一些博文,有空的话会陆续更新,包含大数据的一些内容,如hadoop,spark,storm,机器学习等. 当前使用的hadoop版本为2.6.4 上一篇:hadoop系列二:HDFS文件系统的命令及JAVA客户端API 在下面可以看到统计一本小说(斗破苍穹)哪些词语出现了最多. 本来mapreducer只想写一篇的,可是发现写一篇太长了,所