2

ハイブ クエリがハングしていて、その理由がわかりません (hadoop 0.20.1、ハイブ 0.9 を使用)。

クエリ:

SELECT 
   a.field1 FROM table_1 a 
LEFT SEMI JOIN 
   (SELECT DISTINCT(usrId) FROM table_2 b 
       WHERE soemthing=true ORDER BY rand() limit 1000) random_user_ids 
WHERE a.usrId=random_user_ids.usrId

EXPLAINは私に返してくれます:

STAGE DEPENDENCIES:
  Stage-1 is a root stage
  Stage-2 depends on stages: Stage-1
  Stage-3 depends on stages: Stage-2
  Stage-0 is a root stage

データセット

  • テーブル内の最大 2 億エントリ
  • table_1.usrId と table_1 の関係は約 1:40 である必要があります。つまり、上記のクエリでは 1000*40=40000 が返されます。

所見:

  • ジョブは最終段階 3 で 33% (reduce > sort) でハングし、そこで結合が行われます (結合結果は約 40000 です)。
  • 遅いのは別として、reduce > sort がステージ 3 の一部である理由は何ですか? 注文するのではなく、何かに参加するだけです
  • レデューサーのサイズは 1 しかありません (並べ替えのため?)。これは、スケーリングしないため、ほとんど常に悪いことです。

さらに入力が必要な場合 (例: より詳細な EXPLAIN 情報、より多くのクラスター情報) を教えてください。

ありがとう!

4

1 に答える 1

2

JOIN 条件は、WHERE 句ではなく、 ON句に含める必要があります。

構文の例:

SELECT a.key, a.val
FROM a LEFT SEMI JOIN b ON (a.key = b.key)
于 2013-07-11T14:58:40.637 に答える