Prestoを試してみた

Prestoを試してみたのでまとめておきます。

Prestoとは

Presto
Facebookが開発したSQLクエリエンジンです。
HDFS上のデータに対してSQLで処理が出来ます。

HiveでもSQLライクに処理は出来るのですがHiveはMapReduceで動作する為、処理が遅く
PrestoはMapRedcueを使わない為、高速に処理できます(ImpalaもPrestoと同様)

Prestoアーキテクチャ

こちら にあるとおりCoodinatorとWorkerで動作します。
HiveのMetadataを参照してHDFS上のデータを読み込みます。

検証構成

サンプルデータはこちらを使用しました。
HDFSとHiveの構築はCloudera-managerからサクッと行いました。
今回はCoordinator1台+Worker2台構成です。

Prestoインストール

こちらを参考にインストールを行います。
ダウンロード

# wget http://central.maven.org/maven2/com/facebook/presto/presto-server/0.74/presto-server-0.74.tar.gz

インストール

# tar zxvf presto-server-0.74.tar.gz
# cd presto-server-0.74
# mkdir etc  ←etcディレクトリを作成

etcディレクトリ内に下記4つの設定ファイルを作成します。
・node.properties
jvm.config
・config.properties
・log.properties

node.properties

# vim etc/node.properties 

node.environment=production ←Coodinator+Worker3台とも同じ設定
node.id=ffffffff-ffff-ffff-ffff-ffffffffffff ←3台でかぶらないように違うIDに設定
node.data-dir=/var/presto/data ←データディレクトリ
# mkdir -p /var/presto/data ←データディレクトリ作成

jvm.config
サーバのリソースによってXmxの値は適宜変更

# vim etc/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の設定

# vim etc/config.properties

coordinator=true
node-scheduler.include-coordinator=false
http-server.http.port=8080
task.max-memory=1GB
discovery-server.enabled=true
discovery.uri=http://Coordinatorのホスト名:8080

Workerの設定

# vim etc/config.properties

coordinator=false
http-server.http.port=8080
task.max-memory=1GB
discovery.uri=http://Coordinatorのホスト名:8080

log.properties

# vim etc/log.properties

com.facebook.presto=INFO

Catalog Propertiesの設定
どのデータソースに接続するか設定します。
今回はCDH5(Hive Metasoterが構築済みで9083で待ち受けていること)です。

# mkdir etc/catalog ←catalogディレクトリ作成
# vim etc/catalog/hive.properties

connector.name=hive-cdh5
hive.metastore.uri=thrift://Coordinatorのホスト名:9083

プロセス起動

# bin/launcher run ←フォアグランドで起動してみてエラーがないことを確認します。    

エラーが出なければプロセスを止めてバックグラウンドで起動します。

# bin/launcher start

CLIインストール

Prestoを操作するCLIをインストールします。

# wget http://central.maven.org/maven2/com/facebook/presto/presto-cli/0.74/presto-cli-0.74-executable.jar
# mv presto-cli-0.74-executable.jar presto ←リネーム
# chmod +x presto  ←実行権付与
# ./presto --server localhost:8080 --catalog hive --schema default ←起動

Presto操作

テーブル一覧取得

presto:default> show tables;
  Table
---------
 dnsdata
(1 row)

Query 20140804_064936_00003_x2hxh, FINISHED, 2 nodes
Splits: 2 total, 2 done (100.00%)
0:01 [1 rows, 96B] [1 rows/s, 127B/s]

あらかじめHiveで定義していたサンプルデータのテーブルが取得できました。

クエリ実行

presto:default> select count (*) from dnsdata;
  _col0
---------
 2697737
(1 row)

Query 20140804_070928_00006_x2hxh, FINISHED, 2 nodes
Splits: 7 total, 7 done (100.00%)
0:05 [2.7M rows, 196MB] [548K rows/s, 39.9MB/s]

参考

ImpalaとHiveでも同じデータに対して同じクエリを実行してみました。
Impala

[xxxxxx.local:21000] > show tables;
Query: show tables
+---------+
| name    |
+---------+
| dnsdata |
+---------+
Returned 1 row(s) in 0.10s
[xxxxxx.local:21000] >
[xxxxxx.local:21000] > select count (*) from dnsdata;
Query: select count (*) from dnsdata
+----------+
| count(*) |
+----------+
| 2697737  |
+----------+
Returned 1 row(s) in 0.73s

Hive

hive> show tables;
OK
dnsdata
Time taken: 1.048 seconds, Fetched: 1 row(s)

hive> select count (*) from dnsdata;
Total MapReduce jobs = 1
Launching Job 1 out of 1
Number of reduce tasks determined at compile time: 1
In order to change the average load for a reducer (in bytes):
  set hive.exec.reducers.bytes.per.reducer=
In order to limit the maximum number of reducers:
  set hive.exec.reducers.max=
In order to set a constant number of reducers:
  set mapred.reduce.tasks=
Starting Job = job_1407131413155_0002, Tracking URL = http://xxxxxxxlocal:8088/proxy/application_1407131413155_0002/
Kill Command = /opt/cloudera/parcels/CDH-5.1.0-1.cdh5.1.0.p0.53/lib/hadoop/bin/hadoop job  -kill job_1407131413155_0002
Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 1
2014-08-04 03:19:59,889 Stage-1 map = 0%,  reduce = 0%
2014-08-04 03:20:10,333 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 4.37 sec
2014-08-04 03:20:11,376 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 4.37 sec
2014-08-04 03:20:12,424 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 4.37 sec
2014-08-04 03:20:13,469 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 4.37 sec
2014-08-04 03:20:14,523 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 4.37 sec
2014-08-04 03:20:15,565 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 4.37 sec
2014-08-04 03:20:16,607 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 4.37 sec
2014-08-04 03:20:17,649 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 4.37 sec
2014-08-04 03:20:18,691 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 4.37 sec
2014-08-04 03:20:19,739 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 4.37 sec
2014-08-04 03:20:20,787 Stage-1 map = 100%,  reduce = 100%, Cumulative CPU 6.09 sec
2014-08-04 03:20:21,834 Stage-1 map = 100%,  reduce = 100%, Cumulative CPU 6.09 sec
MapReduce Total cumulative CPU time: 6 seconds 90 msec
Ended Job = job_1407131413155_0002
MapReduce Jobs Launched:
Job 0: Map: 1  Reduce: 1   Cumulative CPU: 6.09 sec   HDFS Read: 205721199 HDFS Write: 8 SUCCESS
Total MapReduce CPU Time Spent: 6 seconds 90 msec
OK
2697737
Time taken: 38.692 seconds, Fetched: 1 row(s)

まとめ

Presto/ImpalaはMapReduceを使用していないので実行速度がかなり速いです。
テーブル定義出来るデータであれば積極的に使いたいところです。
安定して動くかどうか検証は必須でしょうが。
(ノ´▽`)ノ{+++THANK YOU+++}ヽ(´▽`ヽ)

Hadoopオペレーション ―システム運用管理ガイド

Hadoopオペレーション ―システム運用管理ガイド

Hadoop徹底入門 第2版 オープンソース分散処理環境の構築

Hadoop徹底入門 第2版 オープンソース分散処理環境の構築