Uploaded image for project: 'Spark'
  1. Spark
  2. SPARK-1577

GraphX mapVertices with KryoSerialization

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Major
    • Resolution: Fixed
    • None
    • 1.0.0
    • GraphX
    • None

    Description

      If Kryo is enabled by setting:

      SPARK_JAVA_OPTS+="-Dspark.serializer=org.apache.spark.serializer.KryoSerializer "
      SPARK_JAVA_OPTS+="-Dspark.kryo.registrator=org.apache.spark.graphx.GraphKryoRegistrator  "
      

      in conf/spark_env.conf and running the following block of code in the shell:

      import org.apache.spark.graphx._
      import org.apache.spark.graphx.lib._
      import org.apache.spark.rdd.RDD
      
      val vertexArray = Array(
        (1L, ("Alice", 28)),
        (2L, ("Bob", 27)),
        (3L, ("Charlie", 65)),
        (4L, ("David", 42)),
        (5L, ("Ed", 55)),
        (6L, ("Fran", 50))
        )
      val edgeArray = Array(
        Edge(2L, 1L, 7),
        Edge(2L, 4L, 2),
        Edge(3L, 2L, 4),
        Edge(3L, 6L, 3),
        Edge(4L, 1L, 1),
        Edge(5L, 2L, 2),
        Edge(5L, 3L, 8),
        Edge(5L, 6L, 3)
        )
      
      val vertexRDD: RDD[(Long, (String, Int))] = sc.parallelize(vertexArray)
      val edgeRDD: RDD[Edge[Int]] = sc.parallelize(edgeArray)
      
      val graph: Graph[(String, Int), Int] = Graph(vertexRDD, edgeRDD)
      
      // Define a class to more clearly model the user property
      case class User(name: String, age: Int, inDeg: Int, outDeg: Int)
      
      // Transform the graph
      val userGraph = graph.mapVertices{ case (id, (name, age)) => User(name, age, 0, 0) }
      

      The following block of code works:

      userGraph.vertices.count
      

      and the following block of code generates a Kryo error:

      userGraph.vertices.collect
      

      There error:

      java.lang.StackOverflowError
      	at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:54)
      	at sun.reflect.UnsafeQualifiedObjectFieldAccessorImpl.get(UnsafeQualifiedObjectFieldAccessorImpl.java:38)
      	at java.lang.reflect.Field.get(Field.java:379)
      	at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:552)
      	at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213)
      	at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:501)
      	at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:564)
      	at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213)
      	at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:501)
      	at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:564)
      	at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213)
      	at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:501)
      	at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:564)
      	at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213)
      	at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:501)
      

      Attachments

        Activity

          People

            ankurd Ankur Dave
            jegonzal Joseph E. Gonzalez
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: