我们在Scala 2.11中编写了一个spark应用程序,它运行在Spark 2.1.0独立集群上 . 根据设计/要求,我们构造了具有许多直接列的行对象,如100,并且嵌套列很少,其中一些嵌套列也很重,就像具有20k到30k的Sequence一样 . 还有匹配的案例类可以与Spark数据集一起使用 .
For eg:
Row(column_01,
column_02...
.....column_150,
column_151 = Seq,
column_152 = Seq...column_160 = Seq)
其中一些Seq的大小为20k到30k .
我很少担心行对象的冗长/重度属性如何影响性能?我们可以对代码进行哪些优化以提高性能?群集调优的任何建议?
我们已经在进行以下优化 -
-
增加分区数量
-
使用snappy压缩的镶木地板文件格式
1 回答
Spark对重行没有特别的问题 . 我们在深层嵌套的行中管理数PB的数据,数百个字段没有问题 .
有几点需要注意:
在可能的情况下,首选结构优于 Map ,因为结构在Parquet中自动展平,而 Map 实例化则更复杂 .
如果您需要在大多数情况下连续处理所有数据并且可以专门使用数据集,那么通常会比使用数据框获得更好的性能,并且值得投资于案例类以启用数据集编码/解码 .
对于只需要一点数据的查询,运行
df.explain()
以查看Spark是否没有拉太多,例如,当只需要结构的一个字段时整个结构 . 在撰写本文时,存在一些问题 . 通常可以通过重写转换/查询来明确选择首先需要的最小数据集 .尽可能避免使用嵌套数组,因为它们的处理会变得复杂 . 数组本身不是问题 .