maxcompute(原odps)有一套自己的mapreduce编程模型和接口,简单说来,这套接口的输入输出都是maxcompute中的table,处理的数据是以record为组织形式的,它可以很好地描述table中的数据处理过程,然而与社区的hadoop相比,编程接口差异较大。hadoop用户如果要将原来的hadoop mr作业迁移到maxcompute的mr执行,需要重写mr的代码,使用maxcompute的接口进行编译和调试,运行正常后再打成一个jar包才能放到maxcompute的平台来运行。这个过程十分繁琐,需要耗费很多的开发和测试人力。如果能够完全不改或者少量地修改原来的hadoop mr代码就能在maxcompute平台上跑起来,将是一个比较理想的方式。
使用该插件在maxcompute平台跑一个hadoopmr作业的基本步骤如下:
编译导出wordcount的jar包:wordcount_test.jar ,wordcount程序的源码如下:
创建输入表和输出表
通过tunnel将数据导入输入表中
待导入文本文件data.txt的数据内容如下:
例如可以通过如下命令将data.txt的数据导入wc_in中,
配置文件命名为:wordcount-table-res.conf
配置项说明:
整个配置是一个json文件,描述hdfs上文件与maxcompute上表之间的映射关系,一般要配置输入和输出两部分,一个hdfs路径对应一个resolver配置,tableinfos配置以及matchmode配置。
resolver: 用于配置如何对待文件中的数据,目前有com.aliyun.odps.mapred.hadoop2openmr.resolver.textfileresolver和com.aliyun.odps.mapred.hadoop2openmr.resolver.binaryfileresolver两个内置的resolver可以选用。除了指定好resolver的名字,还需要为相应的resolver配置一些properties指导它正确的进行数据解析。
textfileresolver: 对于纯文本的数据,输入输出都会当成纯文本对待。当作为输入resolver配置时,需要配置的properties有text.resolver.columns.combine.enable和text.resolver.seperator,当text.resolver.columns.combine.enable配置为true时,会把输入表的所有列按找text.resolver.seperator指定的分隔符组合成一个字符串作为输入。否则,会把输入表的前两列分别作为key,value。
binaryfileresolver: 可以处理二进制的数据,自动将数据转换为maxcompute可以支持的数据类型,如bigint, bool, double等。当作为输出resolver配置时,需要配置的properties有binary.resolver.input.key.class和binary.resolver.input.value.class,分别代表中间结果的key和value类型。
tableinfos:用户配置hdfs对应的maxcompute的表,目前只支持配置表的名字tblname,而partspec和label请保持和示例一致。
matchmode:路径的匹配模式,可选项为exact和fuzzy,分别代表精确匹配和模糊匹配,如果设置为fuzzy,则可以通过正则来匹配hdfs的输入路径
在maxcompute的命令行下运行如下命令:
这里假设我们已经将hadoop2openmr-1.0.jar和wordcount_test.jar以及wordcount-table-res.conf已经放置到odpscmd的当前目录,否则在指定配置和-classpath的路径时需要做相应的修改。
运行过程如下图所示:

当作业运行完成后,可以查看结果表wc_out里面的内容,验证作业成功结束,结果符合预期。