菜单

通过简单瘦身,MapReduce常见问题解答

2019年4月26日 - 互联网科技
通过简单瘦身,MapReduce常见问题解答

用户在DataWorks上推行MapReduce作业的时候,文件大于10M的JAOdyssey和资源文件无法上传到Dataworks,导致力不从心使用调节去定期实践MapReduce作业。

MapReduce已经有文档,用户能够参考文书档案使用。本文是在文书档案的基本功上做一些像样表明及细节解释上的做事。

1. 学业应运而生ClassNotFoundException和NoClassDefFoundError万分退步?

A:
对于ClassNotFoundException万分,一般是借助的class不在你的jar包中,要求把注重的库打到作业jar包中大概独立上传,并在-resources中内定;
美高梅手机版游戏,对此NoClassDefFoundError卓殊,先看看信赖class是还是不是存在于您的jar包,大多景况下是出于版本抵触导致的,大概你凭借的库和服务端自带的jar有争辨。


客户端下载地址:

输入数据

二壹. MHighlander作业读取表能源,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产品地址:…

焚薮而田方案:

Shuffle-分配Reduce

七. 三遍排序作用,M景逸SUV相关计划解释,setMapOutputKeySchema? setOutputKeySortColumns? setPartitionColumns? setOutputGroupingColumns?

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


主编:

JobConf定义了那个职分的底细,仍旧这一个图,解释一下JobConf的别的装置项的用法。

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

摘要:
用户在DataWorks上实行MapReduce作业的时候,文件大于拾M的JA中华V和能源文件不可能上传到Dataworks,导致不能使用调治去定期实行MapReduce作业。
解决方案: jar -resources test_mr.

setSplitSize(long size)通过调度分片大小来调节Mapper个数,单位
MB,默许25陆。Mapper个数不通过void setNumMapTasks(int n)设置。

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

A:首先project要开通jni的连锁权限,在编写翻译绸缪好so文件后,要求将so以file类型的样式丰裕为Resource,并在M揽胜极光作业提交的时候-resources参数里钦点,比方:

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

在MRAV4的java代码应用jni的时候要专注,使用方法如下:

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

jni的利用方式能够参考:


作者:隐林

康宁沙箱

正文用到的

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


透过上述措施,我们得以在Dataworks上跑大于拾M的MCR-V作业。

Map/Reduce

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

   
A:要是写的Record对象是复用的,固然有个别值未有新set,则如故封存着前边的值对象。近来从未有过一向能够清空的api能够用,能够透过Record.getColumnCount获得column
count,用一个for 循环去1一set null即可。


客户端配置AK、EndPoint:

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

二. M途观提交命令中-resources和-classpath的接头?

A:
在马克斯Compute中近乎MOdyssey这类布满式数据管理框架,用户的代码一般在以下七个地方施行:


原标题:通过轻易消脂,化解Dataworks 十M文书限制难题

MapReduce

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

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


​本文为云栖社区原创内容,未经允许不得转发。回去博客园,查看更加多

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

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

A:是的,为了削减对象的开销,框架对于map,
reduce接口里的Record对象是复用的,也便是说每一趟map恐怕reduce的每次迭代,Record对象未有变,只是当中的数量变动了。假诺要保留上一遍的Record须要toArray()得到个中的多少对象实行保存。具体能够参见:


list resources;//查看财富

运转情形

1玖. 差别的Mapper也许Reducer如何获得可分其余ID?

A:
有个别专门的职业场景需求区分不一致的Mapper或Reducer,能够通过TaskContextgetTaskID接口获取到二个Mapper/Reducer独有的id。

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

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

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

壹7. sdk如何通过instance获取logview url?

A: 能够行使如下的不2秘籍获得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);

美高梅手机版游戏 1

setOutputOverwrite(boolean
isOverwrite)设置对输出表是不是开始展览覆盖。类似SQL里的Insert into/overwrite
Talbe的分裂。

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


其三步:瘦腿Jar,因为Dataworks推行MEscort作业的时候,一定要当地实践,所以保留个main就能够;

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

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)


add jar C:\test_mr\test_mr.jar -f;//增多能源

客户端先解析-classpath参数,找到main方法有关的jar包的地点

玖. 请问map阶段有时候为啥会有interrupted,不过map 最终照旧完成了?

A:因为有backup instance在跑,爆发backup instance一般是因为有几许map
instances显然慢于别的的,就会在其他机器上运维二个平等的worker来跑,这几个职能看似于hadoop的测度实施,只要当中有个别成功跑完,其余的就能够停掉了(变为interrupted)


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

其一命令发起作业。MapReduce的职分是运转在马克斯Compute集群上的,客户端须要经过那几个命令把职务运转相关的消息报告集群。

16. MEvoque援助多路输入输出,应该怎么写那样的次序?

    A:参考:多路输入输出示例
对此多路输入,每种输入源对应单独的三个Map阶段,即3个map
task只会读取二个输入表的数据。能够钦命三个表的千家万户分区列来作为一个输入,譬喻a,
b, c三分区列,钦定分区时方可钦命a=1/b=1/c=二类似那样。
   
若是1致级其余多个分区,则要求各自作为独立的分区输入,比如一个表的a=一和a=叁分区作为多路输入的俩不一的输入,要求各自钦点。
    maponly的作业也如出壹辙支撑多路输入输出,落成方式类似。


美高梅手机版游戏 2

八. 请问mr job的map只怕reduce尽管想提前终止job, 实施什么样代码?

A:
抛分外就可以,举例throw new RuntimeException("XXX"); 会导致job退步,job也就得了了。


多少输出

陆. mr 输出到表或有些分区里时,输出的格局时增加照旧覆盖 ?

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


其他

1二. 怎么着设置Key排种类的相继(ASC or DESC)?

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


}

1八.  MRubicon作业如何钦命输入表的Project名字?

A: 能够按如下的不二秘诀钦点:

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

通过TableInfo.builder()projectName接口来钦赐,要是不钦命,暗中认可值是在运营M福睿斯作业的不胜project.


定时调节

叁. Mapper数目如何设置?

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


客户端做的正是给服务器发起职分的调节的授命。此前涉嫌的jar命令便是1种办法。鉴于实际上运转情况的两种性,那里介绍任何的两种常见情势:

伍. 报错java.lang.OutOfMemoryError: Java heap space,MRAV肆的内部存款和储蓄器设置难题?

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


无法访问外部数据源(不能够当爬虫,不能够读奥德赛DS等)

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

A:
报那个错的原因是mapper可能reducer有逻辑试行时间专程长,且从未从输入表的读数据可能写出多少,超越暗中同意十min后,会报这几个非凡;有两种减轻格局:


setOutputKeySortOrder(JobConf.SortOrder[] order)设置 Key
排系列的次第。

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

reduce(){

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

在JAVA代码里直接调用MapReduce作业,可以经过设置SessionState.setLocalRun(false); 完成,具体能够参见这里。

-resources告诉服务器,在运行职责的时候,要求运用的能源有啥。

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

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

拓展MapReduce

Shuffle阶段-合并排序:也是发出在Mapper上。会先对数据开始展览排序。举例WordCount的事例,会依赖单词进行排序。排序后的联合,又称Combiner阶段,因为后面早已依照单词排序过了,同样的单词都以连在一同的。那能够把一个相邻的统一成三个。Combiner能够减小在两次三番Reduce端的计算量,也足以减小Mapper往Reducer的数额传输的职业量。

setMapOutputKeySchema(Column[] schema)设置 Mapper 输出到 Reducer 的
Key 行属性。

等候作业实施成功后,可以在SQL通过询问wc_out表的数码,看到实行的结果

线上运维

工欲善其事,必先利其器。MLacrosse的开采提供了凭仗IDEA和Eclipse的插件。其中相比较推荐用IDEA的插件,因为IDEA大家还在相连做迭代,而Eclipse已经截至做革新了。而且IDEA的成效也比较丰盛。

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

setMemoryForJVM(int mem)设置 JVM虚拟机的内部存款和储蓄器能源,单位:MB,私下认可值 拾二4.

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

差别意读本和姑件(举例JSON里就用到了,就必要改用GSON)

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

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

输出阶段:输出Reduce的计量结果,写入到表里或许重回给客户端。

资源表/文件

在odpscmd里执行add jar命令:

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

任何限制

此间的/JarPath/mapreduce-examples.jar的路线要替换开支地实际的文本路线。这几个命令能把地点的jar包传到服务器上,-f是只要已经有同名的jar包就覆盖,实际使用中对于是报错照旧覆盖须求严格牵记。

摘要:大额测算服务(马克斯Compute)的效应详解和平运动用体验

`jar -resources mapreduce-examples.jar -classpath
mapreduce-examples.jar

对照后面包车型客车飞跃伊始,能够看看除了数据希图阶段,和MLX570相关的,有财富的上传(add
jar步骤)和jar命令运转MRubicon作业两步。

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

假使Reduce后边还须求做尤其的Reduce计算,能够用拓展MapReduce模型(简称M卡宴奥迪Q3)。MHavalHighlander其实正是Reduce阶段甘休后,不直接出口结果,而是再一次通过Shuffle后接其它多个Reduce。

步骤为

譬喻有一张相当的大的表。表里有个String字段记录的是用空格分割开单词。最终索要总括全体记录中,每一个单词出现的次数是多少。这完全的持筹握算流程是

A:在Reduce代码里一贯嵌套上Map的逻辑就可以了,把第二个M的干活在前三个CR-V里落成,而不是用作总结引擎调节范围上的贰个单身步骤,举例

Reduce阶段

JobConfig

任务交给

听新闻说com.aliyun.odps.mapred.open.example.WordCount,找到main方法所在类的门道和名字

在一个Mapper里,只会读一张表,不一致的表的数据会在分歧的Mapper
worker上运营,所以能够用示例里的那一个主意先猎取这么些Mapper读的是怎样表。

大额开拓套件能够布署MapReduce作业。

财富表和文书能够让部分小表/小文件能够1本万利被读取。鉴于读取数据的限制亟需小于陆十遍,一般是在setup里读取后缓存起来,具体的例子能够参照这里。

若果在odpscmd的配备文件里早已配备好了,那只必要写-e的局地。

Shuffle-合并排序

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

OutputUtils.addTable(TableInfo table, JobConf
conf)设置了出口的表。多路输入输出可以参照这里。

odpscmd
-e/-f:odpscmd的-e命令可以在shell脚本里一向运行一个odpscmd里的授命,所以可以在shell脚本里运维odpscmd
-e ‘jar -resources
xxxxxx’那样的吩咐,在shell脚本里调用MapReduce作业。三个完全的例子是

功能介绍

沙箱是马克斯Compute的一套安整种类,使得在马克斯Compute上运营的学业不可能赢得别的用户的新闻,也无力回天获取系统的有个别音信。主要回顾以下几点,完整的列表能够参考文档

具体的插件的设置格局步骤能够参考文档,本文不在赘言。

输入阶段:根据职业量,生成多少个Mapper,把这么些表的多少分配给这么些Mapper。每一个Mapper分配到表里的壹有个别记录。

在odpscmd里执行

生育及周期调节

void setResources(String
resourceNames)有和jar命令的-resources同样的功效,可是优先级高于-resources(相当于说代码里的装置优先级比较高)

客户端发起add jar/add
file等能源操作,把在客户端的机械(比方小编测试的时候是从小编的台式机)上,运维职分涉及的能源文件传到服务器上。那样前面运维职务的时候,服务器上本事有对应的代码和文件能够用。借使原先曾经传过了,这一步能够轻便。

没辙起十二线程/多进度

大额开荒套件能够配备Shell作业。能够在Shell作业里参考上边包车型大巴主意用odpscmd
-e/-f来调整MapReduce作业。

    map();

Map阶段

读表

前言

不援助反射/自定义类加载器(所以不支持部分第三方包)

jar -resources mapreduce-examples.jar -classpath mapreduce-examples.jar
com.aliyun.odps.mapred.open.example.WordCount wc_in wc_out

不允许JNI调用

职能解读

继续为了特别明亮地证实难点,作者会尽量地在客户端上操作,而不用IDEA里早已集成的主意。

大数额开采套件的定期职分/工作流能够安插调整周期和职责注重,合营前面提到的格局里的MapReduce作业/Shell作业,达成职务的调整。

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

神速早先

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

点此查看最初的小说:http://click.aliyun.com/m/41384/

Q:如何达成M->帕杰罗->M->哈弗那种逻辑吗

谈起MapReduce就必需WordCount,作者特意喜爱文书档案里的那么些图片。

出品范围

做多少妄想,包蕴创造表和应用Tunnel命令行工具导入数据

setOutputGroupingColumns(String[]
cols)数据在Reducer里排序好了后,是哪些数据进入到同八个reduce方法的,正是看那里的设置。一般的话,设置的和setPartitionColumns(String[]
cols)同样。能够见见一回排序的用法。

详细的SDK的文档,可以在Maven里下载。这是下载地址。

    …

其余后续还亟需用到客户端,能够参考文档安装。

setNumReduceTasks(int n)设置 Reducer 职务数,默感觉 Mapper 职责数的
1/4。假若是Map
only的任务,供给设置成0。能够参照这里。

职分交给

末段经过JobClient.runJob(job);客户端往服务器发起了这么些MapReduce作业。

详见马克斯Compute MRAV肆限制项汇总

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

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

相关文章

发表评论

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

网站地图xml地图