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 客户端和 DataNode 之间的超时时间
在 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_read | false | 指定是否启用 Hedged Read 功能。 |
hdfs_client_hedged_read_threadpool_size | 128 | 指定 HDFS 客户端上 Hedged Read 线程池的大小。线程池大小限制了 HDFS 客户端中专用于运行 Hedged Read 的线程数。此参数等效于 HDFS 集群的 hdfs-site.xml 文件中的 dfs.client.hedged.read.threadpool.size 参数。 |
hdfs_client_hedged_read_threshold_millis | 2500 | 指定在启动 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 的次数。 |
TotalHedgedReadOpsWin | Hedged Read 击败其原始读取的次数。 |