跳到主要内容
版本: 最新版本-3.5

数据湖常见问题

本主题介绍一些关于数据湖的常见问题 (FAQ),并提供这些问题的解决方案。本主题中提到的一些指标只能从 SQL 查询的 Profile 中获得。要获取 SQL 查询的 Profile,您必须指定 set enable_profile=true

HDFS DataNodes 慢

问题描述

当您访问存储在 HDFS 集群中的数据文件时,您可能会发现您运行的 SQL 查询的 Profile 中 __MAX_OF_FSIOTime__MIN_OF_FSIOTime 指标的值之间存在巨大差异。 这表明 HDFS 集群中的某些 DataNodes 速度很慢。 以下示例是一个典型的 Profile,表明存在 HDFS DataNode 速度慢的问题。

 - InputStream: 0
- AppIOBytesRead: 22.72 GB
- __MAX_OF_AppIOBytesRead: 187.99 MB
- __MIN_OF_AppIOBytesRead: 64.00 KB
- AppIOCounter: 964.862K (964862)
- __MAX_OF_AppIOCounter: 7.795K (7795)
- __MIN_OF_AppIOCounter: 1
- AppIOTime: 1s372ms
- __MAX_OF_AppIOTime: 4s358ms
- __MIN_OF_AppIOTime: 1.539ms
- FSBytesRead: 15.40 GB
- __MAX_OF_FSBytesRead: 127.41 MB
- __MIN_OF_FSBytesRead: 64.00 KB
- FSIOCounter: 1.637K (1637)
- __MAX_OF_FSIOCounter: 12
- __MIN_OF_FSIOCounter: 1
- FSIOTime: 9s357ms
- __MAX_OF_FSIOTime: 60s335ms
- __MIN_OF_FSIOTime: 1.536ms

解决方案

您可以使用以下解决方案之一来解决此问题

  • [推荐] 启用 数据缓存 功能,该功能通过自动将来自外部存储系统的数据缓存到 StarRocks 集群的 BE 或 CN 中,从而消除慢速 HDFS DataNodes 对查询的影响。
  • [推荐] 缩短 HDFS 客户端和 DataNode 之间的超时时长。 当数据缓存无法帮助解决 HDFS DataNode 速度慢的问题时,此解决方案适用。
  • 启用 Hedged Read 功能。 启用此功能后,如果从一个块的读取速度很慢,StarRocks 会启动一个新的读取,该读取与原始读取并行运行,以针对不同的块副本进行读取。 只要两个读取中的一个返回,另一个读取就会被取消。 Hedged Read 功能可以帮助加速读取,但也会显着增加 Java 虚拟机 (JVM) 上的堆内存消耗。 因此,如果您的物理机器提供较小的内存容量,我们建议您不要启用 Hedged Read 功能。

请参阅 数据缓存

配置 hdfs-site.xml 文件中的 dfs.client.socket-timeout 属性以缩短 HDFS 客户端和 DataNode 之间的超时时长。 (默认超时时长为 60 秒,有点长。) 这样,当 StarRocks 遇到慢速 DataNode 时,来自它的连接请求可以在很短的时间内超时,然后转发到另一个 DataNode。 以下示例设置了 5 秒的超时时长

<configuration>
<property>
<name>dfs.client.socket-timeout</name>
<value>5000</value>
</property>
</configuration>

Hedged Read

使用 BE 或 CN 配置文件 be.conf 中的以下参数(从 v3.0 开始支持)来启用和配置 HDFS 集群中的 Hedged Read 功能。

参数默认值描述
hdfs_client_enable_hedged_readfalse指定是否启用 hedged read 功能。
hdfs_client_hedged_read_threadpool_size128指定 HDFS 客户端上 Hedged Read 线程池的大小。 线程池大小限制了专用于在 HDFS 客户端中运行 hedged read 的线程数。 此参数等效于 HDFS 集群 hdfs-site.xml 文件中的 dfs.client.hedged.read.threadpool.size 参数。
hdfs_client_hedged_read_threshold_millis2500指定启动 hedged read 之前等待的毫秒数。 例如,您已将此参数设置为 30。 在这种情况下,如果从一个块的读取在 30 毫秒内没有返回,您的 HDFS 客户端会立即针对不同的块副本启动 hedged read。 此参数等效于 HDFS 集群 hdfs-site.xml 文件中的 dfs.client.hedged.read.threshold.millis 参数。

如果您的查询 Profile 中以下任何一个指标的值超过 0,则说明 Hedged Read 功能已启用。

指标描述
TotalHedgedReadOps启动的 hedged read 数。
TotalHedgedReadOpsInCurThread由于 Hedged Read 线程池已达到 hdfs_client_hedged_read_threadpool_size 参数指定的最大大小,StarRocks 不得不在当前线程中而不是在新线程中启动 hedged read 的次数。
TotalHedgedReadOpsWinhedged read 击败其原始读取的次数。