Prestoが使っているairliftなるものについてメモっておく

Prestoのコードを読んでいるとairliftなるパッケージにお目にかかることがあります。

GitHubのorganizationにairliftというものがあってこれの配下にいろいろなプロジェクトがあって、ここにairliftのソースがあります。

https://github.com/airlift


例えば https://github.com/airlift/airlift 配下はRESTサービスを作るためのフレームワークが整備されています。

https://github.com/airlift/airlift/tree/master/http-server はJettyをGuice風味にラップした使ったhttp serverです。
https://github.com/airlift/airlift/tree/master/http-client はそれのクライアント版です。

PrestoはHTTP JSON APIでノード間の通信を行いますがそのときに上記http-server, http-clientを使います。


https://github.com/airlift/airlift/tree/master/json はJacksonをGuice風味にラップしたものです。


もっと低レイヤーの部品としては https://github.com/airlift/slice があります。
これはJavaでoff-heap memoryを扱うライブラリです。

off-heap memoryは僕も良く知らないのですが、どうやらByteBuffer.allocateDirectで作るjava.nio.ByteBufferのことでGCの範囲外だけどメモリを効率的に扱えて高速だよというもののようです。

普通はnew byte[..]でバイト配列つくってByteBuffer.wrapに渡してByteBufferを作るのが一般的なパターンだけどそれだと遅いらしい。

Prestoとは直接関係無いですが、Nettyの開発者によるブログ記事でもその辺が少し触れられています。
Netty 4 at Twitter: Reduced GC Overhead
上記記事の日本語訳:Netty 4がTwitterのGCオーバーヘッドを1/5に削減

NettyのGitHub wikiにはもっと詳しい情報がありますね。
https://github.com/netty/netty/wiki/Using-as-a-generic-library


sliceはさらにsun.misc.Unsafeという名前からして危険な香りのするJavaの内部APIを使ってバイト列からのデコードを高速化しています。

sun.misc.Unsafeとかoff-heap memoeryに関してはこちらも参照
デシリアライズ速度の比較 ByteBuffer vs DirectBuffer vs Unsafe vs C - Blog by Sadayuki Furuhashi

msgpack-java v07でも活用しているとか


他にも https://github.com/airlift/joni というRubyの鬼車というCで実装された正規表現ライブラリのJava移植版があります。
これは元々はJRuby用に作られたものをforkしたようです。

joniはバイト列をそのまま正規表現にひっかけれられるのでsliceで処理しているPrestoには性能的に好都合なようです。
https://github.com/facebook/presto/pull/545

最近だと https://github.com/facebook/presto/pull/2815 なんてのもありますね。詳細はよく分かりませんがw


以上です。この辺、低レイヤーなものばかりで難しいですが、新鮮ですね。