一、Presto界面几种查询状态
-
QUEUED –查询已被接受,正在等待执行。
-
PLANNING –正在计划查询。
-
STARTING –查询执行正在启动。
-
RUNNING –查询至少有一个正在运行的任务。
-
BLOCKED –查询被阻止,正在等待资源(缓冲区空间,内存,拆分等)。
-
FINISHING –查询正在完成(例如,自动提交查询的提交)。
-
FINISHED –查询已完成执行,并且所有输出均已使用。
-
FAILED –查询执行失败。
注意:BLOCKED状态是正常的,但如果持续很长时间,应该进行调查。它有许多潜在原因:内存不足或拆分,磁盘或网络I / O瓶颈,数据偏斜(所有数据都流向少数几个工作人员),缺乏并行性(仅几个工作人员可用)或计算阶段昂贵在给定阶段之后进行查询。此外,BLOCKED如果客户端处理数据的速度不够快(与“ SELECT *”查询相同),则查询可以处于状态。
二、Presto的jvm设置
以下内容会对诊断GC问题会有帮助:
-XX:+PrintGCApplicationConcurrentTime
-XX:+PrintGCApplicationStoppedTime
-XX:+PrintGCCause
-XX:+PrintGCDateStamps
-XX:+PrintGCTimeStamps //每次GC时会打印程序启动后至GC发生的时间戳。
-XX:+PrintGCDetails //打印GC时的内存,并且在程序结束时打印堆内存使用情况
-XX:+PrintReferenceGC //用来跟踪系统内的(softReference)软引用,(weadReference)弱引用,(phantomReference)虚引用,显示引用过程。弱引用,软引用及虚引用对GC的影响
-XX:+PrintClassHistogramAfterFullGC
-XX:+PrintClassHistogramBeforeFullGC
-XX:PrintFLSStatistics=2
-XX:+PrintAdaptiveSizePolicy
-XX:+PrintSafepointStatistics
-XX:PrintSafepointStatisticsCount=1
三、通用配置
1.join-distribution-type
- 类型:string
- 允许值:AUTOMATIC,PARTITIONED,BROADCAST
- 默认值:PARTITIONED
partition Presto使用hash来进行分布式join。
broadcast Presto会将右边的表将全部数据send到各个worker和左边的表(每个worker持有一部分左边表的数据)进行关联查询。
automatic Presto会根据成本决定那种分配类型是最佳的。它还将考虑将左右输入切换到联接。如果无法计算成本,那么就会默认使用哈希。
partition 和 broadcast的区别:
partition是使用哈希连接,可能比广播连接要慢,但允许大表的连接。
如果右表比左表小的多,广播连接会很快。
注意:广播联接要求过滤后联接右侧的表适合每个节点上的内存,而分布式联接只需要适合所有节点上的分布式内存。
2.redistribute-writes
- 类型:boolean
- 默认值:true
此属性允许在写入之前重新分配数据。通过在群集中的各个节点之间散列数据,可以消除写入时数据偏斜对性能的影响。当已知输出数据集没有发生数据倾斜时,可以禁用此功能,以避免在网络上散列和重新分配所有数据的开销。也可以使用redistribute_writessession属性在每个查询的基础上进行指定。
四、内存管理配置
query.max-memory-per-node
- 类型:data size
- 默认值:JVM max memory * 0.1
这是工作程序上使用的最大用户内存量。用户内存是在执行期间分配给可直接归因于用户查询或由用户查询控制的事物的。例如,在执行期间建立的哈希表使用的内存,在排序期间使用的内存等。当对任何工作程序的查询的用户内存分配达到此限制时,它将被杀死。
query.max-total-memory-per-node
- 类型:data size
- 默认值:JVM max memory * 0.3
这是查询可在工作程序上使用的最大用户和系统内存量。系统内存是在执行期间分配给无法直接归因于用户查询或无法由用户查询控制的事物的。例如,由读取器,写入器,网络缓冲区等分配的内存。当对任何worker的查询分配的用户和系统内存的总和达到此限制时,它将被杀死。的值query.max-total-memory-per-node必须大于 query.max-memory-per-node。
query.max-memory
- Type: data size
- Default value: 20GB
这是一个查询能够在整个集群上能使用的最大用户内存。用户内存是在执行过程中分配给可直接归属于用户查询或由用户查询控制的对象的。 例如,执行期间生成的哈希表使用的内存、排序期间使用的内存等。当一个查询在任何工作进程上的用户内存分配达到此限制时,它将被终止。
query.max-total-memory
- Type: data size
- Default value: query.max-memory * 2
这是查询可以在整个集群上使用的最大用户和系统内存量。系统内存在执行过程中分配给不能直接归属于用户查询或由用户查询控制的对象。 例如,读写器、网络缓冲区等分配的内存。当一个查询对任何工作进程分配的用户和系统内存之和达到此限制时,它将被终止。 max-total-memory 的值必须大于query.max-memory.
memory.heap-headroom-per-node
- Type: data size
- Default value: JVM max memory * 0.3
这是在 JVM 堆中为 Presto 没有跟踪的分配留出的内存空间/缓冲区。