Ich verwende Hadoop, um eine sehr ungleiche Verteilung von Daten zu analysieren. Einige Schlüssel haben Tausende von Werten, aber die meisten haben nur einen Wert. Zum Beispiel würde Netzwerkverkehr, der mit IP-Adressen verknüpft ist, viele Pakete mit einigen gesprächigen IPs und nur ein paar mit den meisten IPs verbinden. Eine andere Art zu sagen ist, dass die Gini index sehr hoch ist.Gibt es in Hadoop Map-Reduce eine Klasse nach dem Sortieren und vor der Partitionierung die ganze Liste der Schlüssel?
Um dies effizient zu verarbeiten, sollte jeder Druckminderer entweder einige Tasten mit hohem Volumen oder viele Tasten mit geringem Volumen erhalten, um eine annähernd gleichmäßige Belastung zu erhalten. Ich weiß, wie ich das machen würde, wenn ich den Partitionierungsprozess schreiben würde: Ich würde die sortierte Liste der keys
(einschließlich aller doppelten Schlüssel), die von den Mappern erzeugt wurde, sowie die Anzahl der Reduzierungen N
und Put-Splits unter
split[i] = keys[floor(i*len(keys)/N)]
Reducer i
bekommen würde Schlüssel k
so dass split[i] <= k < split[i+1]
für 0 <= i < N-1
und split[i] <= k
für i == N-1
.
Ich bin bereit, meinen eigenen Partitionierer in Java zu schreiben, aber die Partitioner<KEY,VALUE> Klasse scheint nur Zugriff auf einen Schlüssel-Wert-Datensatz zu einer Zeit zu haben, nicht die ganze Liste. Ich weiß, dass Hadoop die Datensätze sortiert, die von den Mappern erstellt wurden, daher muss diese Liste irgendwo existieren. Es könnte auf mehrere Partitionierungsknoten verteilt sein, in diesem Fall würde ich die Aufteilungsprozedur für eine der Unterlisten durchführen und das Ergebnis irgendwie an alle anderen Partitionierungsknoten kommunizieren. (Angenommen, der ausgewählte Partitionerknoten sieht eine randomisierte Teilmenge, wäre das Ergebnis immer noch annähernd ausgeglichen.) Weiß jemand, wo die sortierte Schlüsselliste gespeichert ist und wie man darauf zugreift?
Ich möchte nicht zwei Map-Reduce-Jobs schreiben, einen, um die Splits zu finden, und einen anderen, um sie tatsächlich zu verwenden, weil das verschwenderisch erscheint. (Die Mapper müssten den gleichen Job zweimal machen.) Dies scheint ein allgemeines Problem zu sein: Ungleichmäßige Verteilungen sind ziemlich üblich.