HDFSでは、読み込みは通常DataNodeを経由します。そのため、クライアントがDataNodeにファイルの読み込みを要求すると、DataNodeはディスクからそのファイルを読み込み、TCPソケットを介してクライアントにデータを送信します。「ショートサーキット」読み込みと呼ばれるものは、DataNodeをバイパスし、クライアントがファイルを直接読み取ることができるようにします。明らかに、これはクライアントがデータと同じ場所に配置されている場合にのみ可能です。ショートサーキット読み込みは、多くのアプリケーションに大幅なパフォーマンス向上をもたらします。
ショートサーキットローカル読み込みを設定するには、libhadoop.soを有効にする必要があります。このライブラリの有効化の詳細については、ネイティブライブラリを参照してください。
ショートサーキット読み込みは、UNIXドメインソケットを使用します。これは、クライアントとDataNodeが通信できるようにするファイルシステム内の特別なパスです。このソケットへのパスを設定する必要があります。 DataNodeはこのパスを作成できる必要があります。一方、HDFSユーザーまたはroot以外のユーザーがこのパスを作成できるべきではありません。このため、/var/runまたは/var/lib以下のパスがよく使用されます。
クライアントとDataNodeは、/dev/shm上の共有メモリセグメントを介して情報を交換します。
ショートサーキットローカル読み込みは、DataNodeとクライアントの両方で設定する必要があります。
設定例を以下に示します。
<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>
クライアントがHDFSブロックファイルを直接開くショートサーキットローカル読み込みのレガシー実装は、Linux以外のプラットフォームで引き続き利用できます。 dfs.client.read.shortcircuitに加えてdfs.client.use.legacy.blockreader.localの値をtrueに設定すると、この機能が有効になります。
また、dfs.datanode.data.dir.permの値をデフォルトの700ではなく750に設定し、dfs.datanode.data.dir以下のディレクトリツリーをクライアントとDataNodeが読み取れるようにchmod/chownする必要があります。これは、クライアントがHDFSの許可をバイパスしてすべてのブロックファイルを読み取ることができることを意味するため、注意が必要です。
レガシーショートサーキットローカル読み込みは安全ではないため、この機能へのアクセスは、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>