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