在HDFS中,读取通常通过DataNode进行。因此,当客户端要求DataNode读取文件时,DataNode将从磁盘上读取该文件,然后通过TCP套接字将数据发送给客户端。所谓的“短路”读取绕过了DataNode,从而允许客户端直接读取文件。显然,这仅在客户端与数据位于同一位置的情况下才可行。短路读取为许多应用提供了显着的性能提升。
要配置本地短路读取,您需要启用libhadoop.so。请参见本机库的启用此库的详细信息。
短路读取利用UNIX域套接字。这是文件系统中的一条特殊路径,它允许客户端和DataNode进行通信。您将需要为此套接字设置一个路径。该数据节点需要能够创建此路径。另一方面,除HDFS用户或root之外,任何其他用户都不可能创建该路径。因此,通常使用/ var / run或/ var / lib下的路径。
客户端和DataNode通过/ dev / shm上的共享内存段交换信息。
短路本地读取需要同时在DataNode和客户端上配置。
客户端可以直接打开HDFS块文件的短路本地读取的传统实现仍可用于Linux以外的平台。除dfs.client.read.shortcircuit之外,将dfs.client.use.legacy.blockreader.local的值设置为true 均可启用此功能。
您还需要将dfs.datanode.data.dir.perm的值设置为750,而不是默认值700,并chmod / chown dfs.datanode.data.dir下的目录树,以使客户端和DataNode可以读取。您必须注意,因为这意味着客户端可以绕过HDFS权限读取所有阻止文件。
由于旧式短路本地读取不安全,因此只能在dfs.block.local-path-access.user值中列出的用户访问此功能。
<配置> <属性> <name> dfs.client.read.shortcircuit </ name> <value> true </ value> </ property> <属性> <name> dfs.client.use.legacy.blockreader.local </ name> <value> true </ value> </ property> <属性> <name> dfs.datanode.data.dir.perm </ name> <value> 750 </ value> </ property> <属性> <名称> dfs.block.local-path-access.user </名称> <value> foo,bar </ value> </ property> </ configuration>