dremio 由 一个协调器节点 和 若干 执行器节点 组成
1:协调器节点:可以配置一 个或多个节点作为主协调器角色。建议对 Dremio 集群使用单个协调器节点。
2:执行器节点:可以配置一 个或多个节点的执行器角色。执行程序节点的数量取决于您的负载。例如,当您有大量查询(大量数据或大量计算)和/或大量查询时,将增加执行程序节点的数量。
- 内存概念
内存通过 /etc/dremio/dremio-env 文件进行配置。
当此配置文件从默认值更改时,必须在所有节点上更新它
配置完成后可以通过 sql commend 查看项目信息
select * from sys.nodes --查看节点信息
1 、堆内存使用率和 GC 频率(Heap Memory Usage and GC Frequency )
Dremio 使用堆内存进行规划、协调、UI 服务、查询管理、连接管理以及某些类型的记录读取等类型的任务。在高并发部署中,协调器节点中的堆内存预计更高。当观察时,持续的高垃圾回收 (GC) 频率和高堆内存使用率将表明集群/节点大小过小
2 、直接内存 (Direct Memory)
Dremio 使用直接内存执行查询执行任务,直接影响性能和并发性。Dremio 还使用直接内存进行执行器和协调器节点之间的 RPC 通信,以及与最终用户进行通信。在执行程序节点上的查询执行期间,预计会大量使用直接内存。持续的高直接内存使用率将表明集群/节点接近其容量。
三、配置最大内存、堆内存和直接内存
在安装过程中,Dremio 软件会自动确定可用的系统内存量,并在堆内存和直接内存之间分配它,具体取决于 Dremio 节点类型。
当您持续监控查询工作负载的性能并调整 Dremio 配置时,您可能需要调整节点上分配的内存量。根据您的工作负载,Dremio 支持可能会建议您使用该 DREMIO_MAX_MEMORY_SIZE_MB 参数调整最大可用内存,或者直接配置堆和直接内存。
如果同时配置堆内存和直接内存,则忽略该 DREMIO_MAX_MEMORY_SIZE_MB 参数。
如果仅配置堆内存或直接内存,则 Dremio 软件会根据剩余内存量自动配置另一个。
四、堆内存和直接内存 建议 配置规则
建议您调整堆内存的最大允许大小和/或直接内存的最大允许大小
1:若要更改节点上堆内存的最大大小,请修改以下行:
DREMIO_MAX_HEAP_MEMORY_SIZE_MB=4096
2:若要更改直接内存的最大大小,请修改以下行:
DREMIO_MAX_DIRECT_MEMORY_SIZE_MB=8192
注意:对于 DREMIO_MAX_DIRECT_MEMORY_SIZE_MB 分配,请确保为操作系统保留至少 1-2 GB 的内存
默认情况下,如果未设置, 最大堆内存 则 最大直接内存 按如下方式设置:
Coordinator Nodes 协调器节点
1:如果 最大内存 为 ≥18 GB,则堆为 16 GB,直接内存 使用剩余的容量。
2:如果 最大内存 为 <18 GB,则 直接内存 为 2 GB,堆使用剩余的容量。
Executor Nodes 执行器节点
1: 如果 最大内存 为 ≥32 GB,则堆为 8 GB,直接内存 使用剩余的容量。
2 :如果 最大内存为 ≥6 GB,则堆为 4 GB,Direct 使用剩余部分。
3: 否则,堆内存 为 2 GB,直接内存 使用剩余的 GB。
五、堆监视器
为了防止由于堆内存不足而导致 JVM 故障,如果 JVM 的堆利用率保持在 85% 的阈值以上,Dremio 的堆监视器会终止查询,即使在完全垃圾回收之后也是如此。在执行器节点上,堆监视器评估当前正在运行的查询,并杀死释放大约 25% 的内存堆所需的查询。如有必要,堆监视器将再次运行以终止更多查询。在协调器节点上,堆监视器取消规划阶段的所有查询。默认情况下,该功能处于启用状态。
由执行程序节点上的堆监视器终止的查询的查询配置文件包含以下错误:
Query was cancelled because it exceeded the memory limits set by the administrator.
在协调器节点上终止的查询的查询配置文件包含以下错误:
Query canceled - out of memory, check the query profile for details
Dremio 建议在堆监视器终止查询时按顺序尝试以下建议:
1:重试查询
如果在第二次尝试期间并行查询较少,则查询应成功。
2:减少查询并行度。
3:增加堆内存。
4:增加执行程序节点的数量。
六、通过系统函数 实时监控内存大小
select now()
,memory.direct_current as "当前直接内存大小"
,memory.direct_max as "最大直接内存大小"
,memory.heap_current as "当前堆内存大小"
,memory.heap_max as "最大堆内存大小"
,memory.jvm_direct_current as "jvm直接内存大小"
from sys.memory
七、性能优化
Dremio 是一个功能强大的平台,可以处理大量数据。要使 Dremio 环境发挥最佳性能,应遵循这些设计原则和实施最佳实践。
1、性能优化的维度
1:优化集群
在优化 Dremio 集群的性能时,应考虑几个因素。提交给 Dremio 的查询必须由协调员计划,然后才能路由执行。始终有一个主协调器,以及可选的其他横向扩展协调器,用于协助规划 JDBC/ODBC 查询。协调器生成一个查询计划,可用于将查询路由到属于群集的引擎之一。
2:sql查询优化
有些查询可能从一开始就消耗过高的资源。这些查询可以自行重写和优化,而不考虑更大的集群。
3:优化执行 器
除了单个查询之外,我们还关注执行器节点的执行环境。这些节点具有单独的内存和 CPU 约束。Dremio 中的执行器也是引擎的一部分,该引擎将执行器组合在一起,以跨多台计算机并行处理查询。运行查询的引擎的大小可能会影响其性能和处理其他查询的能力。
4:利用反射提高性能
找到计算成本高的查询 ,或者数据量大的查询 设置反射提高性能
5:优化元数据刷新性能
向 Dremio 群集添加专用元数据刷新引擎将确保执行程序服务的所有元数据刷新活动将与任何其他工作负载隔离。专用引擎可避免元数据刷新工作负载的任何问题,从而占用关键业务工作负载的 CPU 周期和内存,并确保它们有最佳机会及时完成。