当前位置: 首页 > 后端技术 > Java

HDFS短路本地读取

时间:2023-04-01 21:16:07 Java

1。背景在HDFS中,读操作通常是通过DataNode进行的。因此,当客户端要读取文件时,DataNode会从磁盘中读取文件,并通过TCP套接字将数据发送给客户端。如果我们的客户端和数据在同一台机器上,是否可以绕过DataNode,让客户端直接读取数据呢?这个功能可以通过Short-CircuitLocalReads来实现。2、配置2.1检测libhadoop.so是否启用如果我们要使用Short-CircuitLocalReads,需要确保我们的hadoop中启用了libhadoop.so,可以通过hadoopchecknative命令查看。2.2设置socket路径Short-CircuitLocalReads利用Unixdomainsocket,这是文件系统中允许客户端与DataNodes通信的特殊路径。您需要设置此套接字的路径,并且DataNode需要能够创建此路径。另一方面,除hdfs用户或root用户外,任何用户都不可能创建此路径。因此,通常使用/var/run或/var/lib下的路径。客户端和DataNodes通过/dev/shm上的共享内存段交换信息,需要在DataNodes和客户端配置短路本地读取。2.3配置示例vimhdfs-site.xmldfs.client.read.shortcircuittruedfs.domain.socket.path/var/lib/hadoop-hdfs/dn_socket2.4.1/var/lib/hadoop-hdfs目录尚未创建。需要提前创建/var/lib/hadoop-hdfs目录,否则可能会出现如下错误。2.4.2创建/var/lib/hadoop-hdfs[hadoopdeploy@hadoop01~]$sudomkdir/var/lib/hadoop-hdfs[hadoopdeploy@hadoop01hadoop]$sudochownhadoopdeploy:hadoopdeploy-R/var/lib/hadoop-HDFS需要注意目录权限问题2.4重启hdfs,观察日志看是否开启了Short-CircuitLocalReads,发现2023-03-2321:41:42,321INFOorg.apache.hadoop.hdfs.server.datanode.DataNode出现:ListeningonUNIXdomainsocket:/var/lib/hadoop-hdfs/dn_socket表示启用了短路本地读取。3、测试下载的文件是否为Short-CircuitLocalReads3.1Uploadfile#Uploadfile[hadoopdeploy@hadoop01logs]$hadoopfs-put/etc/profile/profile.txt3.2检测新上传的文件分布在哪里3.3下载文件在机器上从上图我们的文件分别存放在140和141,这里我们从140下载文件,观察日志4,参考链接1,https://hadoop.apache.org/docs/stable/hadoop-项目-dist/hadoop-hdfs/ShortCircuitLocalReads.html