MapReduce Java API

MapReduce是Hadoop的一个核心组成框架

一个MapReduce任务主要包括两部分:Map任务和Reduce任务。

Map任务负责对数据的获取、分割与处理,其核心执行方法为map()方法;

Reduce任务负责对Map任务的结果进行汇总,其核心执行方法为reduce()方法。

MapReduce将并行计算过程高度抽象到了map()方法和reduce()方法中,程序员只需负责这两个方法的编写工作,而并行程序中的其他复杂问题(如分布式存储、工作调度、负载均衡、容错处理等)均可由MapReduce框架代为处理

 

MapReduce程序编写步骤

Hadoop支持多种语言开发MapReduce程序,但是对Java语言的支持最好,其提供了很多方便的Java API接口。

那么如何使用Java来编写一个MapReduce程序呢?编写一个MapReduce程序需要新建三个类:Mapper类、Reducer类、程序执行主类。当然,Mapper类和Reducer类也可以作为内部类放在程序执行主类中。

 

1. 新建Mapper类

新建一个自定义Mapper类MyMapper.java,该类需要继承MapReduce API提供的Mapper类并重写Mapper类中的map()方法,例如以下代码:

public class MyMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
    //重新map()函数
    public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        //业务逻辑
    }
}

2. 新建Reducer类

新建一个自定义Reducer类MyReducer.java,该类需要继承MapReduce API提供的Reducer类并重写Reducer类中的reduce()方法,例如以下代码:

public class MyReducer extends Reducer<MyKeyPair, IntWritable, Text, IntWritable> {
    /**
     * 重写reduce()方法
     */
    public void reduce(MyKeyPair key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        //定义Text类型的输出key
        Text outKey = new Text();
        //迭代输出<key,value>对
        for (IntWritable value : values) {
            outKey.set(key.getFirst());
            context.write(outKey, value);
        }
    }
}

3. 新建程序执行主类

程序执行主类为MapReduce程序的入口类,主要用于启动一个MapReduce作业。

新建一个程序执行主类MyMRApplication.java,在该类的main()方法中添加任务的配置信息,并指定任务的自定义Mapper类和Reducer类,代码结构如下:

public class MyMRApplication {
    public static void main(String[] args) throws Exception {
        //构建Configuration实例
        Configuration conf = new Configuration();
        //其它配置信息代码...
        //获得Job实例0
        Job job = Job.getInstance(conf, "My job name");
        //其它job配置代码...
        //设置MapperReduce处理类
        job.setMapperClass(MyMapper.class);
        //  job.setCombinerClass(MyReducer.class);

        //设置输入和输出目录...
        //提交任务
    }
}

4. 提交程序到集群

提交程序之前需要启动Hadoop集群,包括HDFS和YARN。因为HDFS存储了MapReduce程序的数据来源,而YARN则负责MapReduce任务的执行、调度以及集群的资源管理。

将包含自定义的Mapper类、Reducer类和程序执行主类的Java项目打包为jar包并上传到HDFS的NameNode节点,然后执行以下命令提交任务到Hadoop集群。

hadoop jar MyMRApplication.jar com.hadoop.mr.MyMRApplication

上述命令中的MyMRApplication.jar为程序打包后的jar文件,com.hadoop.mr为程序执行主类MyMRApplication.java所在的包名称。

 

书籍:Hadoop大数据技术开发实战 第5章 MapReduce

https://gitee.com/caoyeoo0/xc-springboot/blob/hadoopApi/src/main/java/com/xc/xcspringboot/test/WordCount.java

https://gitee.com/caoyeoo0/xc-springboot/blob/hadoopApi/src/main/java/com/xc/xcspringboot/test/Dedup.java

https://gitee.com/caoyeoo0/xc-springboot/blob/hadoopApi/src/main/java/com/xc/xcspringboot/test/Score.java

 

posted @ 2022-11-09 16:11  草木物语  阅读(218)  评论(0编辑  收藏  举报