Serialization 如何在ApacheSpark中向Kryo序列化程序注册类?
我正在使用Spark 1.6.1和Python。使用PySpark时如何启用Kryo序列化 我在spark-default.conf文件中有以下设置:Serialization 如何在ApacheSpark中向Kryo序列化程序注册类?,serialization,apache-spark,pyspark,kryo,Serialization,Apache Spark,Pyspark,Kryo,我正在使用Spark 1.6.1和Python。使用PySpark时如何启用Kryo序列化 我在spark-default.conf文件中有以下设置: spark.eventLog.enabled true spark.eventLog.dir //local_drive/sparkLogs spark.default.parallelism 8 spark.locality.wait.node 5s
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
以及以下错误:
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)
我知道“Kryo不会对PySpark产生重大影响,因为它只是将数据存储为byte[]对象,即使使用Java也可以快速序列化。但是,设置spark.serializer而不尝试注册任何类可能是值得的”。但是,我需要注册这些类
提前谢谢 这是不可能的。是一个Java(JVM)序列化框架。它不能与Python类一起使用。为了序列化Python对象,PySpark正在使用Python序列化工具,包括标准模块和。您可以在中找到有关PySpark序列化的其他信息
Sp虽然在使用PySpark时可以启用Kryo序列化,但这不会影响Python对象的序列化方式。它将仅用于Java或Scala对象的序列化。OK,那么这些类是在哪里定义的呢?你没有试着向Kryo注册Python类,是吗?我注册了,那些计时、谓词等是我的Python类的名称。我通过阅读了解到我必须注册我的课程。我从你的评论中怀疑我错了,但是我应该在那里写些什么呢?我试图理解它,并在文档中找到解决方案或程序,但我仍然不明白。什么都没有。Kryo是一个Java(JVM)序列化框架,而不是Python框架。它是可以与PySpark一起使用的JVM,我只是不知道如何使用。不,它不能。当使用PySpark时,Kryo可以用来序列化Java对象,这与序列化Python对象不同。are
PySpark.{ml,mllib}.linalg.Vectors
Java/scala-objects-under-the-hood?@εόφιλοορτίΔηςNo,但是可以在某些上下文中透明地映射到JVM对象。所以在提交pyspark作业时设置--conf spark.serializer=org.apache.spark.serializer.KryoSerializer
并没有真正使用Kryo序列化程序?
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)