Question Pourquoi Spark est-il moins performant lors de l'utilisation de la sérialisation Kryo?


J'ai activé la sérialisation Kryo pour mon travail Spark, activé l'enregistrement et demandé que tous les types soient enregistrés.

val conf = new SparkConf()
conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
conf.set("spark.kryo.registrationRequired", "true")
conf.registerKryoClasses(classes)
conf.registerAvroSchemas(avroSchemas: _*)

Les performances du job Wallclock-Time du travail se sont dégradées d’environ 20% et le nombre d’octets mélangés a augmenté de près de 400%.

Cela me semble vraiment surprenant compte tenu de la Documentation SparkLa suggestion que Kryo devrait être mieux.

Kryo est nettement plus rapide et compact que la sérialisation Java (souvent jusqu'à 10x)

J'ai invoqué manuellement le serialize méthode sur les instances de Spark org.apache.spark.serializer.KryoSerializer et org.apache.spark.serializer.JavaSerializer avec un exemple de mes données. Les résultats étaient cohérents avec les suggestions de la documentation Spark: Kryo a produit 98 octets; Java a produit 993 octets. C'est vraiment une amélioration de 10 fois.

Un facteur de confusion possible est que les objets qui sont sérialisés et mélangés implémentent le GenericRecord interface. J'ai essayé d'enregistrer les schémas Avro dans le SparkConf, mais cela n'a montré aucune amélioration.

J'ai essayé de faire de nouvelles classes pour mélanger les données qui étaient simples Scala case classes, ne comprenant aucune des machines Avro. Cela n'a pas amélioré les performances de lecture aléatoire ou le nombre d'octets échangés.

Le code Spark se résume à ce qui suit:

case class A(
    f1: Long,
    f2: Option[Long],
    f3: Int,
    f4: Int,
    f5: Option[String],
    f6: Option[Int],
    f7: Option[String],
    f8: Option[Int],
    f9: Option[Int],
    f10: Option[Int],
    f11: Option[Int],
    f12: String,
    f13: Option[Double],
    f14: Option[Int],
    f15: Option[Double],
    f16: Option[Double],
    f17: List[String],
    f18: String) extends org.apache.avro.specific.SpecificRecordBase {
  def get(f: Int) : AnyRef = ???
  def put(f: Int, value: Any) : Unit = ???
  def getSchema(): org.apache.avro.Schema = A.SCHEMA$
}
object A extends AnyRef with Serializable {
  val SCHEMA$: org.apache.avro.Schema = ???
}

case class B(
    f1: Long
    f2: Long
    f3: String
    f4: String) extends org.apache.avro.specific.SpecificRecordBase {
  def get(field$ : Int) : AnyRef = ???
  def getSchema() : org.apache.avro.Schema = B.SCHEMA$
  def put(field$ : Int, value : Any) : Unit = ???
}
object B extends AnyRef with Serializable {
  val SCHEMA$ : org.apache.avro.Schema = ???
}

def join(as: RDD[A], bs: RDD[B]): (Iterable[A], Iterable[B]) = {
  val joined = as.map(a => a.f1 -> a) cogroup bs.map(b => b.f1 -> b)
  joined.map { case (_, asAndBs) => asAndBs }
}

Avez-vous une idée de ce qui pourrait se passer ou comment je pourrais obtenir les meilleures performances disponibles chez Kryo?


15
2018-01-09 17:05


origine


Réponses:


Si votre taille d'enregistrement unique est trop petite et que le nombre d'enregistrements est énorme, votre travail risque d'être ralenti. Essayez d'augmenter la taille de la mémoire tampon et de voir si elle s'améliore.

Essayez ci-dessous si ce n'est pas déjà fait ..

val conf = new SparkConf()
  .set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
  // Now it's 24 Mb of buffer by default instead of 0.064 Mb
  .set("spark.kryoserializer.buffer.mb","24") 

Ref:https://ogirardot.wordpress.com/2015/01/09/changing-sparks-default-java-serialization-to-kryo/


1
2018-05-24 06:20



Comme vous avez des RDD à haute cardinalité, la diffusion / diffusion de la liaison de hachage semble malheureusement hors de portée.

Votre meilleur meilleur est de se fondre() vos DDR avant de vous joindre. Voyez-vous un décalage important dans vos temps de battage? Si c'est le cas, vous pouvez vouloir fusionner avec shuffle = true.

Enfin, si vous avez des RDD de structures imbriquées (par exemple, JSON), cela vous permettra parfois de contourner les mélanges. Découvrez les diapositives et / ou la vidéo ici pour une explication plus détaillée.


0
2018-04-30 16:59