Tech Blog 〜ぞうの日記

HadoopやLinux関連の技術的な内容の紹介です

HDFSのショートサーキット雑感

HDFSのShort-Circuit Local Readについてのブログ記事を読んで

先週お盆休みに公開されたブログ、「How Improved Short-Circuit Local Reads Bring Better Performance and Security to Hadoop」には興味深い内容が書いてあります。これは必読では?と思ったので、少しまとめてみます。

元々の処理

クライアントがHDFSからデータを読み出す場合、データノードとのネットワーク通信が発生します。これはシンプルですが、カーネル内でTCPソケットを保持しておくなどのオーバヘッドがかかります。(ブログ中の最初の図)

Short-Circuit Local Reads with HDFS-2246

このチケットでの改善は、クライアントとデータノードが同一マシンの場合、直接ローカルファイルシステムからデータを読み込むようにするというものです。(ブログの2番目の図)

この機能は既にCDH3u3以降でサポートされており、パフォーマンスに寄与しています。

 

しかし、クライアントがローカルファイルシステムから直接データを読み出すと言うことは、パーミッションなどのセキュリティ上問題が生じます。つまり、データノードのデータディレクトリにあるファイルが、クライアントから全て見えてしまうというセキュリティ上の問題でした。結果、全てのユーザーが恩恵に預かれるというものではありませんでした。

HDFS-347: Making Short-Circuit Local Reads Secure

幸いなことにLinuxには「file descriptor passing」という仕組みがあり、この機能を使うことで、安全にShort-Circuit Readを行うことができるようになりました(Windowsでも同様の仕組みがあるようです)

HDFS-347ではディレクトリ名をクライアントに直接返すのではなく、データノードがファイルをオープンし、メタ情報をクライアントに返して、クライアントはそのメタ情報を元にファイルを読み込む、という流れになります。。これにより、必要なファイルだけを安全に読み出させることができます。

(注:Java標準APIから利用できないため、JNIを使用する必要があります)

Caching File Descriptors

HDFSから何度も同じブロックを読み出す場合があります(HBaseなど)。Short-Circuit Local Readではブロックのパスをキャッシュしているので効果があります。ただ、キャッシュされているパス情報から、もう一度ファイルをオープン(reopen)する必要があるため、オーバヘッドがあります。この修正ではファイル記述子をキャッシュ(FileInputStreamCache)することにより、reopen, rereadが不要になるために効果があるようです。

ベンチマークの結果もHDFS-347が良い結果を出しているようですね。さらにHDFS-4697ではreadheadにより、さらにランダムアクセスでのパフォーマンスの効果が期待できますね。

 

なお、Cloudera ImpalaにはShort-Circuit Readが必須なのでご注意下さい。

Mandatory: Short-Circuit Reads

Enabling short-circuit reads allows Impala to read local data directly from the file system. This removes the need to communicate through the DataNodes, improving performance. This setting also minimizes the number of additional copies of data. Short-circuit reads requireslibhadoop.so(the Hadoop Native Library) to be accessible to both the server and the client.libhadoop.sois not available if you have installed from a tarball. You must install from an.rpm,.deb, or parcel to use short-circuit local reads.