什么时候在Spark中使用Kryo序列化?

pyt*_*nic 9 scala kryo apache-spark rdd

我已经使用conf.set("spark.rdd.compress","true")和压缩RDD了persist(MEMORY_AND_DISK_SER).使用Kryo序列化会使程序更高效,还是在这种情况下没用?我知道Kryo用于以更有效的方式在节点之间发送数据.但是,如果已传输的数据已经压缩,是否需要?

Tim*_*Tim 8

您描述的两个RDD状态(压缩和持久化)都使用序列化.当您持久保存RDD时,您将序列化并将其保存到磁盘(在您的情况下,也会压缩序列化输出).你是对的,序列化也用于shuffle(在节点之间发送数据):任何时候数据需要离开JVM,无论是去本地磁盘还是通过网络,都需要序列化.

Kryo是一个经过显着优化的序列化程序,并且几乎可以为所有内容提供比标准java序列化程序更好的性能.在你的情况下,你可能实际上已经在使用Kryo了.您可以检查spark配置参数:

"spark.serializer"应为"org.apache.spark.serializer.KryoSerializer".

如果不是,那么您可以在内部设置:

conf.set( "spark.serializer", "org.apache.spark.serializer.KryoSerializer" )
Run Code Online (Sandbox Code Playgroud)

关于你的最后一个问题("它甚至需要吗?"),很难就此提出一般性的主张.Kryo优化了沟通数据的一个缓慢步骤,但完全可能是在你的用例中,其他人正在阻止你.但是尝试Kryo并对差异进行基准测试并没有什么缺点!


San*_*hit 5

Kryo 序列化是一种更优化的序列化技术,因此您可以使用它来序列化 RDD 或 Dataframe 闭包中使用的任何类。Kryo序列化的一些具体使用信息见下文:

  1. 在 RDD 或数据帧闭包内序列化第三方非序列化类时使用
  2. 您想要使用高效的序列化技术
  3. 如果您因某些类而遇到序列化错误,您可以使用 Kryo 序列化器注册该类