Presto ソースコードリーディング #4 に行ってきた
ちょっと時間経ちましたがPresto ソースコードリーディング #4に行ってきたんでその辺のことをちらほら書きます。
コードはぱらっと見ておいたんだけど、ちゃんと理解しているわけではなかったこともあり議論には全くついていけなかったことをここに告白します。。。
まあそれでもいろいろ情報教えてもらったのでためになりました。
例えば、
- task.shard.max-threadsはプロセッサ数の4倍がであるとか(ソース的にはたぶん https://github.com/facebook/presto/blob/master/presto-main/src/main/java/com/facebook/presto/execution/TaskManagerConfig.java#L32)、
- 実行時間が短いクエリが優先されるとか(ソース的にはたぶん https://github.com/facebook/presto/blob/master/presto-main/src/main/java/com/facebook/presto/execution/TaskExecutor.java#L524)
- FacebookはPrestoをHadoopのスレーブノードと同居させているんじゃないか?だからメモリを使い切るような設計にはなっていないのではとか
- MySQLのconnectorがあればMySQL上にあるマスターデータとも簡単にjoinできるよねとか
- worker数に依存する設定はquery.initial-hash-partitionsとnode-scheduler.min-candidatesとか
- FacebookではPrestoで8時間かかるクエリとか投げているらしいとか
- PrestoのviewはHiveと互換性はなくconnector側にストアされるのでPresto自体ではデータストア持たないとか
などなどいろいろな話を聞けました。
個人的には業務でもアドホッククエリを実行するときなんかにPresto使うようになってきたり、Prestogresの活用を検討していたりするので、Prestoは今後も要注目です。
Prestoのソースコード読む際に参考になりそうな資料があるかと思ってぐぐったかぎりでは下記が良さそうでした。
- http://www.slideshare.net/frsyuki/hadoop-source-code-reading-15-in-japan-presto
- Prestoソースコードリーディング - Togetter
- Prestoソースコードリーディング #1 - Go ahead!
- Prestoソースコードリーディング#2 メモ · GitHub
- presto_executor_and_coordinator.md · GitHub
- Presto - Hadoop Conference Japan 2014
- 20140715 Presto Source Code Reading #4 · GitHub
- Presto ソースコードリーディング #4 - Togetter
- Prestoソースコードリーディング #4 - Go ahead!
で、まあPrestoのソースコードをぱらっと見た印象を言うと「これはオレの知っているJavaじゃない」って感じですね。僕のJavaの知識って6で止まっているんですが、PrestoはJava7前提のコードだしDSLっぽく書かれています。
Struts 1.2とかJUnit 3.8とかで育った身としてはPrestoは洗練されすぎていて、なじみの居酒屋からちょっと小洒落たバーにきたような感じがします。
もし今Javaを勉強していて初めて読んだOSSのコードがPrestoだっていう人がいたら完全にニュータイプJavalerですね。
Prestoの中身の話を簡単にするとPrestoはDIコンテナのGuiceを使っていて疎結合に作られています。そしてHTTP JSON APIを使って通信しておりRESTfulな感じです。ユーティリティにはGuavaを使っていてairlift(GitHub - airlift/airlift: Airlift framework for building REST services)という自作のフレームワークも使っています。
Apacheのcommonsが出てこない時点でモダンですね。HTTP通信をしている部分はJettyClientを使っているのですが、それをラップしたairlift/http-client at master · airlift/airlift · GitHubを使っています。
HttpClientというインターフェースがあってこれをGuiceを使ってinjectしています。
https://github.com/facebook/presto/blob/master/presto-main/src/main/java/com/facebook/presto/operator/ExchangeClientFactory.java#L40-L44
みたいにForExchangeアノテーションつけて
https://github.com/facebook/presto/blob/master/presto-main/src/main/java/com/facebook/presto/server/ServerMainModule.java#L168-L171
でinjectしているようです。
他にも非同期callback処理が各所にあります。そこでListenableFutureというlistnerを登録できるfutureを使っています。
いやあ、いろいろと進化していて追いつくのが大変だ。。。