hadoop - tutorial - Comment gérer la mémoire des déversements chez le porc



pig vs hive (1)

Mon code ressemble à ceci:

pymt = LOAD 'pymt' USING PigStorage('|') AS ($pymt_schema);

pymt_grp = GROUP pymt BY key

results = FOREACH pymt_grp {

      /*
       *   some kind of logic, filter, count, distinct, sum, etc.
       */
}

Mais maintenant je trouve beaucoup de journaux comme ça:

org.apache.pig.impl.util.SpillableMemoryManager: Spilled an estimate of 207012796 bytes from 1 objects. init = 5439488(5312K) used = 424200488(414258K) committed = 559284224(546176K) max = 559284224(546176K)

En fait je trouve la cause, la raison majoritaire est qu'il y a une touche "hot", quelque chose comme key = 0 comme adresse ip, mais je ne veux pas filtrer cette clé. y-a-t'il une solution? J'ai implémenté l'interface algébrique et accumulatrice dans mon UDF.


J'ai eu des problèmes similaires avec des données fortement asymétriques ou DISTINCT imbriqués dans FOREACH (car PIG fera une mémoire distincte). La solution était de sortir le DISTINCT du FOREACH comme exemple voir ma réponse à Comment optimiser un groupe par une déclaration en PIG latin?

Si vous ne voulez pas faire DISTINCT avant votre SUM et COUNT que je suggérerais d'utiliser 2 GROUP BY. Le premier groupe sur la colonne Clé plus une autre colonne ou un nombre aléatoire mod 100, il agit comme un sel (pour étaler les données d'une seule clé dans plusieurs réducteurs). Than second GROUP BY juste sur la colonne Key et calculer la somme finale du groupe 1 COUNT ou Sum.

Ex:

inpt = load '/data.csv' using PigStorage(',') as (Key, Value);
view = foreach inpt generate Key, Value, ((int)(RANDOM() * 100)) as Salt;

group_1 = group view by (Key, Salt);
group_1_count = foreach group_1 generate group_1.Key as Key, COUNT(view) as count;

group_2 = group group_1_count by Key;
final_count = foreach group_2 generate flatten(group) as Key, SUM(group_1_count.count) as count;




apache-pig