我有一个配置有12个工作器的presto集群,Java应用程序正在查询该集群。该集群能够执行30个并发请求(如果有更多并发请求,它们将排队)。
应用程序可能会发送大约80-100个不同的查询,我希望这些查询将由集群处理。
问题::顺序执行查询要比并行执行快得多。
例如,如果我依次运行100个查询,则每个查询需要1到12秒的时间才能完成,而所有查询都将在2分钟左右内完成。但是,如果我同时启动所有这些程序,则大约需要8-12分钟才能完成所有程序。在极端情况下,最多可能需要30分钟。
如果我在presto控制台上查看,我看到大多数查询都被阻止,实际上只有1-3个处于运行状态。
很遗憾,我无法发布任何查询。它们通常访问不同的模式(在一个查询中最多可以访问6个),它们充满了联接和嵌套查询。同时,大多数代码都写在presto best practices之后。
问题:如何提高效果?至少我应该调查哪些领域以找出根本原因?
以下是最慢查询之一的一些指标(可能是数字会告诉您一些信息)。
Resource Utilization Summary
CPU Time 8.42m
Scheduled Time 26.04m
Blocked Time 4.77d
Input Rows 298M
Input Data 9.94GB
Raw Input Rows 323M
Raw Input Data 4.34GB
Peak Memory 10.18GB
Memory Pool reserved
Cumulative Memory 181G seconds
Timeline
Parallelism 477
Scheduled Time/s 1.47K
Input Rows/s 281K
Input Bytes/s 9.60MB
Memory Utilization 0B
答案 0 :(得分:0)
自己弄清楚问题。
Presto是一个分布式SQL查询引擎。这里的关键词是分布式。它保证了,如果您运行查询,查询将在工作进程中高效地分布并以高速度执行。
执行并行查询并期望Presto将弄清楚如何有效地并行处理并行查询是一种误用。不幸的是,它更像关系数据库方法,在Presto中不起作用。