Spark-GraphX の操作方法を理解しようとしていますが、常に問題が発生するため、誰かが何を読むべきかなどをアドバイスしてくれるかもしれません。さまざまなサイズのネットワークなどを処理するために必要なメモリ量の説明.
私のテストでは、いくつかのサンプル データセットを使用します。Spark シェルから 1 つのマスター ノード (~16Gb RAM) で実行します。
./bin/spark-shell --master spark://192.168.0.12:7077 --executor-memory 2900m --driver-memory 10g
3 ~ 5 人のワーカー (4Gb RAM を搭載した 1 台のマシンごとに 1 人のワーカー):
./bin/spark-class org.apache.spark.deploy.worker.Worker spark://192.168.0.12:7077
次に、Spark Shell から scala スクリプトを実行します (コンパイルされていません)。
:load /home/ubuntu/spark-1.2.1/bin/script.scala
私はまだ HDFS を使用していません。データセット ファイルを各マシンにコピーしただけです (もちろんパス名は同じです)。zachary club のような小さなネットワークや、さらに大きな 256 Mb までのネットワーク (ドライバー メモリパラメーターを増やした後) では、三角形やウェッジなどを数えることができます。
ここで、750 Mb 以上のネットワークを処理しようとすると、エラーが発生します。たとえば、2 列 (link_from link_to)、750Mb の形式のウィキペディア リンク データセットがあります。それをロードしてみてください:
val graph = GraphLoader.edgeListFile(sc, "graphx/data/dbpidia")
エラーが発生します:
[Stage 0:==============================================> (22 + 1) / 23]
15/04/30 22:52:46 WARN TaskSetManager: Lost task 22.0 in stage 0.0 (TID 22, host-192-168-0-18.openstacklocal): java.lang.ArrayIndexOutOfBoundsException: 1
at org.apache.spark.graphx.GraphLoader$$anonfun$1$$anonfun$apply$1.apply(GraphLoader.scala:83)
at org.apache.spark.graphx.GraphLoader$$anonfun$1$$anonfun$apply$1.apply(GraphLoader.scala:76)
at scala.collection.Iterator$class.foreach(Iterator.scala:727)
at scala.collection.AbstractIterator.foreach(Iterator.scala:1157)
at org.apache.spark.graphx.GraphLoader$$anonfun$1.apply(GraphLoader.scala:76)
at org.apache.spark.graphx.GraphLoader$$anonfun$1.apply(GraphLoader.scala:74)
at org.apache.spark.rdd.RDD$$anonfun$15.apply(RDD.scala:631)
at org.apache.spark.rdd.RDD$$anonfun$15.apply(RDD.scala:631)
at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:35)
at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:280)
at org.apache.spark.CacheManager.getOrCompute(CacheManager.scala:61)
at org.apache.spark.rdd.RDD.iterator(RDD.scala:245)
at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:61)
at org.apache.spark.scheduler.Task.run(Task.scala:56)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:200)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
15/04/30 22:52:47 WARN TaskSetManager: Lost task 22.2 in stage 0.0 (TID 24, host-192-168-0-18.openstacklocal): java.lang.ArrayIndexOutOfBoundsException
実際には、>>1Tb のサイズのデータセットで作業する必要がありますが、小さいデータセットでもエラーが発生します。私は何を間違っていますか?メモリの制限は?>>1Tb ファイルに対してどのような戦略を提案できますか?それらをより適切に保存するにはどうすればよいですか? ありがとう。