在HDFS中,读取操作都是通过DataNode来进行的。因为需要DataNode在中间做一次中转,所以对性能有一定的影响。
客户端是否可以跳过DataNode直接对文件进行操作?
只有客户端和数据在同一台服务器上,可以通过“短路”本地读取直接读取文件。
所谓“短路”读取,就是允许绕过DataNode让客户端直接读取文件,从而提升文件的读取性能。
HDFS的“短路”读取是建立在Linux中的Unix Domain Socket技术上的。
Unix Domain Socket是一种进程间的通讯方式,它使得同一台机器上的两个进程能以socket的方式通讯。该方式不仅可以传递普通数据,也可以在进程间传递文件描述符。
HDFS客户端的“短路”本地读取,就是客户端通过Unix Domain Socket技术获取到要读取文件的文件描述符,客户端就能读取该文件的内容了。
Hadoop提供了native包libhadoop.so用于支持Java客户端操作Unix Domain Socket(java不能直接操作)。
短路本地读取环境配置:
1、native包libhadoop.so安装
安装路径...\hadoop-3.1.4\lib\native (默认已经安装)
2、配置
<!-- 短路本地读取功能开关 -->
<property>
<name>dfs.client.read.shortcircuit</name>
<value>true</value>
</property>
<!-- DataNode和DFSClient之间沟通的Socket的本地路径,要提前创建好/var/lib/hadoop-hdfs路径,dn_socket是由DataNode创建的文件 -->
<property>
<name>dfs.domain.socket.path</name>
<value>/var/lib/hadoop-hdfs/dn_socket</value>
</property>
3、检查确认
检查短路本地读取是否生效,需要通过日志查看, 在启动的日志中搜索:Listening on UNIX domain socket
检查读取文件是否使用了短路本地读取,也是需要通过日志查看, 在日志中搜索:REQUEST_SHORT_CIRCUIT_FDS
检查native包是否安装命令:
hadoop checknative #命令
19/07/16 14:40:36 INFO bzip2.Bzip2Factory: Successfully loaded & initialized native-bzip2 library system-native
19/07/16 14:40:36 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
Native library checking:
hadoop: true /opt/software/hadoop-3.1.4/lib/native/libhadoop.so.1.0.0
zlib: true /lib64/libz.so.1
snappy: true /usr/lib64/libsnappy.so.1
lz4: true revision:99
bzip2: true /lib64/libbz2.so.1
openssl: true /opt/software/hadoop-2.7.7/lib/native/libcrypto.so