HDFS 本地短路读取

短路本地读取

背景

HDFS中,读取操作通常通过DataNode进行。因此,当客户端请求DataNode读取文件时,DataNode会从磁盘读取该文件并通过TCP套接字将数据发送给客户端。所谓的"短路"读取绕过了DataNode,允许客户端直接读取文件。显然,这只有在客户端与数据位于同一位置时才可能实现。短路读取为许多应用程序提供了显著的性能提升。

设置

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

短路读取利用了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短路本地读取

针对非Linux平台,仍可使用传统的短路本地读取实现,即客户端直接打开HDFS块文件。将dfs.client.use.legacy.blockreader.localdfs.client.read.shortcircuit的值同时设为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>