HDFS 本地短路读取 Short-Circuit Local Reads

背景

在 HDFS 中,读操作通常要经过 DataNode。因此,当客户端请求 DataNode 读取文件时,DataNode 从磁盘读取该文件并通过 TCP 套接字将数据发送给客户端。所谓的“短路”读取就是绕过 DataNode,允许客户端直接读取文件。当然,这只有在客户端与数据共存的情况下才可能实现。短路读取为许多应用程序提供了实质性的性能提升。

设置

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

短路读数利用 Unix domain socket,这是文件系统中的一个特殊路径,允许客户端和 DataNodes 进行通信。您需要设置到此套接字的路径,并且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.use.legacy.blockreader.local 和 dfs.client.read.shortccircuit 的值设置为 true 可以启用这个特性。

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

因为传统的短路本地读操作是不安全的,所以只有 dfs.block.local-path-access 值中列出的用户才能访问这个特性。用户。

<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>
posted @ 2021-01-28 21:09  数大招疯-公众号同名  阅读(351)  评论(0编辑  收藏  举报