文档章节

hadoop 平台运行mapreduce代码

leiline
 leiline
发布于 2018/01/14 19:36
字数 1023
阅读 15
收藏 0

WordCount是写hadoop mapreduce入门级程序,会写wordcount的话,基本上80%的mapreduce就懂了。

mapreduce分为map过程和reduce过程,用户可以根据自己的业务自定义map过程和reduce过程。

以wordcount为例,要计算文本中单词出现的个数,需要读取文本,并针对单词进行统计。

map过程

package com.hadoop.mapreduce;

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

import java.io.IOException;

/**
 *
 * Created by Frankie on 2018/1/14.
 * KEYIN: 默认情况下,是mr框架所读到的一行文本的起始偏移量, Long    在hadoop中有自己的精简序列化接口,所以不直接使用long, 而用LongWritable
 * VALUEIN: 默认情况下,是mr框架所读到的一行文本的内容, String
 * KEYOUT: 是用户自定义逻辑处理完成后输出数据中的key, 在此处是单词,String
 * VALUEOUT: 是用户自定义逻辑处理完成后输出数据中的vlaue, 在次数是单词次数,Integer
 *
 *
 **/

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

    /*
    * map 阶段的业务逻辑就写在自定义的Map()方法中
    * map task会对每一行输入数据调用一次我们自定义map()方法
    * */
    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException{
        String line = value.toString();
        String[] words = line.split(" ");
        for(String word: words){
            // 将单词作为key, 将次数1作为value,以便于后续的数据分发,可以根据单词分发,以便于相同单词会用到相同的reduce task
            // map task会收集,写在一个文件上
            context.write(new Text(word), new IntWritable(1));
        }
    }

}

reduce过程

package com.hadoop.mapreduce;

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

import java.io.IOException;
import java.util.Iterator;

/**
 * Created by Frankie on 2018/1/14.
 *
 * KEYIN, VALUEIN 对应 mapper输出的KEYOUT, VALUEOUT类型对应
 * KEYOUT, VALUEOUT是自定义reduce逻辑处理结果的输出数据类型
 * KEYOUT是单词,
 * VALUE是总次数
 */
public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {

    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException{
        /*
        入参key, 是一组相同单词kv对的key
            Context 上下文
        * */
        int count = 0;

//        Iterator<IntWritable> iterator = values.iterator();
//        while(iterator.hasNext()){
//            count += iterator.next().get();
//        }
//

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

    }
}

mapreduce过程存在一些问题,比如,

Map task如何进行任务分配?

Reduce task如何进行任务分配?

Map task与 reduce task如何进行衔接?

如果某map task 运行失败,如何处理?

Map task如果都要自己负责数据的分区,很麻烦

为例解决这些问题,需要有个master专门对map reduce进行管理。

在WordCount文件中,有专门对作业进行配置,以及最后将代码提交到客户端。

package com.hadoop.mapreduce;

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;

/**
 * Created by Frankie on 2018/1/14.
 *
 * 相当于yarn集群的客户端
 * 需要在此封装mr程序的相关运行参数,指定jar包,最后提交给yarn
 */

public class WordCount {

    public static void main(String[] args) throws Exception{
        Configuration conf = new Configuration();
        Job job = Job.getInstance(conf, "wordcount");

        // 指定本程序的jar包所在的本地路径
        job.setJarByClass(WordCount.class);

        // 指定本业务使用的map业务类
        job.setMapperClass(WordCountMapper.class);
        job.setReducerClass(WordCountReducer.class);

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

        //指定最终输出的数据的kv类型
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);

        //指定job的输入原始文件所在目录
        // /data/adult.data
        FileInputFormat.setInputPaths(job, new Path(args[1]));

        // 指定job的输出结果所在目录
        FileOutputFormat.setOutputPath(job, new Path(args[2]));

//        // 将job中配置的相关参数,以及job所用的java类所在的Jar包,提交给yarn去运行
//        job.submit();

        // 提交job配置,一直等待到运行结束
        boolean res = job.waitForCompletion(true);
        System.exit(res? 0: 1);
    }
}

代码编辑完成后,对代码进行打包。我们在这里选择不依赖第三方包的打包方式进行打包。

打完包后,将生成的jar包提交到服务器中去。 并执行,

leiline@master:~/Documents/hadoop/myJars$ hadoop jar HadoopMapReduce.jar com.hadoop.mapreduce.WordCount /data/adult /data/out

注意,out文件是由程序自动创建的,不需要用户手动去创建。最后,代码执行完毕后,可以在hdfs中看到执行的结果:

Found 2 items
-rw-r--r--   3 leiline supergroup          0 2018-01-14 19:01 /data/out/_SUCCESS
-rw-r--r--   3 leiline supergroup     216737 2018-01-14 19:01 /data/out/part-r-00000

© 著作权归作者所有

leiline
粉丝 5
博文 49
码字总数 11653
作品 0
烟台
私信 提问
MapReduce和Spark的区别

性能: Spark是在内存中处理数据的,而MapReduce是通过map和reduce操作在磁盘中处理数据,所以正常情况下Spark的处理速度会比mapreduce快。但是当数据量大,不能一次性加载到内存的时候,Spa...

无精疯
04/15
98
0
如何分布式运行mapreduce程序

如何分布式运行mapreduce程序 一、 首先要知道此前提 若在windows的Eclipse工程中直接启动mapreduc程序,需要先把hadoop集群的配置目录下的xml都拷贝到src目录下,让程序自动读取集群的地址后...

Zero零_度
2015/09/06
245
0
Hadoop学习笔记(1):概念和整体架构

hadoop简介和历史   Hadoop架构体系   Master和Slave节点   数据分析面临的问题和Hadoop思想   由于工作原因,必须学习和深入一下Hadoop,特此记录笔记。   什么是hadoop?   Apa...

ugali
2018/06/26
0
0
【Hadoop] - windows开发环境搭建

文章说明:因Linux平台再GUI页面通过IDE进行Hadoop开发,会导致Linux在GUI上极度消耗资源,对于一些配置不是很高的PC,可能会出现卡顿的情况,非常影响程序编写,本文就详细介绍如何在windo...

ZeroneLove
02/24
23
0
Hadoop的mapreduce的简单用法

 Mapreduce初析   Mapreduce是一个计算框架,既然是做计算的框架,那么表现形式就是有个输入(input),mapreduce操作这个输入(input),通过本身定义好的计算模型,得到一个输出(outpu...

魔法王者安琪拉
2018/08/23
29
0

没有更多内容

加载失败,请刷新页面

加载更多

小知识:讲述Linux命令别名与资源文件的区别

别名 别名是命令的快捷方式。为那些需要经常执行,但需要很长时间输入的长命令创建快捷方式很有用。语法是: alias ppp='ping www.baidu.com' 它们并不总是用来缩短长命令。重要的是,你将它...

老孟的Linux私房菜
36分钟前
2
0
《JAVA核心知识》学习笔记(6. Spring 原理)-5

它是一个全面的、企业应用开发一站式的解决方案,贯穿表现层、业务层、持久层。但是 Spring 仍然可以和其他的框架无缝整合。 6.1.1. Spring 特点 6.1.1.1. 轻量级 6.1.1.2. 控制反转 6.1.1....

Shingfi
38分钟前
4
0
Excel导入数据库数据+Excel导入网页数据【实时追踪】

1.Excel导入数据库数据:数据选项卡------>导入数据 2.Excel导入网页数据【实时追踪】:

东方墨天
46分钟前
4
1
正则表达式如何匹配一个单词存在一次或零次并且不占捕获组位置

正则表达式如何匹配一个单词存在一次或零次并且不占捕获组位置 今天要用正则表达式实现匹配一个词出现一次或者不出现的情况,但是又不仅仅是这么简单的需求。先详细说下我这种情况吧,也许有...

Airship
52分钟前
6
0
第八讲:asp.net C# web 读取文件

本讲主要讲解如何在asp.net页面上传文件。 首先,前台页面: 其次,后台页面: 结果: 1、前台效果: 2、后台结果:

刘日辉
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部