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 |
参考リンク・文献
- 作者: Tom White,Doug Cutting
- 出版社/メーカー: Oreilly & Associates Inc
- 発売日: 2010/10/14
- メディア: ペーパーバック
- 購入: 2人 クリック: 149回
- この商品を含むブログ (14件) を見る