2016-03-22 14 views
0

ハイブで結合操作をしています。しかし、減速機が99%に達すると、減速機が動かなくなります。Hiveを使用して歪んだデータを処理する方法は?

次に、テーブルにスキューデータがあることがわかりました。 Ex。テーブルAには100万のデータがあり、テーブルBには10kしかありません。テーブルAには80%の値があり、残りはその他です。だからハイブレデューサーはその価値にこだわりました。ここで

は私のクエリです:

INSERT INTO TABLE xyz SELECT m.name, m.country, m.user_type, m.category FROM A m JOIN category n ON (m.name = n.name) where country=2 GROUP BY m.name, m.country, m.user_type, m.category; 

だから可能な解決策を提案してください。どのように私はこの種のデータに対して結合操作を処理できますか?

+0

http://stackoverflow.com/questions/32370033/hive-join-optimization/32373086#32373086 –

+0

返信いただきありがとうございます@KishoreKumarSuthar。それは何かクールです。 –

答えて

1

Hive 0.10.0からは、スキューされたり変更されたりするテーブルを作成することができます(この場合、ALTERステートメントの後に作成されたパーティションは歪んでしまいます)。さらに、スキュード・テーブルは、STORED AS DIRECTORIESオプションを指定することによって、リストバケット機能を使用できます。このlinkリファレンスの使用については、Create TableSkewed Tables、およびAlter Table Skewed or Stored as Directories

:詳細については、DDLのマニュアルを参照してください。

+0

リプレイをありがとうが、私は毎日の処理のためにこのアプローチに従うことができません。 –

0

上記の問題の解決策が見つかりました。

実行ハイブ結合の前に、以下のパラメータをハイブに設定します。

set hive.optimize.skewjoin=true; 
set hive.skewjoin.key=100000; 
set hive.skewjoin.mapjoin.map.tasks=10000; 
set hive.skewjoin.mapjoin.min.split=33554432; 
set hive.exec.parallel=true; 
set hive.exec.parallel.thread.number=8; 
set hive.vectorized.execution.enabled = true; 
set hive.vectorized.execution.reduce.enabled = true; 
set hive.vectorized.execution.reduce.groupby.enabled = true; 
set hive.cbo.enable=true; 
set hive.compute.query.using.stats=true; 
set hive.stats.fetch.partition.stats=true; 
set hive.stats.fetch.column.stats=true; 
set hive.stats.autogather=true; 
set mapred.output.compress=true; 
set hive.exec.compress.output=true; 
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec; 
set hive.auto.convert.join=false; 

データサイズとクラスタサイズに応じて、いくつかのパラメータを変更する必要があります。

+0

この回答にはなぜこれがうまくいったのかについての参考があれば助けになります。たとえば、パラメータのうち4つは、コストベースの最適化を有効にしているようです:https://hortonworks.com/blog/5-ways-make-hive-queries-run-faster/ – dfrankow

関連する問題