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>