WRT 3ノードクラスタを強制的にハイブクエリを変更します。c3.2xlargeインスタンスからなる1つの以上減速
私は2つのテーブルを持っています。表Uには約6500万レコードがあり、緯度と経度のフィールドには が含まれています。表Lには約1百万件の レコードがあり、緯度と経度も含まれています。
UはORCテーブルとして格納されます。
タスクビット3960 * acos(cos(radians(l.lat)) * cos(radians(u.lat)) * cos(radians(l.long) - radians(u.long)) + sin(radians(l.lat)) * sin(radians(u.lat))) < 10.0
あるべき緯度/経度 対の間のわずかの距離であるUレコードはL.
select l.id, count(u.id) from U u, L l where 3960 *
acos(cos(radians(l.lat)) * cos(radians(u.lat)) * cos(radians(l.long) -
radians(u.long)) + sin(radians(l.lat)) * sin(radians(u.lat))) < 10.0
group by l.id;
に位置の10マイルの半径 内に入る何を決定することである10未満マイルの制約。
問題:クエリが完了するまでに永久に取るように見えます。マップ のフェーズが比較的速く完了している間に、減少フェーズは固定されたパーセンテージ(80%ish)に固定されています
これはHiveが出す出力メッセージでこれに気づきました。私は7に mapred.reduce.tasksを設定することにより、減速の数を増やす試みたが、私は 成功しなかった1として、それは常に終わる1
: の数は、コンパイル時に決定作業を軽減します減速材の数を増やす。
This answerは、私は別の方法で私のクエリを記述多分ならば、私は以上1つの減速を強制できることを示唆しているようです。しかし、私はそれをまだできませんでした。
実行時間の見積もり:Lの単一の場所については、回答を得るのに約60秒かかります。そのアカウントでは、約700日である6000万秒かかるでしょう!あまりにも時間がかかるのでしょうか? Hadoopの場合でも
私もボックスの中央 でL内の場所で10マイルの正方形のボックスにより、10マイルで 経度緯度境界のようなaddional制約を入れて試してみましたが、かかる時間は今1つの場所のための40秒ですwhich は大きな改善ではありません。
質問:
1)どのように私は、レデューサーのより多くの数を強制することができますか? 2)実行時間の点でより良いクエリがありますか? 3)この問題の解決に役立つその他のアドバイス。
バージョン: Hadoopの - 2.7.0 のJava 1.7.0_80 ハイブ1.2。あなたはHadoopの2を使用している場合は1
で説明したように機能の一部を移行する必要があります。https://cwiki.apache.org/confluence/display/Hive/Spatial +クエリ。 –
どのバージョンのHadoopを使用していますか? Hadoop 2.xのmapreduce.job.reducesをmapreduce.job.reducesに置き換えます。 –
U x Lのクロス結合があります。交差結合は行を乗算します。 WHERE句をON句に変換することはできますか? U U INNER FROM (3960の* ACOS(COS(ラジアン(l.lat))* COS(ラジアン(u.lat))* COS(ラジアン(l.long)ON L LのJOIN - ラジアンこのような(u.long))+ sin(ラジアン(l.lat))* sin(ラジアン(u.lat)))<10.0)GROUP BY l.id – leftjoin