排除 HDFS 数据读取故障

访问 HDFS 中的数据时,可能会遇到以下问题。

使用 [web]hdfs:/// 的查询显示意外结果

如果您使用 /// 简写查询外部表并看到意外结果(例如测试群集中的生产数据),请验证 HadoopConfDir 是否设置为您期望的值。HadoopConfDir 配置参数定义了用于搜索 Vertica 解析文件位置所需的 Hadoop 配置文件的路径。HadoopConfDir 参数可以在会话级别设置,覆盖数据库中设置的永久值。

要调试 /// URL 的问题,请尝试将 URL 替换为使用显式名称服务或名称节点的 URL。如果显式 URL 有效,则问题在于简写的解析。如果显式 URL 也没有按预期工作,则问题出在其他地方(例如您的名称服务)。

使用 HA 时查询需要很长时间才能运行

HDFS 中的高可用性名称节点功能允许名称节点故障转移到备用名称节点。dfs.client.failover.max.attempts 配置参数(在 hdfs-site.xml 中)指定故障转移时尝试的次数。如果未设置此参数,Vertica 将使用默认值 4。在达到最大故障转移尝试次数后,Vertica 会断定 HDFS 群集不可用并中止操作。Vertica 使用 dfs.client.failover.sleep.base.millisdfs.client.failover.sleep.max.millis 参数来决定重试之间的等待时间。典型范围是 500 毫秒到 15 秒,连续重试的等待时间更长。

另一个参数 ipc.client.connect.retry.interval 指定尝试之间的等待时间,典型值为 10 到 20 秒。

Cloudera 和 Hortonworks 都提供可自动生成配置文件的工具。这些工具可能将最大故障转移尝试次数设置为更高的数(50 或 100)。如果 HDFS 群集不可用(所有名称节点都无法访问),Vertica 可能会在尝试连接时出现长时间挂起(几分钟到几小时)。

QUERY_EVENTS 系统表记录了故障转移尝试。以下示例展示了如何查询此表以查找这些事件:

=> SELECT event_category, event_type, event_description, operator_name,
   event_details, count(event_type) AS count
   FROM query_events
   WHERE event_type ilike 'WEBHDFS FAILOVER RETRY'
   GROUP BY event_category, event_type, event_description, operator_name, event_details;
-[ RECORD 1 ]-----+---------------------------------------
event_category    | EXECUTION
event_type        | WEBHDFS FAILOVER RETRY
event_description | WebHDFS Namenode failover and retry.
operator_name     | WebHDFS FileSystem
event_details     | WebHDFS request failed on ns
count             | 4

您可以等待 Vertica 完成或中止连接,或者将 dfs.client.failover.max.attempts 参数设置为较低的值。

使用 LibHDFS++ 时出现 WebHDFS 错误

创建外部表或者加载数据并使用 hdfs 方案时,您可能会看到 WebHDFS 失败的错误消息。此类错误消息表明,Vertica 无法使用 hdfs 方案并已回退到 webhdfs,但并不表明 WebHDFS 的配置不正确。

首先验证 HadoopConfDir 配置参数的值(可以在会话级别设置该参数)。然后,验证找到的 HDFS 配置文件是否具有适用于 Hadoop 群集的正确 WebHDFS 配置。有关使用这些文件的信息,请参阅配置 HDFS 访问。有关 WebHDFS 配置的信息,请参阅 Hadoop 文档。

Vertica 在名称节点上施加了过多负载 (LibHDFS++)

当包括 Vertica 在内的客户端需要定位数据时,大型 HDFS 群集有时会在名称节点上遇到繁重的负载。如果您的名称节点对此负载敏感并且您使用的是 LibHDFS++,则可以指示 Vertica 将有关块位置的元数据分发到其节点,这样它们就不必经常联系名称节点。在没有争用名称节点的部署中,分发此元数据可能会降低数据库性能。产生这种性能影响的原因是数据必须是序列化和分布式的。

如果保护名称节点免受负载比查询性能更重要,请将 EnableHDFSBlockInfoCache 配置参数设置为 1 (true)。通常这适用于名称节点争用已经成为问题的大型 HDFS 群集。

此设置适用于通过 LibHDFS++(hdfs 方案)进行的访问。有些时候,LibHDFS++ 会退回到不使用此设置的 WebHDFS。如果您启用了此设置,而仍然看到 Vertica 名称节点上的流量很高,请查看 QUERY_EVENTS 系统表中的 LibHDFS++ UNSUPPORTED OPERATION 事件。

Kerberos 身份验证错误

如果 Hadoop 频繁使票证过期,即使票证有效,Kerberos 身份验证也可能失败。身份验证也可能由于 Hadoop 和 Vertica 节点之间的时钟偏差而失败。有关详细信息,请参阅Kerberos 身份验证故障排除