开发MapReduce

更新时间:
复制 MD 格式

本文为您介绍如何在MaxCompute Studio上开发MapReduce,包括编写MapReduce、调试MapReduce、打包、上传和运行MapReduce。

前提条件

您需要完成以下操作:

编写MapReduce

  1. Project区域,右键单击Module的源码目录(即src > main > java),选择new > MaxCompute Java

  2. 填写Name并选择类型为Driver,按下Enter键。

    • Name:创建的MaxCompute Java Class名称。如果还没有创建Package,在此处填写packagename.classname,会自动生成Package。

    • 选择类型为DriverMapperReducer

      说明

      您可以根据需要选择Driver、MapperReducer类型:

      • Driver: MapReduce作业中的驱动程序类。负责构建一个MapReduce Job来运行,可以在Driver中指定运行的MapperReducer类以及进行任务的各种信息配置,其可以看做Mapreduce作业的入口类。

      • Mapper: MapReduce数据处理的第一个阶段,在这里处理每条记录并生成相应的键值对。

      • Reducer: Mapper生成的中间输出到Reducer,Reducer对其进行处理并生成最终输出,然后将其保存在MaxCompute表中。

  3. 创建成功后,在编辑界面开发Java程序。

    Java模板已自动填充框架代码,您只需设置输入表、输出表、MapperReducer类等信息。

    MapReduce Java程序示例,请参见WordCount示例

    
    package mymr.myudf;
    
    import ...
    
    public class HelloDriver {
    
        public static void main(String[] args) throws OdpsException {
    
            JobConf job = new JobConf();
    
            // TODO: specify map output types
            job.setMapOutputKeySchema(SchemaUtils.fromString(?));
            job.setMapOutputValueSchema(SchemaUtils.fromString(?));
    
            // TODO: specify input and output tables
            InputUtils.addTable(TableInfo.builder().tableName(?).build(), job);
            OutputUtils.addTable(TableInfo.builder().tableName(?).build(), job);
    
            // TODO: specify a mapper
            job.setMapperClass(?);
            // TODO: specify a reducer
            job.setReducerClass(?);
    
            RunningJob rj = JobClient.runJob(job);
            rj.waitForCompletion();
    
        }
    }
    

通过本地运行调试MapReduce

通过本地运行方式测试,查看MapReduce的运行结果是否符合预期。

  1. 右键单击编写完成的Java脚本,选择Run

  2. Run/Debug Configurations页面上选择此次运行的MaxCompute项目名称。

    Run/Debug Configurations 对话框中,选中左侧 JUnit 下的 WordCountTest,右侧配置面板中 Test kind 选择 Class,Class 填写 com.aliyun.odps.examples.mr.test.WordCountTest,Use classpath of module 选择 MyFristModule

  3. 单击OK,开始运行。

    说明
    • 本地运行会读取warehouse中指定的表数据作为输入,您可以在控制台查看日志输出。

    • 更多warehouse的说明,请参见warehouse目录

通过单元测试调试MapReduce

您可以参照examples目录下的WordCount单元测试示例,编写测试用例。


package com.aliyun.odps.examples.mr.test;

import ...

public class WordCountTest extends M...

    // 定义输入输出表的 schema
    private final static String INPUT_...
    private final static String OUTPUT_...
    private JobConf job;

    public WordCountTest() throws Excep...
        TestUtil.initWarehouse();

        // 准备作业配置
        job = new JobConf();

        job.setMapperClass(WordCount_Token...
        job.setCombinerClass(WordCount_Sum...
        job.setReducerClass(WordCount_SumR...

        job.setMapOutputKeySchema(SchemaUti...
        job.setMapOutputValueSchema(SchemaU...

        InputUtils.addTable(TableInfo.build...
        OutputUtils.addTable(TableInfo.buil...
    }

    @SuppressWarnings("deprecation")
    @Test
    public void testMap() throws IOExce...
        MapUTContext mapContext = new MapUT...
        mapContext.setInputSchema(INPUT_SC...
        mapContext.setOutputSchema(OUTPUT_...

        // 准备测试数据
        Record record = mapContext.createIn...
        record.set(new Text[] {new Text(...

打包上传

调试成功之后,将Java程序打成JAR包,并作为资源上传至MaxCompute服务端。详情请参见打包、上传和注册

运行MapReduce

通过MaxCompute客户端运行MapReduce。

  1. 在左侧导航栏,单击Project Explorer

  2. 右键单击项目名称,选择Open in Console

  3. Console区域,执行如下命令运行MapReduce。

    更多命令请参见JAR命令

    jar -resources wordcount.jar -classpath D:\odps\clt\wordcount.jar com.aliyun.odps.examples.mr.WordCount wc_in wc_out;