基于MaxCompute的图计算实践分享-常见问题解决及优化指南

免费开通大数据服务:https://www.aliyun.com/product/odps

常见问题FAQ

Q:Graph 能支持多少节点的进行计算?
A:默认最多1000个节点,通过配置odps.graph.worker.num,可以使用多达3000个节点

 

Q:Graph 单个节点支持多少内存?
A:默认内存范围为[2048, 32768] 单位为M,通过配置odps.graph.worker.memory 设置所需内存,如果单个节点需要设置超过32768M的内存,请找ODPS 管理员修改配置

 

Q:Graph 代码中可以访问网络吗?
A:不可以

 

Q:FAILED: ODPS-0730001: Must define VertexResolver when add/remove vertex/edge or send message to nonexist vertex in superstep
A:根据消息提示,请实现VertexResolver 并设置到配置中,配置为odps.graph.computing.vertex.resolver.class

 

Q:FAILED: ODPS-0010000:System internal error - Mutations for vertex id 'xxx' overflow, Data buffer exceed max length: 2147483645 bytes
A:设置odps.graph.use.multiple.input.output为true即可解决

 

Q:FAILED: ODPS-0010000:System internal error - Job failover reach max times 3, worker = 0, message = worker restart
A:有两种情况: 一种是作业时间太长,节点个数多,机器宕机,导致failover 次数过多,这时可以调大odps.graph.max.attempts(默认3次),另一种是作业超用内存被集群杀掉。 第二种情况发生的概率较大, 请根据实际情况判断,如果需要增加内存/节点数,请根据实际情况设置

 

Q:FAILED: ODPS-0730001: Java heap space
A:worker 内存不够用,通过配置odps.graph.worker.memory 设置所需内存,或者通过设置odps.graph.worker.num 增加worker 节点的个数

 

Q:FAILED: ODPS-0730001: GraphLoader load duplicate ****
A:请实现VertexResolver 并设置到配置中,配置为odps.graph.loading.vertex.resolver.class

 

Q:FAILED: ODPS-0730001: Resource not found 'res_file' - Perhaps you forgot to add it to '-resources' list when run graph
A:根据提示在提交作业时同时提交资源

 

Q:FAILED: ODPS-0730001: ClassNotFoundException *****
A:提交作业时不仅要提交作业的jar,也需要提交依赖的jar包,通过-libjars 提交,多个jar 以逗号分隔

 

Q:java.lang.OutOfMemoryError: unable to create new native thread
A:作业重试即可

 

Q:FAILED: ODPS-0010000:System internal error - ensureRemaining: Only bytes remaining, trying to read 
A:用户需检查自定义的writable 序列化/反序列化代码是否对应,亦即写出/读取的方式是否统一

 

Q:作业经常FAILOVER
A:扩大节点内存/节点个数 重试

 

Q:FAILED: ODPS-0730001: Exceed maximum read times [64] per resource: '****'
A:使用worker value保存resource,并打开worker value的checkpoint 设置.set odps.graph.worker.value.checkpoint.enable=true


优化指南

资源等待超时
现象:ODPS-0010000:System internal error - Timeout when graph master wait all workers start,实际上是在一定时间内无法集齐graph作业所需资源。可根据如下手段优化:

a)判断作业实际需要内存与 任务使用内存之间差距

                i.          首先大约计算总内存,查看odps 表原始的数据量 desc table 可以查看

               ii.          使用公式总内存(total)= size(压缩) * 6 可计算出大约总内存,然后 规定一个内存比如8192m,则可以得出worker数。一般来说大于8192m的内存较难申请,请注意

b)将资源需求铺开,也就是说增加worker 的个数,而减少单个worker 申请内存的大小 set odps.graph.worker.memory = xxxx; set odps.graph.worker.num=xxxx;

c)调整作业的资源等待时间(单位为分钟,默认为15分钟) set odps.graph.fuxi.job.max.wait.time =xxx;

 

作业超过运行内存,可以通过如下手段优化作业

优化作业消息传递, 具体使用Combiner,配置为odps.graph.combiner.class ,Combiner的作用是合并某worker 发送给其他worker 点的消息。可大幅减少网络消息的数量和内存使用

优化作业早停,使用Aggregator,halt vertex

资源大杀器 
如果项目所在的资源组的minquota 能够满足graph 作业的cpu/memory 使用需要,则可以设置:
set odps.graph.fuxi.job.resource.all_or_nothing=true
这个配置是以所在quota 组为单位,以最高优先级申请资源


相关文章

基于MaxCompute的图计算实践分享-Aggregator机制介绍

基于MaxCompute的图计算实践分享-Resolver简介

基于MaxCompute的图计算实践分享-图加载过程

 

上一篇:如何构建Android MVVM应用框架


下一篇:python自动化测试开发利器ulipad最佳实践(可写python测试代码也可编写selenium、Appium等)