僕の記事を見て魔法少女(Presto使い)になってよ

> いいねつけてくれるのはありがたいのですが...
> この投稿から1年ぐらいたった頃から、あまりPresto触らなくなったので、内容的にかなり古いですよ。
> 最新の情報は、公式ドキュメント見たほうがBetterです。
> この記事の更新してないんで。

この記事は、マイナー言語 [Advent Calendar 2013 - Qiita [キータ] ](http://qiita.com/advent-calendar/2013/minor-language)の24日目です。

ところで、
(,,ﾟДﾟ)∩先生質問です。SQLってマイナー言語何ですか？

良い質問ですね！
SQLのcalendarがなかったんです。
それにPrestoがまだそんなにはやってないからいいんです！！

### ところで、Prestoって何？
---------------------------------------

公式サイトはこちら
[presto](http://prestodb.io/)

Prestoは、あのFacebookが作った分散SQLエンジンです。
Hadoop MapReduceとHiveでデータを集計してたもののMapReduceはバッチ指向なので、リアルタイムなデータ集計をしたいという要件が出てきた場合に対応できないということで出来たようです。
(日本だとこの手の要求はもっとありそうだ。それも無意味に...)

### HQLと何が違うの？
---------------------------------------

Hadoopを使ってる方だと詳しいと思いますが、HQLってのがあるのは知ってるかと思います。
何が違うかというと、

HQLはHive&MapReduceの処理をSQLのように書けるっていうことに対して、
prestoはANSI SQL準拠の本当のSQLなので、思想・設計・挙動すべて別物になります。
ただストレージは基本hadoopという点は一緒です。

### SQLだと何がいいの？
---------------------------------------

* 欲しいデータをリアルタイムに取得できる
* SQLは他のデータベースと比べて使ってる人が多いので、学習コストが低い。
* Join、Outer Join、サブクエリ、一般的な集計関数やカウント
(集計やカウントはMapReduceでもできるか...)

### 他にすごいところ
---------------------------------------

> Presto is 10x better than Hive/MapReduce in terms of CPU efficiency and latency for most queries at Facebook.
> 
> Prestoはほとんどの社内のクエリにおいて、CPUの効率とレイテンシに関してHive/MapReduceよりも10倍は優れている。

とFacebook様はおっしゃっております。
まじか、すごいな。
(試そうと思いましたが間に合いませんでした。)

### 勘違いされやすいところ (っていうか、自分が勘違いしてたところ)
---------------------------------------

* prestoは検索専門なので、他のRDBSみたいにストレージはついてきません。
* 基本的にストレージはHadoop使います。
* というわけで、Hadoopを先にInstallしてないと実践で使えません。
* ドキュメント見てると、hive使ってるじゃんってなりがちですが、機能の一部を間借りしてるだけらしいです。多分、そのうち使わないで動くようになるんだと思います。

### インストール簡易マニュアル

全部、sudoで。

```
# 1. java入れてなかったら入れる。
yum install  java-1.7.0-openjdk.x86_64

# 2. prestoのファイルを落としてくる。& 解凍
# wgetでもなんでもいいです。
cd /opt
wget http://central.maven.org/maven2/com/facebook/presto/presto-server/0.55/presto-server-0.55.tar.gz
tar zxvf presto-server-0.55.tar.gz

# 3.作られたディレクトリ内にetcディレクトリ作る。
# 今は設定ファイルの一部を作らないといけないみたいなので。
cd presto-server-0.55
mkdir etc

# 4.色々つくるからetcディレクトリに移動しておいたほうが面倒じゃない。
cd etc

# 5.設定ファイルを作成
# 詳細は別途記載
vi node.properties
vi jvm.config
vi config.properties
vi log.properties

# 6.カタログを作成
# etcディレクトリの下層にcatalogを作ってください。
# 試す程度だったら、jmx.properties。実践ならhive.properties
mkdir catalog
vi catalog/hive.properties
```

Nodeの設定です。
あくまで一例です。
パラメータは各自で調整してください。

``` node.properties
node.environment=production
node.id=ffffffff-ffff-ffff-ffff-ffffffffffff
node.data-dir=/var/presto/data
```

JVMの設定です。
あくまで一例です。
Xmx (Java ヒープの最大サイズ)がでかいので、試す程度だったらもっと下げていいと思います。
パラメータは各自で調整してください。

``` jvm.config
-server
-Xmx16G
-XX:+UseConcMarkSweepGC
-XX:+ExplicitGCInvokesConcurrent
-XX:+CMSClassUnloadingEnabled
-XX:+AggressiveOpts
-XX:+HeapDumpOnOutOfMemoryError
-XX:OnOutOfMemoryError=kill -9 %p
-XX:PermSize=150M
-XX:MaxPermSize=150M
-XX:ReservedCodeCacheSize=150M
-Xbootclasspath/p:/var/presto/installation/lib/floatingdecimal-0.1.jar
```

設定ファイルです。
あくまで一例です。(最小構成らしいです。)
パラメータは各自で調整してください。

``` config.properties
coordinator=true
datasources=jmx
http-server.http.port=8080
presto-metastore.db.type=h2
presto-metastore.db.filename=var/db/MetaStore
task.max-memory=1GB
discovery-server.enabled=true
discovery.uri=http://example.net:8080
```

ログ設定です。
DEBUG, INFO, WARN, ERRORがあるようです。

``` log.properties
com.facebook.presto=DEBUG
```

カタログ。JMXの場合

``` jmx.properties
connector.name=jmx
```

カタログ。Apache Hadoop 1.xの場合

``` hive.properties
connector.name=hive-hadoop1
hive.metastore.uri=thrift://example.net:9083
```

カタログ。Cloudera CDH4の場合

``` hive.properties
connector.name=hive-cdh4
hive.metastore.uri=thrift://example.net:9083
```

### 最後に
---------------------------------------

Facebookないでつかわれてはいるもののまだまだ、開発中なところもあるのでセットアップが若干面倒です。

2014年に流行りそうなので、期待してます。
というか、これ使ってなんか作りたいです。