1

GROUP BY とネストされた FOREACH を実行する豚のスクリプトを実行していますが、1 つまたは 2 つの削減タスクのために実行に数時間かかります。例えば:

B = GROUP A BY (fld1, fld2) parallel 50;

C = FOREACH B {
   U = A.fld1;
   DIST = DISTINCT U;
   GENERATE FLATTEN(group), COUNT_STAR(DIST);
}

遅いタスクのカウンターを調べたところ、2 つのレデューサーが他のタスクよりも多くのデータを処理しているように見えることがわかりました。基本的に、私の理解では、データは非常に偏っているため、「遅い」タスクは実際には速いタスクよりも多くの作業を行っています。パフォーマンスを向上させる方法を知りたいのですが?並列処理を増やして作業を分割しようとするのは嫌いですが、それが唯一の方法ですか?

4

1 に答える 1

2

最初のオプションは、カスタム パーティショナーを使用することです。詳細については、 のドキュメントをGROUP参照してください (PARTITION BY具体的には を参照してください)。残念ながら、おそらくここで独自のカスタム パーティショナーを作成する必要があります。カスタム パーティショナーで、キーの最初の巨大なセットをレデューサー 0 に送信し、次のセットをレデューサー 1 に送信してから、残りのキーに対して標準のハッシュ パーティショニングを実行します。これが行うことは、1 つのレデューサーが大きなものを排他的に処理できるようにし、他のレデューサーが複数のキー セットを取得できるようにすることです。ただし、これは常に悪いスキューの問題を解決するとは限りません。

これら 2 つの膨大なデータ セットのカウントはどの程度価値がありますか? NULLまたは空の文字列などの場合、大きなスキューが多く見られます。それほど価値がない場合は、GROUP BY.

于 2012-10-15T02:11:58.017 に答える