【Facebook Presto:2】Presto Hive Perfomance Test (Hive-CDH4 Plugin)

【Facebook Presto:1】Presto 3Node で、動かす (Hive-CDH4 Plugin) - Guutaraの日記
で作成した、環境にてテストをしてみたので、簡単に記述しておきます。

2014-01-10 に、追記・訂正があります。Prestoが遅かった原因です。

Memory

jvm.config の -Xmx を増加してみました。
結果としては、処理スピードに効果はありませんでした。

config.properties の、task.max-memory も、増減してみましたが
処理スピードに変化はありませんでした。
基本的に、task.max-memory は、Joinの結果の大きさに関係するだけのようです。

以下、jvm.comfigの変更した結果のみ記述しておきます。

[root@data2 ~]# vi /opt/presto-server-0.56/etc/jvm.config 
[root@data2 ~]# cat /opt/presto-server-0.56/etc/jvm.config 
-server
-Xmx8G
-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:/opt/presto-server-0.56/lib/floatingdecimal-0.1.jar

[root@data3 ~]# vi /opt/presto-server-0.56/etc/jvm.config
[root@data3 ~]# cat /opt/presto-server-0.56/etc/jvm.config
-server
-Xmx8G
-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:/opt/presto-server-0.56/lib/floatingdecimal-0.1.jar

[root@data4 ~]# vi /opt/presto-server-0.56/etc/jvm.config 
[root@data4 ~]# cat /opt/presto-server-0.56/etc/jvm.config 
-server
-Xmx8G
-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:/opt/presto-server-0.56/lib/floatingdecimal-0.1.jar

再起動します。

[root@data2 ~]# ps aux | grep presto
root     16298  0.0  0.0 107516   964 pts/1    S+   15:35   0:00 grep presto
[root@data2 ~]# /opt/presto-server-0.56/bin/launcher start
Started as 22474
[root@data2 ~]# ps aux | grep presto
root     22474  138  0.8 11010252 140820 ?     Ssl  15:35   0:04 java -cp /opt/presto-server-0.56/lib/* -server -Xmx8G -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:/opt/presto-server-0.56/lib/floatingdecimal-0.1.jar -Dlog.output-file=/var/presto/data/var/log/server.log -Dnode.data-dir=/var/presto/data -Dnode.id=ffffffff-ffff-ffff-ffff-ffffffffffff -Dnode.environment=production -Dlog.enable-console=false -Dlog.levels-file=/opt/presto-server-0.56/etc/log.properties -Dconfig=/opt/presto-server-0.56/etc/config.properties com.facebook.presto.server.PrestoServer
root     24251  0.0  0.0 107516   964 pts/1    S+   15:35   0:00 grep presto
[root@data2 ~]# free -m
             total       used       free     shared    buffers     cached
Mem:         15936      13470       2466          0        578       9658
-/+ buffers/cache:       3233      12703
Swap:        16383        146      16237


[root@data3 ~]# ps aux | grep presto
root      3547  0.0  0.0 107508   972 pts/0    S+   15:36   0:00 grep presto
[root@data3 ~]# /opt/presto-server-0.56/bin/launcher start
Started as 3589
[root@data3 ~]# ps aux | grep presto
root      3589  196  1.2 14870856 202196 ?     Ssl  15:36   0:09 java -cp /opt/presto-server-0.56/lib/* -server -Xmx8G -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:/opt/presto-server-0.56/lib/floatingdecimal-0.1.jar -Dlog.output-file=/var/presto/data/var/log/server.log -Dnode.data-dir=/var/presto/data -Dnode.id=3fffffff-ffff-ffff-ffff-ffffffffffff -Dnode.environment=production -Dlog.enable-console=false -Dlog.levels-file=/opt/presto-server-0.56/etc/log.properties -Dconfig=/opt/presto-server-0.56/etc/config.properties com.facebook.presto.server.PrestoServer
root      3691  0.0  0.0 107508   972 pts/0    S+   15:37   0:00 grep presto
[root@data3 ~]# free -m
             total       used       free     shared    buffers     cached
Mem:         15936      14870       1066          0        550       8823
-/+ buffers/cache:       5496      10440
Swap:        16383         15      16368


[root@data4 ~]# /opt/presto-server-0.56/bin/launcher start
Started as 30846
[root@data4 ~]# ps aux | grep presto
root     30846  198  1.5 17656772 250956 ?     Ssl  15:37   0:15 java -cp /opt/presto-server-0.56/lib/* -server -Xmx8G -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:/opt/presto-server-0.56/lib/floatingdecimal-0.1.jar -Dlog.output-file=/var/presto/data/var/log/server.log -Dnode.data-dir=/var/presto/data -Dnode.id=4fffffff-ffff-ffff-ffff-ffffffffffff -Dnode.environment=production -Dlog.enable-console=false -Dlog.levels-file=/opt/presto-server-0.56/etc/log.properties -Dconfig=/opt/presto-server-0.56/etc/config.properties com.facebook.presto.server.PrestoServer
root     31099  0.0  0.0 107508   988 pts/0    S+   15:38   0:00 grep presto
[root@psdata4 ~]# free -m 
             total       used       free     shared    buffers     cached
Mem:         15936      14475       1461          0        358      11819
-/+ buffers/cache:       2297      13639
Swap:        16383          1      16382
[root@data4 ~]# 


実行テストの結果です。
変更前

presto:default> select name,count(1) from oracle_sysstat where name like '%physical%' group by name;
.
.
Splits: 21 total, 15 done (71.43%)
2:42 [9.96M rows, 1GB] [61.6K rows/s, 6.36MB/s]


変更後

presto:default> select name,count(1) from oracle_sysstat where name like '%physical%' group by name;
.
.
Splits: 21 total, 16 done (76.19%)
2:50 [9.97M rows, 1.01GB] [58.6K rows/s, 6.05MB/s]

HIVE より遅い問題。

実行時間が、HIVEよりも遅い問題が発生していました。
原因としては、HIVEの外部テーブルを使用し、外部テーブルがフラットなファイルになっていた為でした。

原因としては、独自のSerDeを使用していた為でした。

外部テーブルからHIVE内に取り込み、バイナリにした結果、高速化しました。
HIVEで実行した場合も、速度の向上はありましたが、Prestoは、劇的に高速化しました。


原因が、外部テーブルか、フラットなせいかは、不明です。ただ、presto のml には、rcファイルにしないと駄目だと言う記述が散見されていました。

prestoのmlには、RCFileにしないと遅いという話がありましたが、今回程度の大きさだと、あまり差はありませんでした。

バイナリのサイズは、以下の感じです。

_hive は、HIVEで、create tableしたものです。
_prestoは。prestoで、create tableしました。

882629318  /user/hive/warehouse/oracle_sysstat_hive
868295034  /user/hive/warehouse/oracle_sysstat_presto
presto 実行結果

以下の処理を流しました。

presto:default> select name,count(1) from oracle_sysstat where name like '%physical%' group by name;

変更前
約3分

Query 20140108_072301_00003_xmb5p, FINISHED, 3 nodes
Splits: 21 total, 18 done (85.71%)
2:50 [10M rows, 1.01GB] [58.9K rows/s, 6.08MB/s]

変更後
2秒

Query 20140108_090836_00052_xmb5p, FINISHED, 3 nodes
Splits: 19 total, 16 done (84.21%)
0:02 [9.81M rows, 821MB] [4.17M rows/s, 349MB/s]
HIVE 実行結果

実行したものは、同じです。

変更前
45秒

.
.
.
MapReduce Total cumulative CPU time: 3 minutes 11 seconds 180 msec
Ended Job = job_201311121157_6392
MapReduce Jobs Launched: 
Job 0: Map: 5  Reduce: 2   Cumulative CPU: 191.18 sec   HDFS Read: 1082379240 HDFS Write: 867 SUCCESS
Total MapReduce CPU Time Spent: 3 minutes 11 seconds 180 msec
.
.
Time taken: 45.015 seconds

変更後
19秒

.
.
.
MapReduce Total cumulative CPU time: 50 seconds 260 msec
Ended Job = job_201311121157_6431
MapReduce Jobs Launched: 
Job 0: Map: 4  Reduce: 1   Cumulative CPU: 50.26 sec   HDFS Read: 280179952 HDFS Write: 867 SUCCESS
Total MapReduce CPU Time Spent: 50 seconds 260 msec
.
.
Time taken: 17.889 seconds

まとめ

これは、どんどん、使ったほうが良いと思います。
実際、どういう理由で、こんだけ速いのか? heapが、いらないのかが不思議で仕方ないです。


今後も、試してみようと思います。


なんか、同じ環境で、spark + shark でやったより、速いんだよなぁ。。