Apache HDFS 的常规配置指南超出了本指南的范围。有关配置 HDFS 的详细信息,请参阅 https://hadoop.apache.org/ 中提供的文档。本节以 HBase 的形式介绍 HDFS。

在大多数情况下,HBase 将其数据存储在 Apache HDFS 中。这包括包含数据的 HFile,以及在将数据写入 HFile 之前存储数据并防止 RegionServer 崩溃的预写日志(WAL)。 HDFS 为 HBase 中的数据提供可靠性和保护,因为它是分布式的。为了以最高效率运行,HBase 需要在本地提供数据。因此,最好在每个 RegionServer 上运行 HDFS DataNode。

HBase 和 HDFS 的重要信息和指南

HBase 是 HDFS 的客户端。

HBase 是一个 HDFS 客户端,使用 HDFS DFSClient类,对此类的引用出现在 HBase 日志中,带有其他 HDFS 客户端日志消息。

在多个地方需要配置。

与 HBase 相关的一些 HDFS 配置需要在 HDFS(服务器)端完成。其他必须在 HBase 内完成(在客户端)。需要在服务器端和客户端设置其他设置。

影响 HBase 的写入错误可能会记录在 HDFS 日志中而不是 HBase 日志中。

写入时,HDFS 将通信从一个 DataNode 传输到另一个 DataNode。 HBase 使用 HDFS 客户端类与 HDFS NameNode 和 DataNode 进行通信。 DataNode 之间的通信问题记录在 HDFS 日志中,而不是 HBase 日志中。

HBase 使用两个不同的端口与 HDFS 通信。

HBase 使用ipc.Client接口和DataNode类与 DataNode 通信。对这些的引用将出现在 HBase 日志中。这些通信信道中的每一个使用不同的端口(默认为 50010 和 50020)。通过dfs.datanode.addressdfs.datanode.ipc.address参数在 HDFS 配置中配置端口。

可能会在 HBase,HDFS 或两者中记录错误。

在对 HBase 中的 HDFS 问题进行故障排除时,请检查两个位置的日志以查找错误。

HDFS 需要一段时间才能将节点标记为已死。您可以配置 HDFS 以避免使用陈旧的 DataNode。

默认情况下,HDFS 不会将节点标记为已死,直到 630 秒无法访问。在 Hadoop 1.1 和 Hadoop 2.x 中,可以通过启用对陈旧 DataNode 的检查来缓解此问题,但默认情况下禁用此检查。您可以通过dfs.namenode.avoid.read.stale.datanodedfs.namenode.avoid.write.stale.datanode settings分别启用读取和写入检查。陈旧的 DataNode 是dfs.namenode.stale.datanode.interval无法访问的(默认为 30 秒)。避免过时的数据节点,并将其标记为读取或写入操作的最后可能目标。有关配置详细信息,请参阅 HDFS 文档。

HDFS 重试和超时的设置对 HBase 很重要。

您可以配置各种重试和超时的设置。请始终参考 HDFS 文档以获取当前建议和默认值。这里列出了一些对 HBase 很重要的设置。默认值是 Hadoop 2.3 的最新版本。查看 Hadoop 文档以获取最新的值和建议。

HBase Balancer 和 HDFS Balancer 不兼容

HDFS 平衡器尝试在 DataNode 中均匀分布 HDFS 块。在区域分裂或失败后,HBase 依赖于压缩来恢复局部性。这两种类型的平衡不能很好地协同工作。

过去,普遍接受的建议是关闭 HDFS 负载均衡器并依赖 HBase 均衡器,因为 HDFS 均衡器会降低本地性能。如果您的 HDFS 版本低于 2.7.1,此建议仍然有效。

HDFS-6133 通过在 HDFS 服务配置中将dfs.datanode.block-pinning.enabled属性设置为true,可以从 HDFS 负载均衡器中排除优先节点(固定)块。

通过将 HBase 平衡器类(conf:hbase.master.loadbalancer.class)切换为org.apache.hadoop.hbase.favored.FavoredNodeLoadBalancer,可以启用 HBase 以使用 HDFS 优先节点功能,此处记录

HDFS-6133 在 HDFS 2.7.0 及更高版本中可用,但 HBase 不支持在 HDFS 2.7.0 上运行,因此您必须使用 HDFS 2.7.1 或更高版本才能将此功能与 HBase 一起使用。

连接超时

客户端(HBASE)和 HDFS DataNode 之间发生连接超时。它们可能在建立连接,尝试读取或尝试写入时发生。下面的两个设置组合使用,并影响 DFSClient 和 DataNode,ipc.cClient 和 DataNode 之间的连接,以及两个 DataNode 之间的通信。

dfs.client.socket-timeout(默认值:60000)

建立连接或读取时客户端连接超时之前的时间。该值以毫秒表示,因此默认值为 60 秒。

dfs.datanode.socket.write.timeout(默认值:480000)

写操作超时前的时间。默认值为 8 分钟,以毫秒表示。

典型的错误日志

日志中经常会出现以下类型的错误。

INFO HDFS.DFSClient: Failed to connect to /xxx50010, add to deadNodes and continue java.net.SocketTimeoutException: 60000 millis timeout while waiting for channel to be ready for connect. ch : java.nio.channels.SocketChannel[connection-pending remote=/region-server-1:50010] ::块的所有 DataNode 都已死,无法恢复。以下是导致此错误的事件序列:

INFO org.apache.hadoop.HDFS.DFSClient: Exception in createBlockOutputStream java.net.SocketTimeoutException: 69000 millis timeout while waiting for channel to be ready for connect. ch : java.nio.channels.SocketChannel[connection-pending remote=/ xxx:50010] ::此类错误表示写入问题。在这种情况下,主人想要分割日志。它没有本地 DataNode,因此它尝试连接到远程 DataNode,但 DataNode 已经死了。