本文固定链接:https://www.askmac.cn/archives/hdfs-short-circuit-local-reads.html
原文地址:http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/ShortCircuitLocalReads.html
1.本地读
1.1背景
在HDFS,读一般是通过DataNode。因此,当客户端请求DataNode来读取一个文件时,DataNode从磁盘读取文件,然后通过TCP socket发送给客户端。所谓的本地读(短路读),是通过DataNode ,允许客户端直接去读取文件。短路读为很多应用提供了优秀的性能。
1.2设置
要配置短路本地读,你需要启用libhadoop.so。参考本地库来获得启用这个库的详细信息。
短路读是利用的UNIX socket。这是文件系统允许客户端和DataNode 通信的一个特殊路径。你需要为这个socket设置一个路径。DataNode需要能够创建这个路径。换句话说,不应该使用除了HDFS用户之外的用户或root来创建这个路径。因此这个路径一般在/var/run或/var/lib目录下(www.askmac.cn)。
客户端和DataNode通过/dev/shm上的共享内存段交换信息。
本地读需要在DataNode和客户端都进行配置。
1.3 配置例子
<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>
2.传统的HDFS本地读
在HDFS块文件上实施传统本地读也适合其他linux平台。设置 dfs.client.use.legacy.blockreader.local 和dfs.client.read.shortcircuit为true来开启这个特性。
你还需要设置dfs.datanode.data.dir.perm 为750,其默认值是700.并且修改dfs.datanode.data.dir下面的组权限,让客户端和DataNode可读。你必须小心,因为这意味着客户端可以绕过HDFS权限读取所有的块文件(www.askmac.cn)。
由于传统的本地读是不安全的,访问这个特性的用户限制列表的值在dfs.block.local-path-access.user中
<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>
Comment