MaxCompute(原ODPS) MapReduce常见难点解答,odpsmax

作者:澳门微尼斯人娱乐

原标题:通过简单瘦身,化解Dataworks 10M文书限制难题

摘要:大数量计算服务(马克斯Compute)的意义详解和行使体验

马克斯Compute(原ODPS) MapReduce常见难题解答,odpsmaxcompute分区

马克斯Compute Studio升高UDF和MapReduce开发体验,maxcomputemapreduce

UDF全称User Defined Function,即用户自定义函数。马克斯Compute提供了成都百货上千内建函数来满意用户的一个钱打二17个结须要,同时用户还足以创建自定义函数来满足定制的总计供给。用户能扩充的UDF有三种:UDF(User Defined Scalar Function),UDTF(User Defined Table Valued Function)和UDAF(User Defined Aggregation Function)。

并且,马克斯Compute也提供了MapReduce编制程序接口,用户能够应用MapReduce提供的接口(Java API)编写MapReduce程序处理马克斯Compute中的数据。

透过马克斯Compute Studio提供的端到端的帮忙,用户能高效起初和熟习开发协调的UDF和MapReduce,进步效能。上面我们就以二个事例来介绍怎么样利用Studio来支付协调的UDF:

摘要: 用户在DataWorks上执行MapReduce作业的时候,文件大于十M的JALAND和财富文件不能够上传到Dataworks,导致不可能使用调度去定期执行MapReduce作业。 消除方案: jar -resources test_mr.

点此查看原来的书文:http://click.aliyun.com/m/41384/

正文用到的

Ali云数加-大数据测算服务MaxCompute产品地址:


创建MaxCompute Java Module

先是,你得在intellij中开创三个用来支付马克斯Compute Java程序的module。具体的,File | new | module ... module类型为马克斯Compute Java,配置Java JDK和马克斯Compute console的安装路径,点击next,输入module名,点击finish。

那里配置console的目标根本有七个:

  • 编排UDF和MR必要依赖马克斯Compute框架的相关jar,而那些jar在console的lib目录均存在,studio能帮您将那几个lib自动导入到module的正视库中。

  • studio能集成console,壹些动作通过console操作将卓越有利于。

澳门微尼斯人娱乐 1

由来,1个能支付马克斯Compute java程序的module已成立,如下图的jDev。首要目录包罗:

  • src(用户支出UDF|M卡宴程序的源码目录)
  • examples(示例代码目录,包涵单测示例,用户可参考那里的事例开发协调的次序或编辑单测)
  • warehouse(本地运营要求的schema和data)

澳门微尼斯人娱乐 2

用户在DataWorks上进行MapReduce作业的时候,文件大于10M的JACR-V和能源文件不能够上传到Dataworks,导致不恐怕运用调度去定期执行MapReduce作业。

前言

一. 作业应运而生ClassNotFoundException和NoClassDefFoundError格外战败?

A: 对于ClassNotFoundException至极,一般是借助的class不在你的jar包中,需求把正视的库打到作业jar包中大概独立上传,并在-resources中内定;
对此NoClassDefFoundError万分,先看看注重class是或不是存在于你的jar包,很多景色下是出于版本冲突导致的,恐怕你依靠的库和服务端自带的jar有争辩。


创建UDF

借使大家要贯彻的UDF需要是将字符串转换为题写(内建函数TOLOWE讴歌MDX已落到实处该逻辑,那里我们只是通过这些大约的急需来演示怎么着通过studio开发UDF)。studio提供了UDF|UDAF|UDTF|Mapper|Reducer|Driver的模版,那样用户只要求编写制定自己的事体代码,而框架代码会由模板自动填写。

    1. 在src目录右键 new | 马克斯Compute Java

澳门微尼斯人娱乐 3

    1. 输入类名,如myudf.MyLower,选拔种类,那里大家挑选UDF,点击OK。

澳门微尼斯人娱乐 4

  • 3. 模板已自行填充框架代码,咱们只供给编写制定将字符串转换到小写的函数代码即可。

澳门微尼斯人娱乐 5

缓解方案:

MapReduce已经有文档,用户能够参照文书档案使用。本文是在文书档案的根基上做壹些近乎注明及细节解释上的工作。

2. M奇骏提交命令中-resources和-classpath的知道?

A: 在马克斯Compute中接近M福特Explorer那类分布式数据处理框架,用户的代码1般在偏下多少个地点实施:

  • 运转客户端的经过/子进度:这里的用户代码负责准备执行环境、配置职务参数、提交职责,入口日常是main class。它不受沙箱限制,执行逻辑由用户代码驱动。同样的,那里的classpath由用户配置,或在console中央银行使-classpath选项添加重视的classpath路径。
  • 长距离执行的worker进程:那里的代码负责履行多少处理逻辑,入口是mapper/reducer class。它受限沙箱限制,且执行逻辑由马克斯Compute框架驱动。用户在命令行配置的-classpath在那边不算(明显,远程机器的不2诀窍和客户端机器的途径不能够确定保障同一),任何第2方注重必须作为resource提前上传至MaxCompute,并在交付职分时使用-resources选项或JobConf.setResources(String[])来设定。

测试UDF

UDF或M福睿斯开发好后,下一步正是要测试自身的代码,看是还是不是切合预期。studio提供三种测试办法:

先是步:大于十M的resources通过马克斯Compute CLI客户端上传,

功用介绍

3. Mapper数目怎么着设置?

A:倘诺没有输入表是能够直接钦赐map数目setNumMapTasks
    有输入表的话,setNumMapTasks不奏效,要求通过setSplitSize来控制map数,默认是256M。


单元测试

依傍于马克斯Compute提供的Local Run框架,您只须要像写普通的单测那样提供输入数据,断言输出就能便宜的测试你协调的UDF或MEscort。在examples目录下会有各体系型的单测实例,可参考例子编写本人的unit test。那里大家新建1个MyLowerTest的测试类,用于测试大家的MyLower:

澳门微尼斯人娱乐 6

客户端下载地址:

MapReduce

四. Reducer数目如何设置?

A: 通过JobConf的接口setNumReduceTasks能够设置。
对此pipeline作业,Jobconf的接口同样能够安装,只不过设置后有着reduce阶段的个数都是均等的值。
假设要分等级设置,设置方式如下:
Pipeline pipeline = Pipeline.builder()
.addMapper(TokenizerMapper.class)
...
.addReducer(SumReducer.class).setNumTasks(5)
...
.addReducer(IdentityReducer.class).setNumTasks(1).createPipeline();


sample数据测试

多多用户的须要是能sample部分线上表的多寡到本机来测试,而那studio也提供了支撑。在editor中UDF类MyLower.java上右键,点击"运营"菜单,弹出run configuration对话框,配置马克斯Compute project,table和column,这里大家想将hy_test表的name字段转换为小写:

澳门微尼斯人娱乐 7

点击OK后,studio会先通过tunnel自动下载表的sample数据到本地warehouse(如图中高亮的data文件),接着读取钦定列的数额并当地运维UDF,用户能够在控制台看到日志输出和结果打字与印刷:

澳门微尼斯人娱乐 8

客户端配置AK、EndPoint:

澳门微尼斯人娱乐 9

五. 报错java.lang.OutOfMemoryError: Java heap space,MBMWX三的内部存款和储蓄器设置难点?

A:mapper或reducer的内部存储器由两有的构成,JVM的heap memory和JVM 之外的框架相关内部存款和储蓄器。
    设置JVM内部存款和储蓄器的接口是(都以Java逻辑的话,调节内部存款和储蓄器是用下边五个接口):
    setMemoryForMapperJVMsetMemoryForReducerJVM (默认是1024 单位MB)
    设置框架内存(c 部分的)的接口是(1般不必要设置):
    setMemoryForMapTasksetMemoryForReduceTask(默认是2048 单位MB)


发布UDF

好了,大家的MyLower.java测试通过了,接下去大家要将其卷入成jar财富(这一步可以通过IDE打包,参考用户手册)上传到马克斯Comptute服务端上:

    1. 在马克斯Compute菜单选拔Add Resource菜单项:

澳门微尼斯人娱乐 10

    1. 选用要上传到哪个马克斯Compute project上,jar包路径,要登记的财富名,以及当财富或函数已存在时是或不是强制更新,然后点击OK。

澳门微尼斯人娱乐 11

  • 叁. jar包上传成功后,接下去就足以注册UDF了,在马克斯Compute菜单采取Create Function菜单项。

澳门微尼斯人娱乐 12

  • 四. 选用要求采取的财富jar,选择主类(studio会自动分析能源jar中蕴藏的主类供用户挑选),输入函数名,然后点击OK。

澳门微尼斯人娱乐 13

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

谈到MapReduce就必需WordCount,小编特意喜欢文书档案里的那些图片。

陆. mr 输出到表或某些分区里时,输出的方式时扩大依旧覆盖 ?

A: 会覆盖输出表或分区以前的剧情


生育应用

上传成功的jar能源和注册成功的function(在Project Explorer相应project下的Resources和Functions节点中就能立时看到,双击也能展现反编写翻译的源码)就可见实际生产应用了。我们打开studio的sql editor,就能高安心乐意兴的利用大家刚写好的mylower函数,语法高亮,函数签名展现都不在话下:

澳门微尼斯人娱乐 14

第二步:近年来通过马克斯Compute CLI上传的能源,在Dataworks左边能源列表是找不到的,只可以通过list resources查看确认财富;

譬如有一张不小的表。表里有个String字段记录的是用空格分割开单词。最终索要总计全体记录中,每种单词出现的次数是不怎么。这完全的计算流程是

柒. 二回排序功用,MXC90相关计划解释,setMapOutputKeySchema? setOutputKeySortColumns? setPartitionColumns? setOutputGroupingColumns?

A: 平常状态下,GroupingColumns包涵在KeySortColumns中,KeySortColumns和PartitionColumns要包括在Key schema中。

  • 在Map端,Mapper输出的Record会依据设置的PartitionColumns计算哈希值,决定分配到哪些Reducer,会依照KeySortColumns对Record实行排序。
  • 在Reduce端,输入Records在遵照KeySortColumns排序好后,会依照GroupingColumns钦赐的列对输入的Records实行分组,即会相继遍历输入的Records,把GroupingColumns所钦点列相同的Records作为三次reduce函数调用的输入。

MapReduce

studio对MapReduce的支出流程帮助与费用UDF基本相仿,首要差异有:

  • MapReduce程序是法力于整张表的,而且输入输出表在Driver中已钦点,因而1旦应用sample数据测试的话在run configuration里只需求钦赐project即可。

  • MapReduce开发好后,只须要打包成jar上传财富即可,未有登记这一步。

  • 对于MapReduce,假如想在生产实际运作,能够由此studio无缝集成的console来形成。具体的,在Project Explorer Window的project上右键,选用Open in Console,然后在console命令行中输入类似如下的指令:
    jar -libjars wordcount.jar -classpath D:odpscltwordcount.jar com.aliyun.odps.examples.mr.WordCount wc_in wc_out;

list resources;//查看财富

输入阶段:依据工作量,生成多少个Mapper,把这么些表的数码分配给这个Mapper。每个Mapper分配到表里的一部分记录。

八. 请问mr job的map或许reduce借使想提前终止job, 执行什么样代码?

A: 抛分外就足以,例如throw new RuntimeException("XXX"); 会导致job战败,job也就得了了。


关于MaxCompute

迎接参加马克斯Compute钉钉群斟酌
澳门微尼斯人娱乐 15

开卷原来的文章请点击

Studio升高UDF和MapReduce开发体验,maxcomputemapreduce UDF全称User Defined Function,即用户自定义函数。马克斯Compute提供了重重内建函数来满意用...

其三步:瘦身Jar,因为Dataworks执行M哈弗作业的时候,一定要本地执行,所以保留个main就足以;

Map阶段:每一种Mapper针对每条数据,解析个中的字符串,用空格切开字符串,获得壹组单词。针对内部各种单词,写一条记下

玖. 请问map阶段有时候为何会有interrupted,但是map 最终依旧实现了?

澳门微尼斯人娱乐,A:因为有backup instance在跑,发生backup instance壹般是因为有有些map instances明显慢于任何的,就会在别的机器上运维一个同一的worker来跑,那几个成效类似于hadoop的臆想执行,只要个中某些成功跑完,别的的就足以停掉了(变为interrupted)


澳门微尼斯人娱乐 16

Shuffle阶段-合并排序:也是发生在Mapper上。会先对数码举行排序。比如WordCount的例证,会基于单词进行排序。排序后的合并,又称Combiner阶段,因为前面已经依据单词排序过了,相同的单词都以连在一起的。那能够把二个相邻的集合成一个。Combiner能够减小在一而再Reduce端的总计量,也得以减弱Mapper往Reducer的数码传输的工作量。

拾. mr怎样获得输入表的音讯?

A: 参考:
使用Mapper.TaskContext的接口getInputTableInfo(),会获得输入表的TableInfo对象
各样map worker只会处理来自单一表或分区的多寡,在mapper的setup阶段得到该音讯即可。


经过上述办法,我们得以在Dataworks上跑大于拾M的MPRADO作业。

Shuffle阶段-分配Reducer:把Mapper输出的单词分发给Reducer。Reducer获得多少后,再做二回排序。因为Reducer得到的数目现已在Mapper里已经是排序过的了,所以那边的排序只是本着排序过的数额做统一排序。

1一. 什么样使用自定义partitioner ?

A: 参考如下代码:

import com.aliyun.odps.mapred.Partitioner;

...

public static class MyPartitioner extends Partitioner {

@Override
public int getPartition(Record key, Record value, int numPartitions) {
  // numPartitions即对应reducer的个数
  // 通过该函数决定map输出的key value去往哪个reducer
  String k = key.get(0).toString();
  return k.length() % numPartitions;
}
}

在jobconf里实行设置:jobconf.setPartitionerClass(MyPartitioner.class)
除此以外索要在jobconf里鲜明钦定reducer的个数:jobconf.setNumReduceTasks(num)


作者:隐林

Reduce阶段:Reducer拿前边早已排序好的输入,相同的单词的享有输入进去同1个Redue循环,在循环里,做个数的丰富。

1二. 怎么样设置Key排系列的逐一(ASC or DESC)?

A: 类似如下: 
//key按那一个列排序
job.setOutputKeySortColumns(new String[] { "custid", "msgtype","amount" });
//设置每个列正序依旧倒序
job.setOutputKeySortOrder(new SortOrder[]{SortOrder.ASC,SortOrder.ASC,SortOrder.DESC});


​本文为云栖社区原创内容,未经同意不得转发。归来天涯论坛,查看越来越多

出口阶段:输出Reduce的测算结果,写入到表里恐怕重返给客户端。

一三. 报错kInstanceMonitorTimeout, usually caused by bad udf performance,怎么化解?

A: 报那些错的原委是mapper或然reducer有逻辑执行时间尤其长,且尚未从输入表的读数据也许写出多少,超越默许10min后,会报这几个可怜;有两种缓解方法:

  • 将过期的岁月调的更加长一些,能够安装参数odps.function.timeout抑或安装JobConf#setFunctionTimeout,最长能够安装为3600,即3个小时。
  • 定期向框架汇报心跳 TaskContext#progress(),注意progress不要调用过于频仍,不然有品质难点,能确认保障一回调用之间的小时低于设置的timeout时间即可。

责编:

拓展MapReduce

14. 框架map也许reduce接口里的Record对象是复用的?

A:是的,为了减小对象的付出,框架对于map, reduce接口里的Record对象是复用的,也便是说每一回map可能reduce的每便迭代,Record对象未有变,只是在那之中的数码变动了。要是要保留上3回的Record须要toArray()得到里面包车型客车数据对象开展封存。具体能够参照:


假设Reduce前边还亟需做进一步的Reduce计算,可以用拓展MapReduce模型(简称MLANDCR-V)。M中华V帕杰罗其实正是Reduce阶段甘休后,不直接出口结果,而是再一次经过Shuffle后接其它三个Reduce。

一五. 写完一条记下后,想把outputRecord里面包车型大巴数据清空,这些要怎么弄,要不然,再写下一条记下的时候,若是有个别字段未有值,就会用原来的笔录填充?

    A:假如写的Record对象是复用的,如若某些值没有新set,则仍然保留着前边的值对象。如今尚无直接可以清空的api可以用,能够由此Record.getColumnCount得到column count,用2个for 循环去①一set null即可。


Q:怎么着落实M->安德拉->M->凯雷德那种逻辑吗

1陆. M奥迪Q3帮忙多路输入输出,应该怎么写这么的次序?

    A:参考:多路输入输出示例
对于多路输入,种种输入源对应单独的3个Map阶段,即3个map task只会读取2个输入表的多寡。能够钦点1个表的层层分区列来作为多少个输入,例如a, b, c三分区列,钦赐分区时方可钦点a=1/b=1/c=二类似这样。
    假如相同级别的三个分区,则供给各自作为单身的分区输入,例如贰个表的a=一和a=三分区作为多路输入的俩两样的输入,必要各自钦命。
    maponly的课业也一如既往援助多路输入输出,达成格局类似。


A:在Reduce代码里一向嵌套上Map的逻辑就足以了,把第一个M的劳作在前二个奥迪Q7里完结,而不是用作计量引擎调度规模上的3个独立步骤,比如

1七. sdk怎么样通过instance获取logview url?

A: 能够选取如下的章程获得logview的url

RunningJob rj = JobClient.runJob(job);
com.aliyun.odps.Instance instance = SessionState.get().getOdps().instances().get(rj.getInstanceID());
String logview = SessionState.get().getOdps().logview().generateLogView(instance, 7 * 24);
System.out.println(logview);

reduce(){

18.  MRAV4作业怎么着内定输入表的Project名字?

A: 能够按如下的方法钦赐:

InputUtils.addTable(TableInfo.builder().projectName("test_project_name").tableName("test_table_name").build(), job);

通过TableInfo.builder()projectName接口来钦赐,假设不钦赐,暗许值是在运作MPRADO作业的百般project.


    ...

1玖. 不等的Mapper或然Reducer如何得到可分别的ID?

A: 某些事情场景需求区分不一致的Mapper或Reducer,能够由此TaskContextgetTaskID接口获取到三个Mapper/Reducer独有的id。

String id = context.getTaskID().toString();

    map();

20. M陆风X8代码里有JNI的调用该怎么写?

A:首先project要开通jni的连带权限,在编写翻译准备好so文件后,须求将so以file类型的款型丰硕为Resource,并在MSportage作业提交的时候-resources参数里钦点,例如:

add file libtestjni.so as libtestjni.so -f;
jar -resources testmr.jar,libtestjni.so -classpath testmr.jar Test.MRDriver xxx xxx;

在M昂Cora的java代码应用jni的时候要留心,使用方法如下:

System.loadLibrary("testjni");    // 这里不要写成libtestjni.so,否则会报错,原因是java会自动添加lib前缀和.so后缀的

jni的使用形式能够参考:


}

二一. M奥德赛作业读取表能源,Archive能源应该怎么样操作?

A: 马克斯Compute上的能源(file, table, archive等)可以类比于Hadoop的DistributedCache来掌握,同样是会散发到各样计算节点上去,worker再从本地来读取,因此财富文件不可能过大,不然分发能源便是二个瓶颈,近期暗中认可有贰G的总能源大小限制。
读取能源表,Archive能源全部上的话和读取file类型财富是看似的,只是使用的接口分化。读取能源文件的主意能够参照文书档案:使用能源示例

对于表财富:
将表添加为财富表: add table xxx as xxx -f;
读财富表的接口为:TaskContext#readResourceTable

对于Archive资源:
将本地archive(.tar, .zip等archive文件)上传为财富: add archive as xxx -f;
读archive能源的接口为:TaskContext#readResourceArchiveAsStream


...不断更新中...

MapReduce常见难题解答,odpsmaxcompute分区 本文用到的 Ali云数加-大数据计算服务马克斯Compute产品地址:...

敏捷伊始

运营环境

工欲善其事,必先利其器。MLAND的费用提供了依照IDEA和Eclipse的插件。当中相比较推荐用IDEA的插件,因为IDEA大家还在不断做迭代,而Eclipse已经甘休做立异了。而且IDEA的功力也比较丰盛。

现实的插件的装置情势步骤能够参考文档,本文不在赘言。

本文由威尼斯人科技发布,转载请注明来源

关键词: 微尼斯人娱乐