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
dfs.client.read.shortcircuit
true
dfs.domain.socket.path
/var/lib/hadoop-hdfs/dn_socket
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
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net