www.27111.com马克斯Compute Studio提升UDF和MapReduce开垦体验,maxcomputemapreduce

原标题:通过轻松减肥,解决Dataworks 10M文本限制难题

摘要:大数量总结服务(马克斯Compute)的效果详解和应用体验

马克斯Compute Studio提高UDF和MapReduce开垦体验,maxcomputemapreduce

UDF全称User Defined
Function,即顾客自定义函数。MaxCompute提供了无数内建函数来满足客商的持筹握算需要,同期顾客还足以创建自定义函数来满意定制的总计要求。顾客能增添的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:

MaxCompute(原ODPS) MapReduce常见难点解答,odpsmaxcompute分区

摘要:
顾客在DataWorks上进行MapReduce作业的时候,文件大于10M的JA杰路驰和能源文件不可能上传到Dataworks,导致无法运用调节去定时推行MapReduce作业。
技术方案: jar -resources test_mr.

点此查看原著:http://click.aliyun.com/m/41384/

创建MaxCompute Java Module

第一,你得在intellij中开创多少个用来开采马克斯Compute
Java程序的module。具体的,File | new | module … module类型为马克斯Compute
Java,配置Java JDK和马克斯Compute
console的安装路线,点击next,输入module名,点击finish。

此地配置console的指标主要有五个:

  • 编纂UDF和MHaval供给信任马克斯Compute框架的有关jar,而这么些jar在console的lib目录均存在,studio能帮你将这个lib自动导入到module的重视性库中。

  • studio能集成console,一些动作通过console操作将那些造福。

www.27111.com 1

迄今结束,多个能支付马克斯Compute
java程序的module已创造,如下图的jDev。重要目录包涵:

  • src(客户支付UDF|M奥迪Q7程序的源码目录)
  • examples(示例代码目录,包罗单测示例,客商可参谋这里的例证开采自身的顺序或编辑单测)
  • warehouse(本地运维要求的schema和data)

www.27111.com 2

本文用到的

Ali云数加-许多少计算服务马克斯Compute产品地址:


顾客在DataWorks上实施MapReduce作业的时候,文件大于10M的JAWrangler和财富文件无法上传到Dataworks,导致不可能使用调解去定时推行MapReduce作业。

前言

创建UDF

假使我们要完毕的UDF要求是将字符串调换为题写(内建函数TOLOWEQX56已达成该逻辑,这里大家只是经过这些大致的须要来演示如何通过studio开垦UDF)。studio提供了UDF|UDAF|UDTF|Mapper|Reducer|Driver的模板,那样客户只须要编制自个儿的事情代码,而框架代码会由模板自动填写。

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

www.27111.com 3

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

www.27111.com 4

  • 3.
    模板已自行填充框架代码,大家只必要编写制定将字符串调换到小写的函数代码就可以。

www.27111.com 5

1. 作业应时而生ClassNotFoundException和NoClassDefFoundError十分失败?

A:
对于ClassNotFoundException十分,日常是信任的class不在你的jar包中,供给把正视的库打到作业jar包中或然独立上传,并在-resources中钦命;
对此NoClassDefFoundError至极,先看看信任class是不是存在于你的jar包,相当多动静下是出于版本冲突形成的,大概你凭借的库和服务端自带的jar有冲突。


削株掘根方案:

MapReduce已经有文档,顾客能够参照文书档案使用。本文是在文书档案的底蕴上做一些像样注脚及细节解释上的专门的工作。

测试UDF

UDF或MWrangler开辟好后,下一步正是要测量试验本人的代码,看是或不是符合预期。studio提供三种测量试验方法:

2. MMurano提交命令中-resources和-classpath的知道?

A:
在马克斯Compute中临近M大切诺基那类布满式数据管理框架,客户的代码日常在以下四个地方实施:

  • 运行顾客端的历程/子进程:这里的客商代码肩负筹算进行蒙受、配置职分参数、提交任务,入口常常是main
    class。它不受沙箱限制,执行逻辑由客商代码驱动。同样的,这里的classpath由客户配置,或在console中利用-classpath选项增加依赖的classpath路线。
  • 长途施行的worker进程:这里的代码负担奉行多少管理逻辑,入口是mapper/reducer
    class。它受限沙箱限制,且实施逻辑由马克斯Compute框架驱动。客商在命令行配置的-classpath在这里间不算(显著,远程机器的渠道和顾客端机器的路子不可能保证平等),任何第三方依赖必需作为resource提前上传至MaxCompute,并在提交职责时利用-resources选项或JobConf.setResources(String[])来设定。

率先步:大于10M的resources通过MaxCompute CLI顾客端上传,

效率介绍

单元测量试验

依赖于马克斯Compute提供的Local
Run框架,您只供给像写普通的单测那样提供输入数据,断言输出就能够便于的测量检验你本身的UDF或MRAV4。在examples目录下会有各类类型的单测实例,可参照他事他说加以考察例子编写本身的unit
test。这里大家新建三个MyLowerTest的测验类,用于测量检验大家的MyLower:

www.27111.com 6

3. Mapper数目怎样设置?

A:若无输入表是可以一贯钦命map数目setNumMapTasks
   
有输入表的话,setNumMapTasks不见效,须要经过setSplitSize来控制map数,默认是256M。


顾客端下载地址:

MapReduce

sample数据测验

有的是顾客的需要是能sample部分线上表的数量到本机来测验,而那studio也提供了扶植。在editor中UDF类MyLower.java上右键,点击”运转”菜单,弹出run
configuration对话框,配置马克斯Compute
project,table和column,这里大家想将hy_test表的name字段转换为小写:

www.27111.com 7

点击OK后,studio会先经过tunnel自动下载表的sample数据到本地warehouse(如图中高亮的data文件),接着读取钦点列的多寡并本地运营UDF,客户能够在调整台看见日志输出和结果打字与印刷:

www.27111.com 8

4. Reducer数目怎样设置?

A: 通过JobConf的接口setNumReduceTasks能够安装。
对此pipeline作业,Jobconf的接口一样能够安装,只不过设置后有所reduce阶段的个数都以均等的值。
万一要分品级设置,设置方法如下:
Pipeline pipeline = Pipeline.builder()
.addMapper(TokenizerMapper.class)

27111普京的网址,www.27111.com,.addReducer(SumReducer.class).setNumTasks(5)

.addReducer(IdentityReducer.class).setNumTasks(1).createPipeline();


客商端配置AK、EndPoint:

www.27111.com 9

发布UDF

好了,我们的MyLower.java测验通过了,接下去大家要将其卷入成jar财富(这一步能够经过IDE打包,参谋顾客手册)上传来马克斯Comptute服务端上:

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

www.27111.com 10

    1. 慎选要上盛传哪个马克斯Compute
      project上,jar包路径,要登记的能源名,以至当能源或函数已存在时是还是不是强制更新,然后点击OK。

www.27111.com 11

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

www.27111.com 12

  • 4.
    抉择供给动用的能源jar,接纳主类(studio会自动分析财富jar中隐含的主类供顾客选用),输入函数名,然后点击OK。

www.27111.com 13

5. 报错java.lang.OutOfMemoryError: Java heap space,M途观的内部存款和储蓄器设置难点?

A:mapper或reducer的内部存款和储蓄器由两有的组成,JVM的heap memory和JVM
之外的框架相关内部存储器。
   
设置JVM内部存款和储蓄器的接口是(都以Java逻辑的话,调度内部存款和储蓄器是用上边八个接口):
    setMemoryForMapperJVMsetMemoryForReducerJVM (默认是1024
单位MB)
    设置框架内部存储器(c++部分的)的接口是(平日无需设置):
    setMemoryForMapTasksetMemoryForReduceTask(默认是2048 单位MB)


add jar C:\test_mr\test_mr.jar -f;//增多财富

提及MapReduce就少不了WordCount,笔者特别爱怜文档里的那几个图形。

生育应用

上传成功的jar资源和挂号成功的function(在Project
Explorer相应project下的Resources和Functions节点中就能够即刻看见,双击也能显得反编写翻译的源码)就可以实际生育应用了。大家开采studio的sql
editor,就会喜欢的选取大家刚写好的mylower函数,语法高亮,函数签字呈现都无足轻重:

www.27111.com 14

6. mr 输出到表或有些分区里时,输出的格局时扩充依然覆盖 ?

A: 会覆盖输出表或分区此前的从头到尾的经过


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

诸如有一张相当的大的表。表里有个String字段记录的是用空格分割开单词。最终索要计算全体记录中,每种单词出现的次数是稍微。那完全的乘除流程是

MapReduce

studio对MapReduce的开支流程帮助与费用UDF基本类似,首要分歧有:

  • MapReduce程序是功用于整张表的,並且输入输出表在Driver中已钦命,由此只要采纳sample数据测验的话在run
    configuration里只必要钦定project即可。

  • MapReduce开垦好后,只要求打包成jar上传财富就可以,未有挂号这一步。

  • 对此MapReduce,借使想在生育实际运行,能够通过studio无缝集成的console来成功。具体的,在Project
    Explorer Window的project上右键,选取Open in
    Console,然后在console命令行中输入类似如下的一声令下:
    jar -libjars wordcount.jar -classpath D:\odps\clt\wordcount.jar
    com.aliyun.odps.examples.mr.WordCount wc_in wc_out;

7. 二回排序功用,M奔驰G级相关配置解释,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函数调用的输入。

list resources;//查看财富

输入阶段:依照职业量,生成多少个Mapper,把这个表的数目分配给这个Mapper。各种Mapper分配到表里的一有些记录。

关于MaxCompute

迎接参与马克斯Compute钉钉群切磋
www.27111.com 15

开卷原作请点击

Studio进步UDF和MapReduce开垦体验,maxcomputemapreduce UDF全称User
Defined
Function,即顾客自定义函数。马克斯Compute提供了不菲内建函数来知足用…

8. 请问mr job的map恐怕reduce要是想提前结束job, 实践怎样代码?

A:
抛十分就足以,比方throw new RuntimeException("XXX"); 会导致job失败,job也就终止了。


其三步:消脂Jar,因为Dataworks施行MCRUISER作业的时候,必须要本地试行,所以保留个main就能够;

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

9. 请问map阶段有的时候候为啥会有interrupted,但是map 最后依旧完毕了?

A:因为有backup instance在跑,爆发backup instance日常是因为有好几map
instances明显慢于另外的,就能够在其余机器上运行三个一致的worker来跑,那一个效果周围于hadoop的推测实行,只要当中某些成功跑完,其余的就足以停掉了(变为interrupted)


www.27111.com 16

Shuffle阶段-合併排序:也是产生在Mapper上。会先对数据开展排序。比方WordCount的例证,会基于单词进行排序。排序后的会集,又称Combiner阶段,因为前面早就遵照单词排序过了,同样的单词都是连在一起的。那可以把2个相邻的联结成1个。Combiner能够减小在持续Reduce端的总括量,也得以收缩Mapper往Reducer的数据传输的职业量。

10. mr怎么样取得输入表的新闻?

A:
参考:
使用Mapper.TaskContext的接口getInputTableInfo(),会赢得输入表的TableInfo对象
每一个map
worker只会管理来自单一表或分区的数额,在mapper的setup阶段获得该音讯就可以。


通过上述方法,大家能够在Dataworks上跑大于10M的MENCORE作业。

Shuffle阶段-分配Reducer:把Mapper输出的单词分发给Reducer。Reducer得到多少后,再做三遍排序。因为Reducer获得的数目现已在Mapper里已是排序过的了,所以这里的排序只是针对排序过的多少做联合排序。

11. 如何接纳自定义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拿前边已经排序好的输入,一样的单词的具有输入进去同三个Redue循环,在循环里,做个数的拉长。

12. 如何设置Key排连串的相继(ASC or DESC)?

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


​本文为云栖社区原创内容,未经允许不得转发。回来知乎,查看越来越多

输出阶段:输出Reduce的计量结果,写入到表里恐怕再次回到给客商端。

13. 报错kInstanceMonitorTimeout, usually caused by bad udf performance,怎么消除?

A:
报这几个错的由来是mapper只怕reducer有逻辑推行时间特别长,且尚未从输入表的读数据可能写出多少,当先默许10min后,会报这么些特别;有二种缓和方法:

  • 将过期的光阴调的更加长一些,能够安装参数odps.function.timeout抑或安装JobConf#setFunctionTimeout,最长能够安装为3600,即贰个小时。
  • 按时向框架陈述心跳 TaskContext#progress(),注意progress不要调用过于频仍,不然有品质难点,能担保两回调用之间的时光低于设置的timeout时间就可以。

责编:

拓展MapReduce

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

A:是的,为了削减对象的支出,框架对于map,
reduce接口里的Record对象是复用的,也正是说每趟map可能reduce的历次迭代,Record对象没有变,只是在这之中的数量变化了。假诺要封存上三遍的Record须要toArray()得到里头的多少对象实行封存。具体能够参见:


借使Reduce前面还索要做越来越的Reduce计算,能够用拓宽MapReduce模型(简称M福睿斯PRADO)。M景逸SUV冠道其实正是Reduce阶段结束后,不直接出口结果,而是再次通过Shuffle后接别的一个Reduce。

15. 写完一条记下后,想把outputRecord里面包车型地铁多少清空,那些要怎么弄,要不然,再写下一条记下的时候,假使某些字段未有值,就能够用原本的记录填充?

   
A:倘若写的Record对象是复用的,假诺某些值未有新set,则如故保留着前边的值对象。近期未曾一向能够清空的api能够用,能够通过Record.getColumnCount得到column
count,用贰个for 循环去一一set null就可以。


Q:怎样贯彻M->ENVISION->M->Wrangler这种逻辑吗

16. M途乐援救多路输入输出,应该怎么写这么的主次?

    A:参照他事他说加以考察:多路输入输出示例
对于多路输入,每一个输入源对应单独的七个Map阶段,即多个map
task只会读取叁个输入表的多少。能够内定二个表的泛滥成灾分区列来作为二个输入,例如a,
b, c八分区列,内定分区时方可内定a=1/b=1/c=2类似那样。
   
就算一样等第的多少个分区,则必要各自作为单身的分区输入,举个例子三个表的a=1和a=3分区作为多路输入的俩两样的输入,需求各自钦点。
    maponly的课业也长久以来支撑多路输入输出,实现格局类似。


A:在Reduce代码里间接嵌套上Map的逻辑就可以了,把第三个M的干活在前二个PAJERO里完结,实际不是充作总括引擎调整范围上的二个单身步骤,举个例子

17. 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.  M普拉多作业怎么着内定输入表的Project名字?

A: 能够按如下的情势钦点:

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

通过TableInfo.builder()projectName接口来钦定,借使不钦定,默许值是在运维MRubicon作业的极其project.


    …

19. 不等的Mapper只怕Reducer如何获得可分其他ID?

A:
有个别业务场景要求区分差别的Mapper或Reducer,能够由此TaskContextgetTaskID接口获取到二个Mapper/Reducer唯有的id。

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

    map();

20. MGL450代码里有JNI的调用该怎么写?

A:首先project要开通jni的相关权限,在编写翻译希图好so文件后,须要将so以file类型的格局丰裕为Resource,并在MKuga作业提交的时候-resources参数里钦定,比如:

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

在MQashqai的java代码应用jni的时候要在乎,使用方法如下:

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

jni的运用方式能够参见:


}

21. M路虎极光作业读取表能源,Archive财富应该怎样操作?

A: 马克斯Compute上的能源(file, table,
archive等)能够类比于Hadoop的DistributedCache来精晓,同样是会散发到每一个计算节点上去,worker再从地面来读取,由此能源文件不能过大,不然分发财富就是四个瓶颈,目前暗许有2G的总财富大小限制。
读取能源表,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产品地址:…

迅猛开首

运作条件

工欲善其事,必先利其器。M福睿斯的付出提供了依据IDEA和Eclipse的插件。此中相比较推荐用IDEA的插件,因为IDEA我们还在相连做迭代,而Eclipse已经告一段落做革新了。何况IDEA的作用也比较充足。

实际的插件的安装格局步骤能够参照文档,本文不在赘言。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website