当前位置: 首页 > 知识库问答 >
问题:

spark kryo寄存器泛型类

贺栋
2023-03-14
import com.github.plokhotnyuk.rtree2d.core._
import EuclideanPlane._

val box1 = entry(1.0f, 1.0f, 2.0f, 2.0f, "Box 1")
val box2 = entry(2.0f, 2.0f, 3.0f, 3.0f, "Box 2")
val entries = Seq(box1, box2)

val rtree = RTree(entries)
val broadcastedIndex = spark.sparkContext.broadcast(rtree)

强制kryo序列化时失败,即使用以下配置启动火花时失败:

.set("spark.serializer", classOf[KryoSerializer].getCanonicalName)
.set("spark.kryo.registrationRequired", "true")

由于未注册RTreeNode类。到目前为止,一切顺利。

问题出现时尝试:-使用KryoSerializer但不强制kryo:火花卡住/不继续操作-尝试注册类:

Class is not registered: com.github.plokhotnyuk.rtree2d.core.RTree

可通过以下方式固定:

kryo.register(Class.forName("com.github.plokhotnyuk.rtree2d.core.RTreeNode"))

但是,类未注册:com.github.plokhotnyuk.rtree2d.core.RTree[]

kryo.register(classOf[scala.Array[com.github.plokhotnyuk.rtree2d.core.RTreeNode[A]]])

编译失败,因为当尝试在com.github.plokhotnyuk.rtree2d.core命名空间中创建自定义kryo注册器以访问私有类时,我无法注册要触发的通用RTreeNode

如何在不指定具体实现的情况下注册泛型类,或者在返回java序列化时防止spark陷入困境?

注意,如果根本不使用kryo,它就可以正常工作。

数组类的Spark Kryo寄存器

kryo.register(Array.newInstance(Class.forName("com.github.plokhotnyuk.rtree2d.core.RTreeNode"), 0).getClass())

不幸的是,在java中,我无法在scala中编译它。

共有1个答案

韦安怡
2023-03-14

请尝试懒惰和暂时的组合。

Scala lazy val denotes a field that will only be calculated once it is accessed for the first time and is then stored for future reference.

With @transient on the other hand one can denote a field that shall not be serialized.

reference: https://stackoverflow.com/questions/34769220/difference-when-serializing-a-lazy-val-with-or-without-transient
 类似资料:
  • Vim提供了许多寄存器。可以将这些寄存器用作多个剪贴板。使用多个文件时,此功能非常有用。在本章中,将讨论以下主题内容 - 复制寄存器中的文本 粘贴寄存器中的文本 列出可用的寄存器 寄存器类型 1. 复制寄存器中的文本 对于复制,可以使用普通的命令,即并将其存储在寄存器中,可以使用以下语法 - 例如,要复制寄存器中的文本,请使用以下命令 - 2. 粘贴寄存器中的文本 从寄存器粘贴文本 - 例如,下面

  • 当前的Perl 5虚拟机是一台堆栈机器。 它通过将操作保持在堆栈上来传递操作之间的值。 操作将值加载到堆栈上,执行他们需要执行的操作并将结果放回堆栈。 这很容易使用,但速度很慢。 要将两个数字相加,您需要执行三次堆栈推送和两次堆栈弹出。 更糟糕的是,堆栈必须在运行时增长,这意味着在您不想分配内存时分配内存。 因此,Parrot将打破虚拟机的既定传统,并使用寄存器架构,更类似于真实硬件CPU的架构。

  • 处理器操作主要涉及处理数据。 该数据可以存储在存储器中并从其上访问。 然而,从存储器读取数据和将数据存储到存储器中会降低处理器的速度,因为它涉及通过控制总线向存储器存储单元发送数据请求并通过相同通道获取数据的复杂过程。 为了加速处理器操作,处理器包括一些内部存储器存储位置,称为registers 。 寄存器存储数据元素以便处理而无需访问存储器。 处理器芯片内置有限数量的寄存器。 处理器寄存器 IA

  • 80386中应用程序员感兴趣的有16个寄存器。如图2-5所示,这些寄存器被分成以下几个基本类型: 1.通用寄存器。这些32为通用寄存器主要用来数学和逻辑运算。 2.段寄存器。这些特殊目的寄存器允许系统软件设计者选择平坦模式或是段模式。这六个寄存器决定了,任何时候,哪段存储器可以被寻址。 3.状态和指令寄存器。这些特殊目的寄存器用于记录和改变80386处理器状态的一些特征。 2.3.1 通用寄存器

  • Intel 80386寄存器 这里假定读者对80386 CPU有一定的了解,所以只作简单介绍。80386的寄存器可以分为8组:通用寄存器,段寄存器,指令指针寄存器,标志寄存器,系统地址寄存器,控制寄存器,调试寄存器,测试寄存器,它们的宽度都是32位。一般程序员看到的寄存器包括通用寄存器,段寄存器,指令指针寄存器,标志寄存器。 General Register(通用寄存器):EAX/EBX/ECX/

  • 寄存器这个概念,在之前的Vim复制、删除章节已经和大家提过。想必大家应该还有印象。我们根据那节场景讲了无名寄存器和复制专用寄存器。本节,我们就更加深入了解寄存器的概念和使用场景。 1. 寄存器概念 Vim 中的寄存器简单来说就是用于保存文本的容器。我们对不同场景划分了不同的寄存器,或者说容器。主要用于 Vim 使用中临时保存一些数据。 之前章节中我们我们提到过这个概念,并且对 Windows 和