乐趣区

关于后端:HDFS-ShortCircuit-Local-Reads

1、背景

HDFS 中,读取操作通常是通过 DataNode。因而,当客户端要读取文件时,DataNode
会从磁盘上读取文件,而后通过 TCP 套接字 将数据发送给客户端。如果咱们的客户端和数据在同一台机器上的时候, 那么是否能够绕过 DataNode,容许客户端间接读取数据呢?通过 Short-Circuit Local Reads 能够实现这一性能。

2、配置

2.1 检测是否启用 libhadoop.so

如果咱们要应用 Short-Circuit Local Reads,那么须要保障咱们的 hadoop 启用了 libhadoop.so,能够通过hadoop checknative 命令来执行查看。

2.2 设置套接字门路

  • Short-Circuit Local Reads 利用 Unix domain socket,这是文件系统中的一个非凡门路,容许客户端和 DataNodes 进行通信。您须要 设置到此套接字的门路 ,并且 DataNode 须要可能创立此门路。另一方面, 除了 hdfs 用户或 root 用户之外,任何用户都不可能创立这个门路。因而,通常应用 /var/run 或 /var/lib 下的门路。
  • 客户端和 DataNode 通过 /dev/shm 上的共享内存段替换信息,短路本地读取须要在 DataNode 和客户机上配置。

2.3 配置示例

vim hdfs-site.xml

<configuration>
  <!-- 开启 Short-Circuit Local Reads -->    
  <property>
    <name>dfs.client.read.shortcircuit</name>
    <value>true</value>
  </property>
  <!-- 可选。这是 UNIX domain socket 的门路,用于 DataNode 和本地 HDFS 客户端之间的通信。如果此门路中存在字符串“_PORT”,它将被 DataNode 的 TCP 端口替换。-->
  <property>
    <name>dfs.domain.socket.path</name>
    <value>/var/lib/hadoop-hdfs/dn_socket</value>
  </property>
</configuration>

2.4.1 /var/lib/hadoop-hdfs 目录未创立

/var/lib/hadoop-hdfs 这个 目录须要提前创立,否则可能呈现如下谬误。

2.4.2 创立 /var/lib/hadoop-hdfs

[hadoopdeploy@hadoop01 ~]$ sudo mkdir /var/lib/hadoop-hdfs
[hadoopdeploy@hadoop01 hadoop]$ sudo chown hadoopdeploy:hadoopdeploy -R /var/lib/hadoop-hdfs

须要留神目录权限问题

2.4 重启 hdfs,察看日志看 Short-Circuit Local Reads 是否启用

察看日志,发现呈现了 2023-03-23 21:41:42,321 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Listening on UNIX domain socket: /var/lib/hadoop-hdfs/dn_socket 阐明 Short-Circuit Local Reads 启用了。

3、测试下载文件是否是 Short-Circuit Local Reads

3.1 上传文件

# 上传文件
[hadoopdeploy@hadoop01 logs]$ hadoop fs -put /etc/profile /profile.txt

3.2 检测刚上传的文件散布在那几个机器上

3.3 下载文件

从上图中能够,咱们的文件别离存储在 140 和 141 上 ,此处咱们从140 上下载文件并察看日志

4、参考链接

1、https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/ShortCircuitLocalReads.html

退出移动版