原标题:通过轻松减肥,消除Dataworks 拾M文件限制难题

摘要:大数据估测计算服务(马克斯Compute)的成效详解和使用体验

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

摘要:
用户在DataWorks上实施MapReduce作业的时候,文件大于十M的JA科雷傲和财富文件不能够上传到Dataworks,导致不或许利用调治去定期推行MapReduce作业。
化解方案: jar -resources test_mr.

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

本文用到的

Ali云数加-大数量总计服务马克斯Compute产品地址:


用户在DataWorks上进行MapReduce作业的时候,文件大于10M的JA中华V和能源文件无法上传到Dataworks,导致力不从心运用调解去定时施行MapReduce作业。

前言

一. 功课应运而生ClassNotFoundException和NoClassDefFoundError极度失利?

A:
对于ClassNotFoundException分外,一般是正视的class不在你的jar包中,需求把信赖的库打到作业jar包中只怕独立上传,并在-resources中钦命;
对此NoClassDefFoundError卓殊,先看看重视class是不是存在于你的jar包,诸多动静下是出于版本冲突变成的,只怕您依附的库和服务端自带的jar有争论。


化解方案:

MapReduce已经有文档,用户能够参照文书档案使用。本文是在文书档案的底子上做一些看似申明及细节解释上的办事。

二. MLX570提交命令中-resources和-classpath的明白?

A:
在MaxCompute中类似MPAJERO那类布满式数据管理框架,用户的代码一般在以下五个地点实践:

  • 运转客户端的进度/子进度:那里的用户代码肩负计划执行碰着、配置职分参数、提交职责,入口平常是main
    class。它不受沙箱限制,推行逻辑由用户代码驱动。相同的,那里的classpath由用户配置,或在console中动用-classpath选项增多信赖的classpath路径。
  • 远程施行的worker进度:那里的代码担当实行多少管理逻辑,入口是mapper/reducer
    class。它受限沙箱限制,且实行逻辑由MaxCompute框架驱动。用户在命令行配置的-classpath在那里不算(鲜明,远程机器的门径和客户端机器的门径不可能担保同1),任何第三方正视必须作为resource提前上传至马克斯Compute,并在提交职务时行使-resources选项或JobConf.setResources(String[])来设定。

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

作用介绍

3. Mapper数目如何设置?

A:假使没有输入表是能够一向内定map数目setNumMapTasks
   
有输入表的话,setNumMapTasks不奏效,须要经过setSplitSize来控制map数,默认是256M。


客户端下载地址:

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();


客户端配置AK、EndPoint:

图片 1

五. 报错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,小编专门欣赏文书档案里的这些图片。

6. mr 输出到表或有个别分区里时,输出的情势时扩大如故覆盖 ?

A: 会覆盖输出表或分区在此以前的始末


其次步:最近因此MaxCompute
CLI上传的财富,在Dataworks左边能源列表是找不到的,只可以通过list
resources查看确认能源;

举个例子有一张异常的大的表。表里有个String字段记录的是用空格分割开单词。最终索要总计全部记录中,各样单词出现的次数是不怎么。这完全的持筹握算流程是

七. 二遍排序作用,M卡宴相关配置解释,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作为3次reduce函数调用的输入。

list resources;//查看财富

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

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

A:
抛卓殊就能够,举个例子throw new RuntimeException("XXX"); 会导致job退步,job也就得了了。


其三步:塑身Jar,因为Dataworks推行M奥迪Q5作业的时候,一定要本地实践,所以保留个main就足以;

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

9. 请问map阶段有时候为啥会有interrupted,可是map 最后还是实现了?

A:因为有backup instance在跑,发生backup instance一般是因为有有些map
instances显然慢于其余的,就会在别的机器上运营3个均等的worker来跑,这一个效率看似于hadoop的估计实行,只要当中有些成功跑完,其余的就可以停掉了(变为interrupted)


图片 2

Shuffle阶段-合并排序:也是发出在Mapper上。会先对数据开始展览排序。例如WordCount的事例,会依照单词进行排序。排序后的统1,又称Combiner阶段,因为前面已经依照单词排序过了,同样的单词都以连在一齐的。那可以把3个相邻的联合成3个。Combiner能够减小在一连Reduce端的总括量,也足以减弱Mapper往Reducer的数码传输的工作量。

10. mr怎样获取输入表的音信?

A:
参考:
使用Mapper.TaskContext的接口getInputTableInfo(),会获得输入表的TableInfo对象
种种map
worker只会管理来自单一表或分区的多寡,在mapper的setup阶段获得该消息就可以。


经过上述办法,我们得以在Dataworks上跑大于十M的M帕杰罗作业。

Shuffle阶段-分配Reducer:把Mapper输出的单词分发给Reducer。Reducer拿到数码后,再做2回排序。因为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拿后边早已排序好的输入,同样的单词的具有输入进去同二个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的总计结果,写入到表里可能重返给客户端。

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

A:
报那几个错的来由是mapper恐怕reducer有逻辑实践时间专门长,且从未从输入表的读数据或然写出多少,超过暗许拾min后,会报这一个尤其;有三种缓慢解决方法:

  • 将过期的日子调的越来越长一些,能够安装参数odps.function.timeout依旧安装JobConf#setFunctionTimeout,最长能够安装为3600,即一个时辰。
  • 定时向框架汇报心跳 TaskContext#progress(),注意progress不要调用过于频仍,不然有品质难题,能保险五遍调用之间的光阴低于设置的timeout时间就能够。

责编:

拓展MapReduce

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

A:是的,为了削减对象的成本,框架对于map,
reduce接口里的Record对象是复用的,也正是说每一次map也许reduce的每一趟迭代,Record对象没有变,只是当中的多少变动了。如若要封存上一回的Record须求toArray()获得个中的数目对象举行保存。具体能够参见:


1经Reduce后边还索要做越来越的Reduce总结,能够用拓展MapReduce模型(简称M兰德瑞鹰猎豹CS6)。M大切诺基CR-V其实正是Reduce阶段甘休后,不直接出口结果,而是再一次经过Shuffle后接此外一个Reduce。

壹伍. 写完一条记下后,想把outputRecord里面包车型地铁数目清空,这些要怎么弄,要不然,再写下一条记下的时候,假诺某些字段未有值,就会用原来的笔录填充?

   
A:借使写的Record对象是复用的,倘诺有些值没有新set,则如故封存着前边的值对象。目前尚未一直能够清空的api能够用,可以因而Record.getColumnCount获得column
count,用二个for 循环去11set null就可以。


Q:怎么着贯彻M->R->M->途乐那种逻辑吗

1六. MSportage援救多路输入输出,应该怎么写这么的顺序?

    A:参考:多路输入输出示例
对于多路输入,每一种输入源对应单独的一个Map阶段,即两个map
task只会读取八个输入表的数码。能够内定1个表的泛滥成灾分区列来作为八个输入,举个例子a,
b, c三分区列,钦命分区时方可内定a=1/b=1/c=二类似那样。
   
倘使壹致级其余多个分区,则须要各自作为单身的分区输入,举个例子3个表的a=一和a=叁分区作为多路输入的俩例外的输入,需求各自钦赐。
    maponly的学业也一律支撑多路输入输出,达成格局类似。


A:在Reduce代码里直接嵌套上Map的逻辑就足以了,把第2个M的专门的学业在前1个哈弗里落成,而不是用作计算引擎调节规模上的八个单身步骤,比方

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(){

1八.  M奥迪Q5作业怎么样钦命输入表的Project名字?

A: 能够按如下的办法钦命:

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

通过TableInfo.builder()projectName接口来内定,如若不点名,暗许值是在运转MPAJERO作业的非常project.


    …

1九. 分化的Mapper可能Reducer如何获得可分别的ID?

A:
有个别职业场景必要区分不相同的Mapper或Reducer,可以透过TaskContextgetTaskID接口获取到3个Mapper/Reducer独有的id。

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

    map();

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

A:首先project要开通jni的相关权限,在编写翻译筹算好so文件后,须要将so以file类型的格局丰裕为Resource,并在M福特Explorer作业提交的时候-resources参数里内定,举个例子:

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

在M奥迪Q三的java代码应用jni的时候要留心,使用方法如下:

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

jni的运用方法能够参见:


}

二壹. MRubicon作业读取表能源,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的效率也相比较充裕。

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

其它后续还索要用到客户端,能够参考文档安装。

承继为了特别透亮地注解问题,笔者会尽量地在客户端上操作,而不用IDEA里早已合龙的章程。

线上运转

以WordCount为例,文书档案能够参照这里

步骤为

做多少希图,蕴含创造表和行使Tunnel命令行工具导入数据

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

在odpscmd里执行add jar命令:

add jar /JarPath/mapreduce-examples.jar -f;

发表评论

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

网站地图xml地图