2016-06-04 5 views
2

Ich benutze Spark 1.6.1 und Python. Wie kann ich die Kryo-Serialisierung bei der Arbeit mit PySpark aktivieren?Wie kann ich Kurse in Kryo Serializer in Apache Spark registrieren?

Ich habe folgende Einstellungen in der Funken default.conf Datei:

spark.eventLog.enabled    true 
spark.eventLog.dir     //local_drive/sparkLogs 
spark.default.parallelism   8 
spark.locality.wait.node   5s 
spark.executor.extraJavaOptions -XX:+UseCompressedOops 
spark.serializer     org.apache.spark.serializer.KryoSerializer 
spark.kryo.classesToRegister  Timing, Join, Select, Predicate, Timeliness, Project, Query2, ScanSelect 
spark.shuffle.compress    true 

Und der folgende Fehler:

py4j.protocol.Py4JJavaError: An error occurred while calling o35.load. 
: org.apache.spark.SparkException: Failed to register classes with Kryo 
at org.apache.spark.serializer.KryoSerializer.newKryo(KryoSerializer.scala:128) 
at org.apache.spark.serializer.KryoSerializerInstance.borrowKryo(KryoSerializer.scala:273) 
at org.apache.spark.serializer.KryoSerializerInstance.<init>(KryoSerializer.scala:258) 
at org.apache.spark.serializer.KryoSerializer.newInstance(KryoSerializer.scala:174) 

Caused by: java.lang.ClassNotFoundException: Timing 
at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
at java.lang.Class.forName0(Native Method) 
at java.lang.Class.forName(Class.java:274) 
at org.apache.spark.serializer.KryoSerializer$$anonfun$newKryo$4.apply(KryoSerializer.scala:120) 
at org.apache.spark.serializer.KryoSerializer$$anonfun$newKryo$4.apply(KryoSerializer.scala:120) 
at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33) 
at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:108) 
at org.apache.spark.serializer.KryoSerializer.newKryo(KryoSerializer.scala:120) 

Die Hauptklasse enthält (Query2.py):

from Timing import Timing 
from Predicate import Predicate 
from Join import Join 
from ScanSelect import ScanSelect 
from Select import Select 
from Timeliness import Timeliness 
from Project import Project 

conf = SparkConf().setMaster(master).setAppName(sys.argv[1]).setSparkHome("$SPARK_HOME") 
sc = SparkContext(conf=conf) 
conf.set("spark.kryo.registrationRequired", "true") 
sqlContext = SQLContext(sc) 

Ich weiß, dass "Kryo keinen großen Einfluss auf PySpark haben wird, weil es nur Daten als byte [] Objekte speichert, die sind auch mit Java schnell zu serialisieren. Aber es kann einen Versuch wert sein spark.serializer zu setzen und nicht versuchen, alle Klassen registrieren“(Matei Zaharia, 2014). Ich brauche aber die Klassen registrieren.

Vielen Dank im Voraus.

+0

OK, also wo sind diese Klassen definiert? Du versuchst nicht, Python-Klassen bei Kryo zu registrieren, oder? – zero323

+0

Ich tat, diese Timing, Prädikat, usw., sind die Namen meiner Python-Klassen. Ich verstand das, indem ich las, dass ich meine Klassen registrieren musste. Ich vermute durch deinen Kommentar, dass ich falsch liege, aber was soll ich dann dort schreiben? Ich habe versucht, es zu verstehen und die Lösung oder Vorgehensweise in der Dokumentation zu finden, aber ich verstehe es immer noch nicht. – User2130

+0

Nichts. Kryo ist ein Java (JVM) -Serialisierungs-Framework, kein Python-Framework. – zero323

Antwort

4

Es ist nicht möglich. Kryo ist eine Java (JVM) Serialisierung Rahmen. Es kann nicht mit Python-Klassen verwendet werden. Python-Objekt PySpark Um zu serialisiert ist Tools, einschließlich Standard pickle Modul und improved version von coludpickle Python Serialisierung verwenden. Sie können zusätzliche Informationen über PySpark Serialisierung in Tips for properly using large broadcast variables? finden.

Sp, während Sie Kryo seria aktivieren können Bei der Arbeit mit PySpark hat dies keine Auswirkungen auf die Art und Weise, wie Python-Objekte serialisiert werden. Es wird nur für die Serialisierung von Java- oder Scala-Objekten verwendet.

+0

sind 'pyspark. {Ml, mllib} .linalg.Vectors 'java/scala Objekte unter der Haube? –

+1

@ ΘεόφιλοΜΜορρατίδης Nein, kann jedoch in bestimmten Kontexten transparent auf JVM-Objekte abgebildet werden. – zero323