hadoop - 使用 apache giraph 进行大图的 4 轮廓演算
问题描述
对于我的计算机科学硕士论文,我成功地使用 giraph-1.3.0-snapshot(使用 -Phadoop_yarn 配置文件编译)和 hadoop-2.8.4实现了 4-profiles 演算( https://arxiv.org/abs/1510.02215 )。
我使用 t2.2xlarge(32GB,8CPU)实例在 amazon ec2 上配置了一个由 1 个名称节点和 5 个数据节点组成的集群,并获得了此处描述的结果,其中包含中小尺寸的输入图。
如果我尝试向我的 giraph 程序输入更大的输入图(例如http://snap.stanford.edu/data/web-NotreDame.html),在某些情况下,我会收到许多与 netty 和纱线应用程序失败相关的错误,在其他情况下,纱线应用程序仍处于 RUNNING UNDEFINED 状态(然后我将其杀死而不是等待默认超时),显然没有错误。我也尝试使用 m5.4xlarge (64GB, 16CPU) 但我遇到了同样的问题。我在这里报告了第一种情况的日志错误:
- giraph worker 在数据节点上的错误日志粘贴在这里:https ://pastebin.com/CGHUd0za (所有数据节点中的错误相同)
- giraph master 的错误日志粘贴在这里:https ://pastebin.com/JXYN6y4L
我很确定错误与 EC2 实例的内存不足无关,因为在日志中我总是看到类似“(free/total/max) = 23038.28M / 27232.00M / 27232.00M”的消息。请帮助我,因为我的硕士论文被这个问题阻止了:-(
这是我用来运行 giraph 的命令示例,请检查我使用的参数是否正确?任何其他调整将不胜感激!
giraph 4Profiles-0.0.1-SNAPSHOT.jar it.uniroma1.di.fourprofiles.worker.superstep0.gas1.Worker_Superstep0_GAS1
-ca giraph.numComputeThreads=8 // Since t2.2xlarge has 8 CORES, is it correct to set these parameters to 8?
-ca giraph.numInputThreads=8
-ca giraph.numOutputThreads=8
-w 8 // I set 8 workers since:
// - 5 datanodes on EC2"
// - every datanode configured for max 2 containers in order to reduce messages between datanodes
// - 2 containers are reserved for application master and giraph master
// - (5 datanodes * 2 max containers) - 2 reserved = 8 workers
// Is it correct as reasoning?
-yh 15360 // I set 15360 since it corresponds to
// - yarn.scheduler.minimum-allocation-mb property in yarn-site.xml
// - mapreduce.map.memory.mb property in mapred-site.xml
// Is it correct as reasoning?
-ca giraph.pure.yarn.job=true
-mc it.uniroma1.di.fourprofiles.master.Master_FourProfiles
-ca io.edge.reverse.duplicator=true
-eif it.uniroma1.di.fourprofiles.io.format.IntEdgeData_TextEdgeInputFormat_ReverseEdgeDuplicator
-eip INPUT_GRAPHS/HU_edges.txt-processed
-vof org.apache.giraph.io.formats.IdWithValueTextOutputFormat
-op output
-ca giraph.SplitMasterWorker=true
-ca giraph.messageCombinerClass=it.uniroma1.di.fourprofiles.worker.msgcombiner.Worker_MsgCombiner
-ca giraph.master.observers=it.uniroma1.di.fourprofiles.master.observer.Observer_FourProfiles
-ca giraph.metrics.enable=true
-ca giraph.useInputSplitLocality=false
-ca giraph.useBigDataIOForMessages=true
-ca giraph.useMessageSizeEncoding=true
-ca giraph.oneToAllMsgSending=true
-ca giraph.isStaticGraph=true
此外,我尝试使用以下 netty 参数,但没有解决问题。如果我错过了一些重要参数或者我以错误的方式使用它,你能帮我吗?我试图用一个简单的公式 nettyFactor*defaultValue 来概括传递给 netty 参数的值,其中 nettyFactor 可以是 1、2、3、...(由 shell 参数传递)
-ca giraph.nettyAutoRead=true
-ca giraph.channelsPerServer=$((nettyFactor*1))
-ca giraph.nettyClientThreads=$((nettyFactor*4))
-ca giraph.nettyClientExecutionThreads=$((nettyFactor*8))
-ca giraph.nettyServerThreads=$((nettyFactor*16))
-ca giraph.nettyServerExecutionThreads=$((nettyFactor*8))
-ca giraph.clientSendBufferSize=$((nettyFactor*524288))
-ca giraph.clientReceiveBufferSize=$((nettyFactor*32768))
-ca giraph.serverSendBufferSize=$((nettyFactor*32768))
-ca giraph.serverReceiveBufferSize=$((nettyFactor*524288))
-ca giraph.vertexRequestSize=$((nettyFactor*524288))
-ca giraph.edgeRequestSize=$((nettyFactor*524288))
-ca giraph.msgRequestSize=$((nettyFactor*524288))
-ca giraph.nettyRequestEncoderBufferSize=$((nettyFactor*32768))
...我还有其他问题:1) 这是我的 hadoop 配置。请检查它,但我很确定这是正确的。我对此只有一个问题:由于 giraph 不使用“reduce”,因此在 mapred-site.xml 中为 mapreduce.reduce.memory.mb 分配 0 MB 是否正确?
2) 为了避免 ClassNotFoundException 错误,我将我的 giraph 应用程序的 jar 和所有 giraph jar 从 $GIRAPH_HOME 和 $GIRAPH_HOME/lib 复制到 $HADOOP_HOME/share/hadoop/yarn/lib。有更好的解决方案吗?
3) 最后但并非最不重要的一点:在这里你可以找到我的 giraph 程序的完整 hadoop/yarn 日志,输入如下图http://snap.stanford.edu/data/web-NotreDame.html。在这种情况下,纱线应用程序仍处于 RUNNING UNDEFINED 状态。
解决方案
推荐阅读
- javascript - 将语音频道中的所有人静音,某些角色除外
- r - 从名称在变量中的列中选择行
- leaflet - 地图拖动后保持关注画布层
- c++ - 编译的 Elf 二进制文件太大
- python-3.x - 根据规则拆分 spark DataFrame 的最有效方法
- flutter - 在 Flutter Cloud Firestore 中设置自定义文档 ID
- javascript - 为 JSX 元素节点生成唯一的 id - React
- npm - 为什么“npm doctor”会产生权限错误?
- java - Stripe:同一产品一次订阅
- emeditor - EmEditor 在处理长行时没有响应