在 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 块文件,仍然可用于 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>