【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 でやったより、速いんだよなぁ。。