4-х профильное исчисление большого графа с Apache Giraph
Для моей магистерской диссертации в области компьютерных наук мне удалось реализовать 4-х профильное исчисление ( https://arxiv.org/abs/1510.02215) с использованием giraph-1.3.0-snapshot (скомпилировано с профилем -Phadoop_yarn) и hadoop-2.8.4.
Я настроил кластер на amazon ec2, состоящий из 1 namenode и 5 datanodes, используя экземпляры t2.2xlarge (32GB, 8CPU), и я получил результаты, описанные здесь, с входными графиками малых / средних размеров.
Если я пытаюсь ввести в мою программу giraph большие графы ввода (например, например, http://snap.stanford.edu/data/web-NotreDame.html), то в некоторых случаях я получаю много ошибок, связанных с netty и приложением пряжи FAILS. в других случаях приложение пряжи остается в состоянии RUNNING UNDEFINED (тогда я его убил вместо ожидания времени ожидания по умолчанию) без видимых ошибок. Я также пытался использовать m5.4xlarge (64 ГБ, 16CPU), но у меня возникли те же проблемы. Я сообщил об ошибках журнала первого случая здесь:
- журнал ошибок работника giraph на датоде, вставленный здесь: https://pastebin.com/CGHUd0za (одинаковые ошибки во всех датододах)
- журнал ошибок мастера giraph вставлен здесь: 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, но я не решил проблемы. Не могли бы вы помочь мне, если я пропустил какой-то важный параметр или, возможно, я использовал его неправильно? Я попытался обобщить значение, передаваемое параметрам netty, с помощью тривиальной формулы nettyFactor*defaultValue, где nettyFactor может быть 1, 2, 3, ... (передается параметром оболочки)
-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", правильно ли использовать 0 МБ для mapreduce.reduce.memory.mb в mapred-site.xml?
2) Чтобы избежать ошибки ClassNotFoundException, я скопировал jar-файл моего приложения giraph и всех jiraph-файлов из $GIRAPH_HOME и $GIRAPH_HOME/lib в $HADOOP_HOME/share/hadoop/yarn/lib. Есть ли лучшее решение?
3) Последнее, но не менее важное: здесь вы можете найти заполненный журнал hadoop / yarn моей программы giraph со следующим графиком http://snap.stanford.edu/data/web-NotreDame.html качестве входных данных. В этом случае применение пряжи переходит в состояние RUNNING UNDEFINED.