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

Datalake 常见问题

数据湖 FAQ

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

HDFS DataNode 慢

问题描述

当您访问存储在 HDFS 集群中的数据文件时,您可能会发现您运行的 SQL 查询的 Profile 中 __MAX_OF_FSIOTime__MIN_OF_FSIOTime 指标的值之间存在巨大差异。这表明 HDFS 集群中的一些 DataNode 速度较慢。以下示例是一个典型的 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 DataNode 对查询的影响。
  • [推荐] 缩短 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 击败其原始读取的次数。