当前位置: 首页 > 知识库问答 >
问题:

带聚合函数的Spark SQL的内存消耗

袁奇逸
2023-03-14

我有一个配置单元表,只有很少的bigint或string列,超过3800万行,总大小略大于1GB,测试环境是一个小型独立集群,有4个工作节点,每个都有8GB内存,Spark 1.4。在Spark sql shell中,我尝试执行一个sql

create table bla as select user_id, brand_id, sum(cnt) from foo group by user_id, brand_id

有好几次,工作总是停留在第一阶段,几乎没有任务悬而未决。

GC报告似乎表明没有足够的内存来存储临时对象,进程正在等待完整的GC完成。

一个挂起节点的GC输出:

4572.821:[GC[PSYoungGen:1707488K-

我的问题是:我的sql真的需要超过32GB的内存来运行1GB的数据吗?还是有我刚刚错过的快速优化设置?如果我在查询中避免求和/平均值,我可以用更少的记录量,甚至是完整的数据成功地执行sql,如

select user_id, brand_id, count(cnt)

select user_id, brand_id, concat(xx)

GC之后,每个节点上的所有工作和内存占用永远不会超过1或2GB。

第二个问题:初始阶段总是使用10个分区,如何更改并行性?

谢谢万春

共有2个答案

全兴运
2023-03-14

针对您的具体问题:

>

有两种方法可以更改并行度。首先,您可以更改进审量文件。其次,您可以使用re分区(num分区)显式重新分区数据。在RDD文档中查找此方法。

您可以根据现有分区的数量以编程方式重新分区,以达到所需的并行级别或数据文件粒度,例如。,

val df = ctx.jsonFile("file://...")
df.repartition(10 * df.rdd.partitions.size)

通过使用df.rdd.partitions.size,您还可以根据集群大小动态调整分区数量,例如,获取分区数量,例如,执行器CPU数量的4倍等。

如果您遇到内存问题,增加分区数量是找到在集群约束内工作的处理管道的良好起点。

还有其他与内存相关的优化:

>

  • 如果在reduce阶段内存不足,可能需要增加spark。洗牌内存提取

    如果您的操作无法从缓存中受益,您可以减少spark.storage.memoryFraction

    有关配置Spark的更多信息。

  • 东门越
    2023-03-14

    我只是想更新一下,我真的相信当前的spark版本在一些聚合函数上的实现不是很理想。e、 g.如果在查询中用count()或max()替换sum(),那么查询将在30-40秒内成功返回。最终,我让sum()查询以双倍的工作线程工作,因此使用双倍的内存,作业在3分钟内完成。出于对钨的好奇,我建造了spark1。5在源代码外,启动在spark1中花费3分钟的相同查询。4,完成时间为40到55秒。万春,干杯

     类似资料:
    • 问题内容: 采集: 我的问题是,是否可以在聚合查询中调用方法? 如果可能的话,它的语法是什么?结果: 在我的实际应用程序中,每个文档有10个布尔标志。如果用户获得了此文档,我想转换这些标志并给它们一个含义(对于用户)。例如认为文件代表轮胎。 总而言之,我想说的是,如果 在以下情况下需要更换轮胎(破损或更换): 当文档返回给用户时,应删除标记。取而代之的是,我们有一个状态字段,说明轮胎是正常的还是损

    • 如何使用规范编写下面查询 当我们使用Specification时,即使在multiselect中提到了count(),也没有选择count()。 为什么JPA中的multiselect方法不起作用

    • 查看SQL的ANSI聚合函数,我找不到字符串的任何东西。但是,每个数据库似乎都有自己的数据库,例如MySQL和Oracle的GROUP_CONCAT和LISTAGG,这使得可移植性有点困难。我是不是缺了什么?这是有原因的吗?

    • 我正在使用查询DSL的Spring数据JPA,并试图在条件中使用求和函数,因为我正在使用分页,所以我必须首先获得计数。所以我有如下的Java代码:- 它创建这样的查询:- 我得到。 上述查询在中也不起作用,因为sum函数不能与count-in-where条件一起使用。当我必须先进行计数,然后再获取真实数据时,我不知道如何处理这样的问题。有人能帮我解决这个问题的方法吗。 请不要建议注释,因为我不能使

    • 我需要聚合一个基于1分钟时间间隔的数据集。当我尝试此操作时,它会抛出错误: 我的数据集如下所示 org.apache.spark.sql.AnalysisException:无法解析(datetime,value)中的列名“60秒”;在org.apache.spark.sql.dataset$$anonfun$resolve$1.apply(dataset.scala:216)在org.apach

    • 主要内容:1.COUNT函数,2. SUM函数,3. AVG函数,4. MAX函数,5. MIN函数SQL聚合函数用于对表的单个列的多行执行计算,它只返回一个值。它还用于汇总数据。 SQL聚合函数的类型,如下图所示 - 接下来,我们一个个地讲解。 1.COUNT函数 函数用于计算数据库表中的行数,它可以在数字和非数字数据类型上工作。 函数使用返回指定表中所有行的计数。 包函重复值和值。 语法 假设有一个表,它的结构和数据如下所示 - PRODUCT COMPANY QTY RATE COST I