35

Apache Pig スクリプトを実装しました。スクリプトを実行すると、特定のステップに対して多くのマッパーが生成されますが、そのステップに対してレデューサーは 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 ペア GENERATE FLATTEN(pairs_bag) AS (i​​tem1: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

UDF をラップする FLATTEN を持つ 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
4

4 に答える 4

3

pig が pig スクリプトのすべてのステップで構成 DEFAULT_PARALLEL 値を使用するかどうかは保証されません。時間がかかると感じる特定の結合/グループステップ(あなたの場合はグループステップ)とともにPARALLELを試してください。

 inputDataGrouped = GROUP inputData BY (group_name) PARALLEL 67;

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

于 2014-06-17T11:12:35.513 に答える
0

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

于 2016-10-08T01:15:11.293 に答える