MaxCompute MapReduce

摘要: 用户在DataWorks上执行MapReduce作业的时候,文件大于10M的JAR和资源文件不能上传到Dataworks,导致无法使用调度去定期执行MapReduce作业。 解决方案: jar -resources test_mr.

后续为了更加清楚地说明问题,我会尽可能地在客户端上操作,而不用IDEA里已经集成的方法。

通过上述方法,我们可以在Dataworks上跑大于10M的MR作业。

不允许读本地文件(比如JSON里就用到了,就需要改用GSON)

客户端配置AK、EndPoint:https://help.aliyun.com/document_detail/27804.html

拓展MapReduce

客户端下载地址:https://help.aliyun.com/document_detail/27971.html

功能解读

解决方案:

Reduce阶段

作者:隐林

客户端先解析-classpath参数,找到main方法相关的jar包的位置

第三步:瘦身Jar,因为Dataworks执行MR作业的时候,一定要本地执行,所以保留个main就可以;

Shuffle阶段-分配Reducer:把Mapper输出的单词分发给Reducer。Reducer拿到数据后,再做一次排序。因为Reducer拿到的数据已经在Mapper里已经是排序过的了,所以这里的排序只是针对排序过的数据做合并排序。

原标题:通过简单瘦身,解决Dataworks 10M文件限制问题

根据com.aliyun.odps.mapred.open.example.WordCount,找到main方法所在类的路径和名字

责任编辑:

摘要:大数据计算服务(MaxCompute)的功能详解和使用心得

第一步:大于10M的resources通过MaxCompute CLI客户端上传,

在odpscmd里执行add jar命令:

用户在DataWorks上执行MapReduce作业的时候,文件大于10M的JAR和资源文件不能上传到Dataworks,导致无法使用调度去定期执行MapReduce作业。

生产及周期调度

add jar C:test_mrtest_mr.jar -f;//添加资源

金沙澳门官网网址 1

第二步:目前通过MaxCompute CLI上传的资源,在Dataworks左侧资源列表是找不到的,只能通过list resources查看确认资源;

Shuffle-合并排序

金沙澳门官网网址 2

运行环境

​本文为云栖社区原创内容,未经允许不得转载。返回搜狐,查看更多

reduce(){

list resources;//查看资源

在odpscmd里执行

Q:如何实现M->R->M->R这种逻辑呢

OutputUtils.addTable(TableInfo table, JobConf conf)设置了输出的表。多路输入输出可以参考金沙澳门官网网址,这里

setNumReduceTasks(int n)设置 Reducer 任务数,默认为 Mapper 任务数的 1/4。如果是Map only的任务,需要设置成0。可以参考这里

大数据开发套件可以配置MapReduce作业。

工欲善其事,必先利其器。MR的开发提供了基于IDEA和Eclipse的插件。其中比较推荐用IDEA的插件,因为IDEA我们还在持续做迭代,而Eclipse已经停止做更新了。而且IDEA的功能也比较丰富。

另外后续还需要用到客户端,可以参考文档安装。

步骤为

比如有一张很大的表。表里有个String字段记录的是用空格分割开单词。最后需要统计所有记录中,每个单词出现的次数是多少。那整体的计算流程是

setMemoryForJVM(int mem)设置 JVM虚拟机的内存资源,单位:MB,默认值 1024.

JobConf定义了这个任务的细节,还是这个图,解释一下JobConf的其他设置项的用法。

安全沙箱

对比前面的快速开始,可以看到除去数据准备阶段,和MR相关的,有资源的上传(add jar步骤)和jar命令启动MR作业两步。

Map/Reduce

com.aliyun.odps.mapred.open.example.WordCount wc_in wc_out`

输出阶段:输出Reduce的计算结果,写入到表里或者返回给客户端。

setOutputGroupingColumns(String[] cols)数据在Reducer里排序好了后,是哪些数据进入到同一个reduce方法的,就是看这里的设置。一般来说,设置的和setPartitionColumns(String[] cols)一样。可以看到二次排序的用法。

无法起多线程/多进程

客户端发起add jar/add file等资源操作,把在客户端的机器(比如我测试的时候是从我的笔记本)上,运行任务涉及的资源文件传到服务器上。这样后面运行任务的时候,服务器上才能有对应的代码和文件可以用。如果以前已经传过了,这一步可以省略。

void setResources(String resourceNames)有和jar命令的-resources一样的功能,但是优先级高于-resources(也就是说代码里的设置优先级比较高)

setPartitionColumns(String[] cols)设置作业的分区列,定义了数据分配到Reducer的分配策略。

setCombinerOptimizeEnable(boolean isCombineOpt)设置是否对Combiner进行优化。

setOutputKeySortColumns(String[] cols)设置 Mapper 输出到 Reducer 的 Key 排序列。

setCombinerClass(Class theClass)设置作业的 combiner。

setMapOutputValueSchema(Column[] schema)设置 Mapper 输出到 Reducer 的 Value 行属性。和上个设置一起定义了Mapper到Reducer的数据格式。

输入数据

大数据开发套件可以配置Shell作业。可以在Shell作业里参考上面的方法用odpscmd -e/-f来调度MapReduce作业。

setMapperClass(Class theClass)设置Mapper使用的Java类。

Shuffle阶段-合并排序:也是发生在Mapper上。会先对数据进行排序。比如WordCount的例子,会根据单词进行排序。排序后的合并,又称Combiner阶段,因为前面已经根据单词排序过了,相同的单词都是连在一起的。那可以把2个相邻的合并成1个。Combiner可以减少在后续Reduce端的计算量,也可以减少Mapper往Reducer的数据传输的工作量。

等待作业执行成功后,可以在SQL通过查询wc_out表的数据,看到执行的结果

无法访问外部数据源(不能当爬虫,不能读RDS等)

-f和-e一样,只是把命令写到文件里,然后用odpscmd -f xxx.sql引用这个文件,那这个文件里的多个指令都会被执行。

说起MapReduce就少不了WordCount,我特别喜欢文档里的这个图片。

wc_in wc_out是传给main方法的参数,通过解析main方法传入参数String[] args获得这个参数

InputUtils.addTable(TableInfo table, JobConf conf)设置了输入的表。

Shuffle-分配Reduce

将代码拷贝到IDE里,编译打包成mapreduce-examples.jar

Reduce阶段:Reducer拿前面已经排序好的输入,相同的单词的所有输入进入同一个Redue循环,在循环里,做个数的累加。

setOutputKeySortOrder(JobConf.SortOrder[] order)设置 Key 排序列的顺序。

本文由金沙澳门官网网址发布于公司首页,转载请注明出处:MaxCompute MapReduce

相关阅读