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

主要编辑:

数量输出

10. mr如何获取输入表的音信?

A:
参考:
使用Mapper.TaskContext的接口getInputTableInfo(),会赢得输入表的TableInfo对象
种种map
worker只会处理来自单一表或分区的数据,在mapper的setup阶段得到该新闻就可以。


​本文为云栖社区原创内容,未经同意不得转发。再次来到博客园,查看越多

职分的是在马克斯Comput(ODPS)上运维的,客户端通过jar命令发起呼吁。

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

A:首先project要开通jni的有关权限,在编写翻译准备好so文件后,需求将so以file类型的款式丰裕为Resource,并在MPRADO作业提交的时候-resources参数里钦命,例如:

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

在M宝马7系的java代码应用jni的时候要专注,使用办法如下:

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

jni的采取办法能够参照:


原标题:通过轻易瘦身,解决Dataworks 拾M文书限制难题

定期调度

4. Reducer数目怎么样设置?

A: 通过JobConf的接口setNumReduceTasks能够安装。
对此pipeline作业,Jobconf的接口同样能够安装,只可是设置后具备reduce阶段的个数都以千篇一律的值。
1旦要分等第设置,设置形式如下:
Pipeline pipeline = Pipeline.builder()
.addMapper(TokenizerMapper.class)

.addReducer(SumReducer.class).setNumTasks(5)

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


客户端下载地址:

setCombinerOptimizeEnable(boolean
isCombineOpt)设置是不是对Combiner举办优化。

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

A:是的,为了削减对象的付出,框架对于map,
reduce接口里的Record对象是复用的,也正是说每便map大概reduce的历次迭代,Record对象没有变,只是当中的多少变动了。假设要保留上二次的Record必要toArray()获得内部的数额对象实行封存。具体能够参考:


其三步:瘦身Jar,因为Dataworks实践MGL450作业的时候,一定要本地试行,所以保留个main就足以;

沙箱是马克斯Compute的1套安全系统,使得在马克斯Compute上运营的课业无法获得其余用户的音信,也无从赢得系统的局地音信。首要归纳以下几点,完整的列表能够参考文档

陆. mr 输出到表或有些分区里时,输出的方式时扩张如故覆盖 ?

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


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

odpscmd  -u accessId  -p  accessKey  –project=testproject
–endpoint=  -e “jar -resources
aaa.jar -classpath ./aaa.jar com.XXX.A”

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

A:
报这一个错的缘由是mapper大概reducer有逻辑实施时间专门长,且尚未从输入表的读数据也许写出多少,超越暗中认可十min后,会报这一个可怜;有二种缓解方法:

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

作者:隐林

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

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

   
A:假如写的Record对象是复用的,借使有个别值未有新set,则还是保留着前面的值对象。近来不曾直接能够清空的api可以用,能够经过Record.getColumnCount得到column
count,用2个for 循环去壹壹set null就可以。


第一步:方今由此马克斯Compute
CLI上传的财富,在Dataworks左边能源列表是找不到的,只好通过list
resources查看确认能源;

运作条件

12. 如何设置Key排系列的顺序(ASC or DESC)?

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


list resources;//查看财富

能源表和文件能够让有个别小表/小文件可以便宜被读取。鉴于读取数据的限制必要小于6八遍,壹般是在setup里读取后缓存起来,具体的事例能够参见这里。

16. M冠道匡助多路输入输出,应该怎么写这么的先后?

    A:参考:多路输入输出示例
对于多路输入,每一个输入源对应单独的一个Map阶段,即二个map
task只会读取二个输入表的数目。能够钦命2个表的多种分区列来作为3个输入,例如a,
b, c三分区列,钦命分区时方可钦点a=1/b=1/c=二类似那样。
   
倘使一致级其他五个分区,则须要各自作为单身的分区输入,例如几个表的a=一和a=三分区作为多路输入的俩不等的输入,须要各自钦命。
    maponly的学业也同样支撑多路输入输出,完成方式类似。


化解方案:

setReducerClass(Class theClass)设置Reducer使用的Java类。

九. 请问map阶段有时候为啥会有interrupted,可是map 最终依然完毕了?

A:因为有backup instance在跑,产生backup instance一般是因为有少数map
instances显著慢于别的的,就会在别的机器上运行多个同样的worker来跑,那么些职能看似于hadoop的前瞻施行,只要个中有些成功跑完,其余的就可以停掉了(变为interrupted)


摘要:
用户在DataWorks上实践MapReduce作业的时候,文件大于十M的JA途睿欧和财富文件无法上传到Dataworks,导致力不从心接纳调度去定时推行MapReduce作业。
化解方案: jar -resources test_mr.

void setResources(String
resourceNames)有和jar命令的-resources一样的成效,可是优先级高于-resources(也正是说代码里的设置优先级相比高)

2. M本田UR-V提交命令中-resources和-classpath的明亮?

A:
在马克斯Compute中近乎M大切诺基那类分布式数据处理框架,用户的代码一般在以下四个地点实行:

  • 运维客户端的经过/子进度:那里的用户代码负责准备实行环境、配置任务参数、提交职务,入口平常是main
    class。它不受沙箱限制,施行逻辑由用户代码驱动。同样的,那里的classpath由用户配置,或在console中央银行使-classpath选项增多正视的classpath路线。
  • 长途推行的worker进度:那里的代码负责实行多少处理逻辑,入口是mapper/reducer
    class。它受限沙箱限制,且施行逻辑由马克斯Compute框架驱动。用户在命令行配置的-classpath在此间不算(显著,远程机器的门路和客户端机器的路线十分小概保证平等),任何第3方倚重必须作为resource提前上传至马克斯Compute,并在付给职务时利用-resources选项或JobConf.setResources(String[])来设定。

奥门银河赌城 1

别的限制

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

A: 能够按如下的章程钦命:

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

通过TableInfo.builder()projectName接口来钦赐,假诺不钦定,默许值是在运转MCR-V作业的分外project.


客户端配置AK、EndPoint:

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

二一. M悍马H2作业读取表能源,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产品地址:…

用户在DataWorks上实行MapReduce作业的时候,文件大于十M的JA讴歌RDX和财富文件不可能上传到Dataworks,导致力不从心利用调度去定时施行MapReduce作业。

持续为了越发领会地印证难题,小编会尽量地在客户端上操作,而不用IDEA里已经集成的章程。

本文用到的

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


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

职务交给

1九. 不等的Mapper可能Reducer怎么样获得可分别的ID?

A:
某些业务场景供给区分区别的Mapper或Reducer,可以经过TaskContextgetTaskID接口获取到二个Mapper/Reducer独有的id。

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

经过上述措施,大家能够在Dataworks上跑大于十M的MHaval作业。

Q:怎么着完成M->奥迪Q三->M->Haval那种逻辑吗

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

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

7. 1回排序功能,MRubicon相关配置解释,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函数调用的输入。

JobConfig

八. 请问mr job的map可能reduce如果想提前结束job, 执行怎么着代码?

A:
抛格外就足以,例如throw new RuntimeException("XXX"); 会导致job失利,job也就甘休了。


MapReduce已经有文档,用户能够参考文书档案使用。本文是在文档的功底上做一些类似申明及细节解释上的劳作。

5. 报错java.lang.OutOfMemoryError: Java heap space,M牧马人的内部存款和储蓄器设置难题?

A:mapper或reducer的内部存款和储蓄器由两局地组成,JVM的heap memory和JVM
之外的框架相关内部存款和储蓄器。
   
设置JVM内部存款和储蓄器的接口是(都以Java逻辑的话,调控内部存款和储蓄器是用上面五个接口):
    setMemoryForMapperJVMsetMemoryForReducerJVM (默认是1024
单位MB)
    设置框架内部存款和储蓄器(c++部分的)的接口是(一般不须要安装):
    setMemoryForMapTasksetMemoryForReduceTask(默认是2048 单位MB)


odpscmd
-e/-f:odpscmd的-e命令能够在shell脚本里一贯运营2个odpscmd里的授命,所以能够在shell脚本里运维odpscmd
-e ‘jar -resources
xxxxxx’那样的一声令下,在shell脚本里调用MapReduce作业。三个完好无损的例子是

三. Mapper数目怎样设置?

A:假如未有输入表是能够直接钦定map数目setNumMapTasks
   
有输入表的话,setNumMapTasks不奏效,需求经过setSplitSize来控制map数,默认是256M。


等待作业推行成功后,能够在SQL通过查询wc_out表的数量,看到实行的结果

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)


Shuffle阶段-分配Reducer:把Mapper输出的单词分发给Reducer。Reducer获得数量后,再做一回排序。因为Reducer拿到的数码已经在Mapper里已经是排序过的了,所以那边的排序只是针对性排序过的多少做统一排序。

一. 功课应运而生ClassNotFoundException和NoClassDefFoundError相当退步?

A:
对于ClassNotFoundException十分,壹般是正视的class不在你的jar包中,须求把重视的库打到作业jar包中恐怕独立上传,并在-resources中钦命;
对此NoClassDefFoundError极度,先看看正视class是还是不是存在于您的jar包,繁多场地下是由于版本顶牛导致的,恐怕您依靠的库和服务端自带的jar有龃龉。


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

一七. 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);

    …

其他

职分交给

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

MapReduce

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

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

不允许JNI调用

效果解读

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

奥门银河赌城 ,比较前边的飞快开端,能够见到除了数据准备阶段,和M中华V相关的,有能源的上传(add
jar步骤)和jar命令运营M奥德赛作业两步。

在odpscmd里执行

Shuffle阶段-合并排序:也是发生在Mapper上。会先对数码实行排序。比如WordCount的事例,会依据单词实行排序。排序后的联结,又称Combiner阶段,因为前边已经依照单词排序过了,一样的单词都以连在一起的。那能够把3个相邻的联合成一个。Combiner能够削减在后续Reduce端的计算量,也得以减小Mapper往Reducer的数量传输的职业量。