我有一个很大的蜂巢表(~90亿条记录和~45GB的兽人格式(。我正在使用 spark sql 对表进行一些分析。但是对此进行任何操作都需要花费太多时间。仅对输入数据框本身进行计数就需要 ~11 分钟才能完成。仅任何一列的最小值、最大值和平均值就需要一个半小时以上才能完成。
我正在处理一个有限的资源集群(因为它是唯一可用的集群(,总共有 9 个执行器,每个执行器有 2 个核心和 5GB 内存,每个执行器分布在 3 个物理节点上。
有没有办法优化这一点,比如说将在同一集群中对每列执行所有聚合函数的时间至少减少到 30 分钟以内,或者增加我的资源是唯一的方法?我个人不太热衷于这样做。 我遇到的一种加快数据框操作的解决方案是缓存它们。但我认为就我而言,这不是一个可行的选择。
我遇到的所有真实场景都使用巨大的集群来承受这种负载。
任何帮助,不胜感激。 我在独立模式下使用 Spark 1.6.0 和 kryo 序列化程序。
sparkSQL中有一些很酷的功能,例如:
群集依据/分发依据/排序依据
Spark 允许您使用类似 SQL 的语言 - HiveQL 编写查询。HiveQL 允许你控制数据的分区,就像我们在 SparkSQL 查询中也可以使用它一样。
分发者
在 Spark 中,数据帧由某个表达式分区,此表达式相等的所有行都位于同一分区上。
SET spark.sql.shuffle.partitions = 2
SELECT * FROM df DISTRIBUTE BY KEY
所以,看看它是如何工作的:
par1: [(1,c), (3,b)]
par2: [(3,c), (1,b), (3,d)]
par3: [(3,a),(2,a)]
这将转换为:
par1: [(1,c), (3,b), (3,c), (1,b), (3,d), (3,a)]
par2: [(2,a)]
排序方式
SELECT * FROM df SORT BY key
对于这种情况,它将如下所示:
par1: [(1,c), (1,b), (3,b), (3,c), (3,d), (3,a)]
par2: [(2,a)]
聚类依据
这是在同一组表达式上使用分布依据和排序依据的快捷方式。
SET spark.sql.shuffle.partitions =2
SELECT * FROM df CLUSTER BY key
注意:这是基本信息,如果有帮助,请告诉我,否则我们可以根据情况和设置使用各种不同的方法来优化您的 Spark 作业和查询。