Apache spark Apache Spark 2.1-行对象的Scala冗长/繁重属性

Apache spark Apache Spark 2.1-行对象的Scala冗长/繁重属性,apache-spark,apache-spark-sql,parquet,apache-spark-2.0,Apache Spark,Apache Spark Sql,Parquet,Apache Spark 2.0,我们在Scala 2.11中编写了一个spark应用程序,它运行在spark 2.1.0独立集群上。根据设计/要求,我们构建了行对象,该对象具有许多直接列(如100列),并且很少有嵌套列,其中一些嵌套列也很重,如具有20k到30k的序列。还有与Spark数据集相匹配的case类 例如: Row(column_01, column_02... .....column_150, column_151 = Seq, column_152 = Seq..

我们在Scala 2.11中编写了一个spark应用程序,它运行在spark 2.1.0独立集群上。根据设计/要求,我们构建了行对象,该对象具有许多直接列(如100列),并且很少有嵌套列,其中一些嵌套列也很重,如具有20k到30k的序列。还有与Spark数据集相匹配的case类

例如:

Row(column_01,
    column_02...
    .....column_150, 
        column_151 = Seq,
        column_152 = Seq...column_160 = Seq)
其中一些Seq的尺寸为20k至30k

我很少关心行对象的这种冗长/繁重的属性如何影响性能?我们可以对代码进行哪些优化以提高性能?对集群调优有什么建议吗

我们已经在进行以下优化-

  • 增加分区的#
  • 使用拼花地板文件格式和snappy压缩

  • Spark对于重行没有特别的问题。我们可以管理数PB的数据,这些数据包含数百个字段,嵌套得很深

    有几件事需要记住:

  • 在可能的情况下,优先选择结构而不是贴图,因为结构在拼花地板中会自动展平,而贴图实例化起来更复杂

  • 如果您大部分时间都需要处理一行中的所有数据,并且可以独占使用数据集,则通常会获得比使用数据帧更好的性能,并且值得投资case类来启用数据集编码/解码

  • 对于只需要少量数据的查询,请运行
    df.explain()
    ,查看Spark是否拉得太多,例如,当只需要结构的一个字段时,就需要整个结构。在撰写本文时,这方面存在一些问题。通常可以通过重写转换/查询来解决这些问题,以首先显式地选择所需的最小数据集

  • 尽可能避免嵌套数组,因为它们的处理可能会变得复杂。阵列本身不是问题


  • 您使用的是柱状拼花,因此可以使用dataframe语法仅选择需要处理和操作的列。如果使用“dataframe.as[class]”语法使用dataset,则会对整行进行反序列化,如果列太多,则开销会很大。您也可以使用dataset选择几个列,但需要将其转换为具有这些属性的类