Kryo在SparkSQL中有帮助吗?

时间:2018-03-14 06:15:58

标签: apache-spark apache-spark-sql

Kryo通过高效的序列化方法帮助提高Spark应用程序的性能 我想知道,如果Kryo会帮助SparkSQL,我应该如何使用它 在SparkSQL应用程序中,我们会执行很多基于列的操作,例如df.select($"c1", $"c2"),而DataFrame Row的架构并不是静态的。
不确定如何为用例注册一个或多个序列化程序类。

例如:

case class Info(name: String, address: String)
...
val df = spark.sparkContext.textFile(args(0))
         .map(_.split(','))
         .filter(_.length >= 2)
         .map {e => Info(e(0), e(1))}
         .toDF
df.select($"name") ... // followed by subsequent analysis
df.select($"address") ... // followed by subsequent analysis

我认为为每个select定义案例类并不是一个好主意 或者,如果我注册Info

,请注意registerKryoClasses(Array(classOf[Info]))

2 个答案:

答案 0 :(得分:5)

根据Spark's documentation,SparkSQL不使用Kryo或Java序列化。

  

数据集与RDD类似,但是,它们使用专门的编码器来序列化对象以便通过网络进行处理或传输,而不是使用Java序列化或Kryo。虽然编码器和标准序列化都负责将对象转换为字节,但编码器是动态生成的代码,并使用一种格式,允许Spark执行许多操作,如过滤,排序和散列,而无需将字节反序列化回对象。

它们比Java或Kryo轻得多,这是预期的(序列化是一个更可优化的工作,比如一个3行长和2个整数),而不是类,它的版本描述,它的内在变量......)并且必须实现它。

缺点是,目前,为自定义非产品类创建编码器有些限制(请参阅有关用户定义类型的讨论),例如,从这里开始:Does Apache spark 2.2 supports user-defined type (UDT)?

答案 1 :(得分:0)

您可以通过在SparkConf上或在传递给 spark-submit 命令的自定义属性文件中将spark.serializer属性设置为org.apache.spark.serializer.KryoSerializer来将序列化程序设置为kryo通过 - properties-file 标志。

配置Kryo序列化程序时,Spark会在节点之间传输数据时透明地使用Kryo。因此,您的Spark SQL语句应该自动继承性能优势。