本文为您介绍如何在MaxCompute Studio上开发MapReduce,包括编写MapReduce、调试MapReduce、打包、上传和运行MapReduce。
前提条件
您需要完成以下操作:
-
已连接MaxCompute项目。
更多连接MaxCompute项目操作,请参见管理项目连接。
-
已创建Java Module。
更多创建Java Module操作,请参见创建MaxCompute Java Module。
编写MapReduce
在Project区域,右键单击Module的源码目录(即),选择。
-
填写Name并选择类型为Driver,按下Enter键。
-
Name:创建的MaxCompute Java Class名称。如果还没有创建Package,在此处填写packagename.classname,会自动生成Package。
-
选择类型为Driver、Mapper或Reducer。
说明您可以根据需要选择Driver、Mapper或Reducer类型:
-
Driver: MapReduce作业中的驱动程序类。负责构建一个MapReduce Job来运行,可以在Driver中指定运行的Mapper和Reducer类以及进行任务的各种信息配置,其可以看做Mapreduce作业的入口类。
-
Mapper: MapReduce数据处理的第一个阶段,在这里处理每条记录并生成相应的键值对。
-
Reducer: Mapper生成的中间输出到Reducer,Reducer对其进行处理并生成最终输出,然后将其保存在MaxCompute表中。
-
-
-
创建成功后,在编辑界面开发Java程序。
Java模板已自动填充框架代码,您只需设置输入表、输出表、Mapper和Reducer类等信息。
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的运行结果是否符合预期。
-
右键单击编写完成的Java脚本,选择Run。
-
在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。 单击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。
-
在左侧导航栏,单击Project Explorer。
-
右键单击项目名称,选择Open in Console。
-
在Console区域,执行如下命令运行MapReduce。
更多命令请参见JAR命令。
jar -resources wordcount.jar -classpath D:\odps\clt\wordcount.jar com.aliyun.odps.examples.mr.WordCount wc_in wc_out;