我有一个大的蜂巢表(约90亿条记录和~45GB的orc格式)。我正在使用spark sql对表进行一些分析。但是这需要花费太多时间对此进行任何操作。只需输入数据框本身需要大约11分钟才能完成。而任何一列上的min,max和avg都需要一个半小时才能完成。
我正在开发一个有限的资源集群(因为它是唯一可用的集群),共有9个执行器,每个执行器有2个核心和5GB内存,分布在3个物理节点上。
有没有办法优化这个,比如把每个列的所有聚合函数的时间减少到至少30分钟至少与同一个集群,或者提升我的资源是唯一的方法?我个人不太热衷于这样做。 我遇到的加速数据帧操作的一个解决方案是缓存它们。但我不认为这是一个可行的选择。
我遇到的所有真实场景都使用了巨大的集群来实现这种负载。
感谢任何帮助。 我在独立模式下使用spark 1.6.0和kryo序列化程序。
答案 0 :(得分:0)
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
注意:这是基本信息,请告诉我这是否有帮助,否则我们可以根据情况和设置使用各种不同的方法来优化您的火花作业和查询。