HDFS 短路本地读取

短路本地读取

背景

HDFS 中,读取通常会经过 DataNode。因此,当客户端要求 DataNode 读取文件时,DataNode 会从磁盘读取该文件,并通过 TCP 套接字将数据发送到客户端。所谓的“短路”读取绕过了 DataNode,允许客户端直接读取文件。显然,这仅在客户端与数据位于同一位置的情况下才有可能。短路读取为许多应用程序提供了大幅性能提升。

设置

要配置短路本地读取,您需要启用 libhadoop.so。有关启用此库的详细信息,请参阅 本机库

短路读取使用 UNIX 域套接字。这是文件系统中的一个特殊路径,允许客户端和 DataNode 进行通信。您需要为该套接字设置一个路径。DataNode 需要能够创建此路径。另一方面,除了 HDFS 用户或 root 之外,任何用户都不应该能够创建此路径。因此,经常使用 /var/run/var/lib 下的路径。

客户端和 DataNode 通过 /dev/shm 上的共享内存段交换信息。

短路本地读取需要在 DataNode 和客户端上进行配置。

示例配置

这是一个示例配置。

<configuration>
  <property>
    <name>dfs.client.read.shortcircuit</name>
    <value>true</value>
  </property>
  <property>
    <name>dfs.domain.socket.path</name>
    <value>/var/lib/hadoop-hdfs/dn_socket</value>
  </property>
</configuration>

旧版 HDFS 短路本地读取

旧版短路本地读取的实现,其中客户端直接打开 HDFS 块文件,仍然可用于 Linux 以外的平台。除了 dfs.client.read.shortcircuit 之外,将 dfs.client.use.legacy.blockreader.local 的值设置为 true 可启用此功能。

您还需要将 dfs.datanode.data.dir.perm 的值设置为 750,而不是默认的 700,并将 dfs.datanode.data.dir 下的目录树 chmod/chown 为客户端和 DataNode 可读。您必须小心,因为这意味着客户端可以绕过 HDFS 权限读取所有块文件。

由于旧版短路本地读取不安全,因此对该功能的访问仅限于 dfs.block.local-path-access.user 的值中列出的用户。

<configuration>
  <property>
    <name>dfs.client.read.shortcircuit</name>
    <value>true</value>
  </property>
  <property>
    <name>dfs.client.use.legacy.blockreader.local</name>
    <value>true</value>
  </property>
  <property>
    <name>dfs.datanode.data.dir.perm</name>
    <value>750</value>
  </property>
  <property>
    <name>dfs.block.local-path-access.user</name>
    <value>foo,bar</value>
  </property>
</configuration>