web-dev-qa-db-ja.com

Apache Pig:レデューサーのフラット化と並列実行

ApachePigスクリプトを実装しました。スクリプトを実行すると、特定のステップに対して多くのマッパーが生成されますが、そのステップに対しては1つのレデューサーしかありません。この状態(多くのマッパー、1つのレデューサー)のため、単一のレデューサーが実行されている間、Hadoopクラスターはほとんどアイドル状態です。クラスターのリソースをより有効に活用するために、多くのレデューサーを並行して実行したいと思います。

SET DEFAULT_PARALLELコマンドを使用してPigスクリプトで並列処理を設定した場合でも、レデューサーは1つしかありません。

問題を発行しているコード部分は次のとおりです。

SET DEFAULT_PARALLEL 5;
inputData = LOAD 'input_data.txt' AS (group_name:chararray, item:int);
inputDataGrouped = GROUP inputData BY (group_name);
-- The GeneratePairsUDF generates a bag containing pairs of integers, e.g. {(1, 5), (1, 8), ..., (8, 5)}
pairs = FOREACH inputDataGrouped GENERATE GeneratePairsUDF(inputData.item) AS pairs_bag;
pairsFlat = FOREACH pairs GENERATE FLATTEN(pairs_bag) AS (item1:int, item2:int);

'inputData'および 'inputDataGrouped'エイリアスはマッパーで計算されます。

レデューサーの「pairs」と「pairsFlat」。

FLATTENコマンド(pairsFlat = FOREACH pair GENERATE FLATTEN(pairs_bag)AS(item1:int、item2:int);)で行を削除してスクリプトを変更すると、実行の結果は5つのレデューサーになります(したがって、並列実行になります)。 。

FLATTENコマンドが問題であり、多くのレデューサーが作成されるのを回避しているようです。

FLATTENと同じ結果に到達するが、スクリプトを並行して(多くのレデューサーを使用して)実行するにはどうすればよいですか?

編集:

(上記のように)2つのFOREACHがある場合のEXPLAINプラン:

Map Plan
inputDataGrouped: Local Rearrange[Tuple]{chararray}(false) - scope-32
|   |
|   Project[chararray][0] - scope-33
|
|---inputData: New For Each(false,false)[bag] - scope-29
    |   |
    |   Cast[chararray] - scope-24
    |   |
    |   |---Project[bytearray][0] - scope-23
    |   |
    |   Cast[int] - scope-27
    |   |
    |   |---Project[bytearray][1] - scope-26
    |
    |---inputData: Load(file:///input_data.txt:org.Apache.pig.builtin.PigStorage) - scope-22--------


Reduce Plan
pairsFlat: Store(fakefile:org.Apache.pig.builtin.PigStorage) - scope-42
|
|---pairsFlat: New For Each(true)[bag] - scope-41
    |   |
    |   Project[bag][0] - scope-39
    |
    |---pairs: New For Each(false)[bag] - scope-38
        |   |
        |   POUserFunc(GeneratePairsUDF)[bag] - scope-36
        |   |
        |   |---Project[bag][1] - scope-35
        |       |
        |       |---Project[bag][1] - scope-34
        |
        |---inputDataGrouped: Package[Tuple]{chararray} - scope-31--------
Global sort: false

FLATTENがUDFをラップしているFOREACHが1つしかない場合のEXPLAINプラン:

Map Plan
inputDataGrouped: Local Rearrange[Tuple]{chararray}(false) - scope-29
|   |
|   Project[chararray][0] - scope-30
|
|---inputData: New For Each(false,false)[bag] - scope-26
    |   |
    |   Cast[chararray] - scope-21
    |   |
    |   |---Project[bytearray][0] - scope-20
    |   |
    |   Cast[int] - scope-24
    |   |
    |   |---Project[bytearray][1] - scope-23
    |
    |---inputData: Load(file:///input_data.txt:org.Apache.pig.builtin.PigStorage) - scope-19--------


Reduce Plan
pairs: Store(fakefile:org.Apache.pig.builtin.PigStorage) - scope-36
|
|---pairs: New For Each(true)[bag] - scope-35
    |   |
    |   POUserFunc(GeneratePairsUDF)[bag] - scope-33
    |   |
    |   |---Project[bag][1] - scope-32
    |       |
    |       |---Project[bag][1] - scope-31
    |
    |---inputDataGrouped: Package[Tuple]{chararray} - scope-28--------
Global sort: false
35
user2964640

Pigがpigスクリプトのすべてのステップで構成DEFAULT_PARALLEL値を使用するかどうかは定かではありません。時間がかかると感じる特定の参加/グループステップ(この場合はGROUPステップ)と一緒にPARALLELを試してください。

 inputDataGrouped = GROUP inputData BY (group_name) PARALLEL 67;

それでも機能しない場合は、歪度の問題についてデータを確認する必要がある場合があります。

3
Ashish

「デフォルトの並列設定」と「PARALLEL100」を試しましたが、うまくいきませんでした。 Pigはまだ1つのレデューサーを使用しています。

レコードごとに1から100までの乱数を生成し、これらのレコードをその乱数でグループ化する必要があることがわかりました。

グループ化に時間を浪費していますが、より多くのレデューサーを使用できるようになったため、はるかに高速になりました。

コードは次のとおりです(SUBMITTERは私自身のUDFです):

tmpRecord = FOREACH record GENERATE (int)(RANDOM()*100.0) as rnd, data;
groupTmpRecord = GROUP tmpRecord BY rnd;
result = FOREACH groupTmpRecord GENERATE FLATTEN(SUBMITTER(tmpRecord));
1
user3110379

データに歪度があると思います。指数関数的に大きな出力を生成しているマッパーはごく少数です。データ内のキーの分布を確認してください。同様のデータには、多数のレコードを持つ少数のグループが含まれています。

1
Tanveer

あなたの質問に答えるには、最初に、豚が実行するレデューサーの数を知る必要があります-グローバル再配置プロセス。私の理解によると、Generate/Projectionは単一のレデューサーを必要としないはずだからです。 Flattenについて同じことを言うことはできません。ただし、常識から、フラット化の目的は、バッグからタプルのネストを解除することであり、その逆も同様であることがわかっています。そのためには、バッグに属するすべてのタプルが同じレデューサーで確実に利用可能である必要があります。私は間違っているかもしれません。しかし、誰かがこのユーザーに答えを得るためにここに何かを追加できますか?

0
nitinr708