1

我有一个大型配置单元表(约 90 亿条记录和约 45GB 的兽人格式)。我正在使用 spark sql 对表进行一些分析。但是对此进行任何操作需要太多时间。只需对输入数据框本身进行计数就需要大约 11 分钟才能完成。仅任何一列的 min、max 和 avg 都需要超过一个半小时才能完成。

我正在研究一个资源有限的集群(因为它是唯一可用的集群),共有 9 个执行程序,每个执行程序有 2 个核心,每个执行程序有 5GB 内存,分布在 3 个物理节点上。

有什么方法可以优化这一点,比如将同一集群上每列上所有聚合函数的时间缩短到至少 30 分钟以内,或者增加我的资源是唯一的方法?我个人不太热衷于这样做。我遇到的一种加快数据帧操作的解决方案是缓存它们。但在我的情况下,我认为这不是一个可行的选择。

我遇到的所有现实世界场景都使用巨大的集群来处理这种负载。

任何帮助表示赞赏。我在独立模式下使用 spark 1.6.0 和 kryo 序列化程序。

4

1 回答 1

1

sparkSQL 中有一些很酷的功能,例如:

集群方式/分布方式/排序方式

Spark 允许您使用类似 SQL 的语言 - HiveQL 编写查询。HiveQL 让您可以控制数据的分区,就像我们可以在 SparkSQL 查询中使用它一样。

分发者

在 spark 中,Dataframe 由某个表达式分区,该表达式相等的所有行都在同一个分区上。

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 作业和查询。

于 2017-07-12T20:08:19.447 回答