因为 HBase 在 HDFS 上运行,所以了解它是如何工作以及它如何影响 HBase 是很重要的。

124.1。低延迟读取的当前问题

HDFS 的原始用例是批处理。因此,低延迟读取在历史上不是优先事项。随着 Apache HBase 的采用日益增多,这种情况正在发生变化,并且已经在开发中进行了一些改进。有关 HBase 的 HDFS 改进,请参阅 Umbrella Jira Ticket。

124.2。利用本地数据

由于 Hadoop 1.0.0(也是 0.22.1,0.23.1,CDH3u3 和 HDP 1.0)通过 HDFS-2246 ,DFSClient 可以进行“短路”并直接从磁盘读取当数据是本地数据时,而不是通过 DataNode。对于 HBase 来说,这意味着 RegionServers 可以直接读取其机器的磁盘,而不必打开套接字与 DataNode 通信,前者通常要快得多。参见 JD 的 Performance Talk 。另请参阅 HBase,邮件#dev - 读取短路线程,以获得有关短路读取的更多讨论。

要启用“短路”读取,它将取决于您的 Hadoop 版本。在 HDFS-347 中,Hadoop 2 中的原始短路读取补丁得到了很大改善。参见 http://blog.cloudera.com/blog/2013/08/how-improved-short-circuit-local-reads-bring-better-performance-and-security-to-hadoop/ for 有关旧实现和新实现之间差异的详细信息。参见 Hadoop 短路读取配置页面,了解如何启用后者,更好的短路版本。例如,这是一个最小配置。启用短路读取添加到 hbase-site.xml

<property>
  <name>dfs.client.read.shortcircuit</name>
  <value>true</value>
  <description>
    This configuration parameter turns on short-circuit local reads.
  </description>
</property>
<property>
  <name>dfs.domain.socket.path</name>
  <value>/home/stack/sockets/short_circuit_read_socket_PORT</value>
  <description>
    Optional.  This is a path to a UNIX domain socket that will be used for
    communication between the DataNode and local HDFS clients.
    If the string "_PORT" is present in this path, it will be replaced by the
    TCP port of the DataNode.
  </description>
</property> 

注意托管共享域套接字的目录的权限;如果对 hbase 用户以外的其他人开放,dfsclient 会抱怨。

如果您运行的是旧的 Hadoop,没有 HDFS-347 ,但有 HDFS-2246 ,则必须设置两个配置。首先,需要修改 hdfs-site.xml。将属性dfs.block.local-path-access.user设置为可以使用快捷方式的 _ 仅 _ 用户。这必须是启动 HBase 的用户。然后在 hbase-site.xml 中,将dfs.client.read.shortcircuit设置为true

服务 - 至少是 HBase RegionServers - 需要重新启动才能获取新配置。

dfs.client.read.shortcircuit.buffer.size

在高流量的 HBase 上运行时,此值的默认值太高。在 HBase 中,如果尚未设置此值,我们将其从默认值 1M 设置为 128k(自 HBase 0.98.0 和 0.96.1 起)。请参阅 Hadoop 2 上的 HBASE-8143 HBase,本地短路读取(ssr)会导致 OOM 。 HBase 中的 Hadoop DFSClient 将为 _ 分配一个这个大小的直接字节缓冲区,每个 _ 块已打开;鉴于 HBase 始终保持其 HDFS 文件打开,这可以快速加起来。

124.3。 HBase 与 HDFS 的性能比较

关于 dist-list 的一个相当常见的问题是为什么 HBase 不如批处理上下文中的 HDFS 文件那样高效(例如,作为 MapReduce 源或接收器)。简短的回答是 HBase 比 HDFS 做得更多(例如,读取 KeyValues,返回最新的行或指定的时间戳等),因此 HBase 在此处理环境中比 HDFS 慢 4-5 倍。还有改进的余地,随着时间的推移,这个差距会缩小,但在这个用例中 HDFS 总是会更快。