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.
OK, also wo sind diese Klassen definiert? Du versuchst nicht, Python-Klassen bei Kryo zu registrieren, oder? – zero323
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
Nichts. Kryo ist ein Java (JVM) -Serialisierungs-Framework, kein Python-Framework. – zero323