Winse Blog

走走停停, 熙熙攘攘, 忙忙碌碌, 不知何畏.

Hadoop2 ShortCircuit Local Reading

hadoop一直以来认为是本地读写文件的,但是其实也是通过TCP端口去获取数据,只是都在同一台机器。在hivetuning调优hive的文档中看到了ShortCircuit的HDFS配置属性,查看了ShortCircuit的来由,真正的实现了本地读取文件。蒙查查表示看的不是很明白,最终大致就是通过linux的文件描述符来实现功能同时保证文件的权限。

由于仅在自己的机器上面配置来查询hbase的数据,性能方面提升感觉不是很明显。等以后整到正式环境再对比对比。

  • 2016-1 添加测试方法数据是否通过short-circuit读取

配置如下。

1 修改hdfs-site.xml

1
2
3
4
5
6
7
8
9
<property>
        <name>dfs.client.read.shortcircuit</name>
        <value>true</value>
</property>

<property>
        <name>dfs.domain.socket.path</name>
        <value>/home/hadoop/data/sockets/dn_socket</value>
</property>

注意:socket路径的权限控制的比较严格。dn_socket所有的父路径要么仅有当前启动用户的写权限,要么仅root可写。

2 修改hbase的配置,并添加HADOOP_HOME(hbase查找hadoop-native)

hbase的脚本找到hadoop命令后,会把hadoop的java.library.path配置加入到hbase的启动脚本中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 更好的方式是Hbase直接共享HADOOP_CONF_DIR
[hadoop@master1 ~]$ tail -15 hbase-0.98.3-hadoop2/conf/hbase-site.xml 
    <name>hbase.tmp.dir</name>
    <value>/home/hadoop/data/hbase</value>
  </property>

<property>
        <name>dfs.client.read.shortcircuit</name>
        <value>true</value>
</property>

<property>
        <name>dfs.domain.socket.path</name>
        <value>/home/hadoop/data/sockets/dn_socket</value>
</property>

</configuration>

// IBM部署是直接把一系列的bigdata的环境变量写到一个FILE,然后加入到/etc/profile.d/FILE。
[hadoop@master1 ~]$ cat hbase-0.98.3-hadoop2/conf/hbase-env.sh
...
export HADOOP_HOME=/home/hadoop/hadoop-2.2.0
...

3 同步到其他节点,然后重启hdfs,hbase

测试

在datanode读取该机器上的block(fsck命令可以查看文件的块在哪些机器)。通过查看日志,或者通过HdfsDataInputStream.getReadStatistics().getTotalShortCircuitBytesRead()来获取从ShortCircuit读取数据量。

1
2
3
4
5
6
7
8
9
10
11
# datanode.log
2017-05-05 09:53:16,089 INFO org.apache.hadoop.hdfs.server.datanode.DataNode.clienttrace: cliID: DFSClient_attempt_1492660490127_17873_m_001534_0_698465397_1, src: 127.0.0.1, dest: 127.0.
0.1, op: REQUEST_SHORT_CIRCUIT_SHM, shmId: 3a2653121c6cb5acd0050fbb6a086fcf, srvID: 732ce1ee-3f4f-4be5-b806-22edcab58e6b, success: true
2017-05-05 09:53:16,095 INFO org.apache.hadoop.hdfs.server.datanode.DataNode.clienttrace: cliID: DFSClient_attempt_1492660490127_17873_m_001469_0_936154908_1, src: 127.0.0.1, dest: 127.0.
0.1, op: REQUEST_SHORT_CIRCUIT_SHM, shmId: c9082d6420bc980b60bde78a437a90fd, srvID: 732ce1ee-3f4f-4be5-b806-22edcab58e6b, success: true
2017-05-05 09:53:16,122 INFO org.apache.hadoop.hdfs.server.datanode.DataNode.clienttrace: src: 127.0.0.1, dest: 127.0.0.1, op: REQUEST_SHORT_CIRCUIT_FDS, blockid: 1211094391, srvID: 732ce
1ee-3f4f-4be5-b806-22edcab58e6b, success: true
2017-05-05 09:53:16,126 INFO org.apache.hadoop.hdfs.server.datanode.DataNode.clienttrace: src: 127.0.0.1, dest: 127.0.0.1, op: REQUEST_SHORT_CIRCUIT_FDS, blockid: 1211095681, srvID: 732ce
1ee-3f4f-4be5-b806-22edcab58e6b, success: true

[hadoop@cu3 ~]$ ~/hadoop-2.6.3/bin/hdfs fsck /spark-assembly-1.6.0-hadoop2.6.3.jar -files -blocks -locations

参考

–END

Comments