サマリ
社内でTezのデモを見たんだけど、非常に使い始めが簡単で、しかもクエリ高速化の効果がかなり高いので使い方をまとめておく。手順的にはビルド済みのTezをEMRのBootstrap actionでS3から配布する感じ。
Hiveの実行エンジンをMapReduceからTezに変えるだけで25%から、場合によっては50%以上も性能が上がるので、費用対効果としてはかなり高い施策だと思う。
クラスタ起動
aws emr create-cluster \
--name tez_installed_cluster \
--ami-version 3.5.0 \
--applications Name=Hive \
--instance-groups InstanceGroupType=MASTER,InstanceCount=1,InstanceType=c3.xlarge InstanceGroupType=CORE,InstanceCount=4,InstanceType=c3.xlarge \
--ec2-attributes SubnetId=YOUR_SUBNET_ID,KeyName=YOUR_KEY_PAIR \
--log-uri s3://PATH/TO/LOG/ \
--enable-debugging \
--bootstrap-actions Name=tez,Path=s3://support.elasticmapreduce/bootstrap-actions/ami/3.2.x/install-tez.beta \
--steps Name=setup-tez,Jar=s3://elasticmapreduce/libs/script-runner/script-runner.jar,Args=s3://support.elasticmapreduce/bootstrap-actions/ami/3.2.x/setup-tez.beta
ポイントはbootstrap actionで起動されるinstall-tez.beta
とsetup-tezと命名したstepで実行されるsetup-tez.beta
。install-tez.beta
でビルド済みのTezをダウンロードしてきて、setup-tez.beta
でHDFSに配置したりいろいろしてる感じ。
まあこの2行については何も変える必要はないのでコピペして動かせばOK。
Tezを使う
Tezを使うのはすごく簡単
$ hive
hive> set hive.execution.engine=tez;
これでOK。あとはHiveでいつもどおりクエリするだけ。
MapReduceとくらべてみる
AmplabのビッグデータベンチマークのRankingsテーブルを使って比べてみることにする。
hive> CREATE EXTERNAL TABLE Rankings (
pageURL STRING,
pageRank STRING,
avgDuration STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS SEQUENCEFILE
LOCATION 's3://big-data-benchmark/pavlo/sequence/1node/rankings/';
hive> select count(1) from rankings;
Status: Finished successfully
OK
17999999
ということでこの1800万行のテーブルへのクエリをMapReduceとTezで比べてみる。
MapReduce
hive> set hive.execution.engine=mr;
hive> select pagerank, count(1) from rankings group by pagerank;
Time taken: 97.975 seconds, Fetched: 3213 row(s)
Tez
hive> set hive.execution.engine=tez;
hive> select pagerank, count(1) from rankings group by pagerank;
Time taken: 72.925 seconds, Fetched: 3213 row(s)
所要時間 MR 97.975秒 vs Tez 72.925秒ということで、 劇的に とまではいかないが25%くらいの高速化はされている。もちろん、クエリの性質にも依存してると思うのでいろいろなパターンを検証してみないとより精緻な数値は出ない。
が、エンジンを変えるだけでこれだけ性能があたるというのはだいぶお得感がある。
お約束
このポストは個人のメモであり、私の所属する組織を代表するものではありません。