2011-06-21 29 views
2

私はHiveのcollect_set()関数について知りました。開発3ノードクラスタでジョブを開始しました。Hive(Hadoop)のCOLLECT_SET()

私は約10GBしか処理できません。しかし、仕事は文字通り永遠に取っています。私は、collect_set()の実装にバグがあったり、自分のコードのバグがあったり、collect_set()関数が本当にリソースを消費していると思います。ここで

は(しゃれが意図していない)ハイブのための私のSQLです:

INSERT OVERWRITE TABLE sequence_result_1 
SELECT sess.session_key as session_key, 
     sess.remote_address as remote_address, 
     sess.hit_count as hit_count, 
     COLLECT_SET(evt.event_id) as event_set, 
     hit.rsp_timestamp as hit_timestamp, 
     sess.site_link as site_link 
    FROM site_session sess 
     JOIN (SELECT * FROM site_event 
       WHERE event_id = 274 OR event_id = 284 OR event_id = 55 OR event_id = 151) evt 
      ON (sess.session_key = evt.session_key) 
     JOIN site_hit hit ON (sess.session_key = evt.session_key) 
GROUP BY sess.session_key, sess.remote_address, sess.hit_count, hit.rsp_timestamp, sess.site_link 
ORDER BY hit_timestamp; 

4 MR渡しがあります。最初は約30秒かかりました。 2番目のマップには約1分かかりました。そして、2回目の削減のほとんどは約2分かかりました。過去2時間で97.71%から97.73%に増加しています。これは正しいですか?私はいくつかの問題がなければならないと思う。私はログを見て、それが正常かどうかはわかりません。

[ログのサンプル]

2011-06-21 16:32:22,715 WARN org.apache.hadoop.hive.ql.exec.GroupByOperator: Hash Tbl flush: #hash table = 120894 
2011-06-21 16:32:22,758 WARN org.apache.hadoop.hive.ql.exec.GroupByOperator: Hash Table flushed: new size = 108804 
2011-06-21 16:32:23,003 INFO org.apache.hadoop.hive.ql.exec.JoinOperator: 4 forwarding 5142000000 rows 
2011-06-21 16:32:23,003 INFO org.apache.hadoop.hive.ql.exec.SelectOperator: 5 forwarding 5142000000 rows 
2011-06-21 16:32:24,138 INFO org.apache.hadoop.hive.ql.exec.JoinOperator: 4 forwarding 5143000000 rows 
2011-06-21 16:32:24,138 INFO org.apache.hadoop.hive.ql.exec.SelectOperator: 5 forwarding 5143000000 rows 
2011-06-21 16:32:24,725 WARN org.apache.hadoop.hive.ql.exec.GroupByOperator: Hash Tbl flush: #hash table = 120894 
2011-06-21 16:32:24,768 INFO org.apache.hadoop.hive.ql.exec.GroupByOperator: 6 forwarding 42000000 rows 
2011-06-21 16:32:24,771 WARN org.apache.hadoop.hive.ql.exec.GroupByOperator: Hash Table flushed: new size = 108804 
2011-06-21 16:32:25,338 INFO org.apache.hadoop.hive.ql.exec.JoinOperator: 4 forwarding 5144000000 rows 
2011-06-21 16:32:25,338 INFO org.apache.hadoop.hive.ql.exec.SelectOperator: 5 forwarding 5144000000 rows 
2011-06-21 16:32:26,467 INFO org.apache.hadoop.hive.ql.exec.JoinOperator: 4 forwarding 5145000000 rows 
2011-06-21 16:32:26,468 INFO org.apache.hadoop.hive.ql.exec.SelectOperator: 5 forwarding 5145000000 rows 

私はこれでかなり新たなんだ、と(collect_setで動作するようにしよう)とハイブアレイが深い終わりオフ私を運転しています。事前に

感謝:)私がしようとするだろう

答えて

2

大失敗。下の私の解決策。結局のところ、COLLECT_SETには何の問題もなく、無限であったアイテムのすべてを集めようとしていました。

なぜですか?私はセットの一部ではない何かに参加したので。第二に、今では、正しく言う条件で同じにするために使用される加入hit.session_key = evt.session_key

INSERT OVERWRITE TABLE sequence_result_1 
SELECT sess.session_key as session_key, 
     sess.remote_address as remote_address, 
     sess.hit_count as hit_count, 
     COLLECT_SET(evt.event_id) as event_set, 
     hit.rsp_timestamp as hit_timestamp, 
     sess.site_link as site_link 
    FROM tealeaf_session sess 
     JOIN site_event evt ON (sess.session_key = evt.session_key) 
     JOIN site_hit hit ON (sess.session_key = hit.session_key) 
    WHERE evt.event_id IN(274,284,55,151) 
GROUP BY sess.session_key, sess.remote_address, sess.hit_count, hit.rsp_timestamp, sess.site_link 
ORDER BY hit_timestamp; 
0

まず最初は内(にそれを句と変更外へのevent_idフィルタを移動し、その後、サブ選択を排除し、ちょうどsite_eventする参加なっています) 。だから、のようなもの:

SELECT sess.session_key as session_key, 
    sess.remote_address as remote_address, 
    sess.hit_count as hit_count, 
    COLLECT_SET(evt.event_id) as event_set, 
    hit.rsp_timestamp as hit_timestamp, 
    sess.site_link as site_link 
FROM site_session sess 
    JOIN site_event evt ON (sess.session_key = evt.session_key) 
    JOIN site_hit hit ON (sess.session_key = evt.session_key) 
WHERE evt.event_id in(274,284,55151) 
GROUP BY sess.session_key, sess.remote_address, sess.hit_count, hit.rsp_timestamp, sess.site_link 
ORDER BY hit_timestamp; 

はまた、私は、各テーブルのサイズを知らないが、ハイブでは、一般的に、あなたが参加するの右側にあなたの最大のテーブル(通常は自分のファクトテーブル)を維持したいですメモリ使用量を削減します。その理由は、Hiveが結合の左辺をメモリに保持しようとし、結合を達成するために右辺をストリームするからです。

+0

は事実テーブルの右側のルールを知りませんでしたが、それはすでにここケースです。心に留めておいてよかったです。私はそれを試し、あなたに知らせるでしょう。 – batman

+0

起動しましたが、最初の部分はやや速かったですが、今は97.71%の周辺で立ち往生しています。これはcollect_set()関数を実行するためのしきい値の割合である可能性があります。 – batman

+0

全く別の問題。ありがとう、上記の私の答え。 – batman

0

私は、返された行ごとにCOLLECT_SET()が生成されていると思います。 戻りたい行ごとに、COLLECT_SETによって生成された配列全体が返されます。税金がかかり、長い時間がかかるかもしれません。

COLLECT_SETでパフォーマンスを確認してください。それが十分に速い場合は、COLLECT_SETの計算をサブクエリにプッシュし、次にその計算を行う代わりにその列を使用します。

私はCOLLECT_SETを使用していないか、あなたの投稿から何らかのテストを行っています。それは私が最初に疑っていたものです。

+0

興味深いアイデア。私は明日更新します。 – batman

+0

違う問題があります。ありがとう、上記の私の答え。 – batman

関連する問題