Hiveクエリチューニングメモ

Hadoop本2版を買ったその一週間後にDeals of the day で半額セールやられて死にたくなったので腹いせに書く

はじめに

  • ここに書いてあるのは全部参考リンク・文献からひっぱってきただけで、ほとんど全部検証してない。間違いがあればなるべく早めに更新するよう努力はするが、鵜呑みにして何が起きても自己責任で。
  • Hive のクエリチューニングに関するメモ書きである。以下のことは「書いていない」
    • Hadoop自体のチューニング
    • Hive のクエリチューニング以外の話
      • 例えば、圧縮ファイルを Hive 上で扱うにはどうするかとか

JOIN

一番左のテーブルに最も大きなテーブルを持ってくる
  • 一番左のテーブルがMRでいう入力データとして流れる。インナーテーブルのデータはメモリに保持される。
同一 JOIN キー
  • 通常は 1 JOIN = 1 MR ジョブだが、同一の JOIN キーを使っている限りどれだけテーブルつないでも 1 MR ジョブ。
  • OUTER JOIN でも同じようになる。
Map Join
  • 片方のテーブルをハッシュテーブル上に読み込んでおいて Map だけで JOIN してしまう
  • コメントみたいな構文だがこれでいいらしい
  • 当然メモリに載るだけキャッシュできる

INSERT INTO TABLE pv_users
SELECT /*+ MAPJOIN(pv) */ pv.pageid, u.age
FROM page_view pv JOIN user u
ON (pv.userid = u.userid);

hive.join.emit.interval 1000
hive.mapjoin.size.key 10000
hive.mapjoin.cache.numrows 10000

GROUP BY

Map サイド部分集約とデータのロードバランシング

名前でなんとなく想像はつくが、パラメータの細かい意味は不明

hive.map.aggr true
hive.groupby.skewindata false
hive.groupby.mapaggr.checkinterval 100000
hive.map.aggr.hash.percentmemory 0.5
hive.map.aggr.hash.min.reduction 0.5
マルチ GROUP BY
  • 同一テーブルから GROUP BY を2回叩くと MR を4回実行することになるが、こうすれば最初の1回分が減り3回のMRで済む。
  • n回GROUP BY だったら2n回のMRのところがn+1回で済むということ。
  • 可能な限り利用すること、と書いてある

FROM pv_users
INSERT OVERWRITE TABLE pv_gender_sum
SELECT gender, count(DISTINCT userid), count(userid)
GROUP BY gender
INSERT OVERWRITE TABLE pv_age_sum
SELECT age, count(DISTINCT userid)
GROUP BY age

ソート

ORDER BY
  • Reducer が 1つしか動かないことに注意。
  • 要するに何も考えずにテラソートみたいなことをやると死ぬ。
SORT BY
  • 異なる Reduce タスクごとにソート。
  • 全体のソートをしてるわけじゃないことに注意。
DISTRIBUTE BY
  • ここで指定したカラムが同じ値の行は同じ reducer に行くことを保証する。
CLUSTER BY
  • SORT BY と DISTRIBUTED BY で同一カラムを指定するのと同じ。

その他

小さいファイルのマージ
hive.merge.mapfiles true
hive.merge.mapredfiles false
hive.merge.size.per.task 256*1000*1000

参考リンク・文献

Hadoop: The Definitive Guide

Hadoop: The Definitive Guide