HBase
 sql >> Datenbank >  >> NoSQL >> HBase

Die 6 besten MapReduce-Joboptimierungstechniken

Die Leistungsoptimierung hilft bei der Optimierung Ihres Hadoop Leistung. In diesem Blog werden wir all diese Techniken zur Optimierung von MapReduce-Jobs diskutieren.

In diesem MapReduce-Tutorial geben wir Ihnen 6 wichtige Tipps für die MapReduce-Auftragsoptimierung, z. B. die richtige Konfiguration Ihres Clusters, die Verwendung der LZO-Komprimierung, die richtige Abstimmung der Anzahl der MapReduce-Aufgaben usw.

Tipps zur MapReduce-Auftragsoptimierung

Im Folgenden finden Sie einige MapReduce-Joboptimierungstechniken, die Ihnen bei der Optimierung der MapReduce-Jobleistung helfen würden.

1. Korrekte Konfiguration Ihres Clusters

  • Mit -noatime Option DFS und MapReduce-Speicher sind bereitgestellt. Dadurch wird die Zugriffszeit deaktiviert. Dadurch wird die E/A-Leistung verbessert.
  • Vermeiden Sie RAID auf TaskTracker- und Datanode-Rechnern. Dies verringert im Allgemeinen die Leistung.
  • Stellen Sie sicher, dass Sie mapred.local.dir konfiguriert haben und dfs.data.dir auf ein Verzeichnis auf jeder Ihrer Festplatten zeigen. Dadurch wird sichergestellt, dass Ihre gesamte E/A-Kapazität verwendet wird.
  • Sie sollten das Diagramm der Swap-Nutzung und der Netzwerknutzung mit Software überwachen. Wenn Sie sehen, dass Swap verwendet wird, sollten Sie die RAM-Menge reduzieren, die jeder Aufgabe in mapred.child.java.opts zugewiesen ist .
  • Stellen Sie sicher, dass Sie den Funktionszustand Ihrer Festplattenlaufwerke intelligent überwachen sollten. Dies ist eine der wichtigsten Vorgehensweisen für  die MapReduce-Leistungsoptimierung.

2. Verwendung der LZO-Komprimierung

Für Zwischendaten ist dies immer eine gute Idee. Jeder Hadoop-Job, der eine nicht zu vernachlässigende Menge an Kartenausgaben generiert, profitiert von der Zwischendatenkomprimierung mit LZO.

Obwohl LZO der CPU etwas Overhead hinzufügt, spart es Zeit, indem es die Menge an Festplatten-IO während des Shuffle reduziert.

Legen Sie mapred.compress.map.output fest auf true setzen, um die LZO-Komprimierung zu aktivieren

3. Korrekte Abstimmung der Anzahl der MapReduce-Aufgaben

  • Wenn im MapReduce-Job jede Aufgabe 30-40 Sekunden oder länger dauert, wird die Anzahl der Aufgaben reduziert. Der Mapper  oder Reduzierer  Prozess beinhaltet folgende Dinge:Zuerst müssen Sie JVM starten (JVM in den Speicher geladen). Dann müssen Sie JVM initialisieren. Und nach der Verarbeitung (Mapper/Reducer) müssen Sie JVM deinitialisieren. Und diese JVM-Aufgaben sind sehr kostspielig. Stellen Sie sich einen Fall vor, in dem der Mapper eine Aufgabe nur 20-30 Sekunden lang ausführt. Dazu müssen wir JVM starten/initialisieren/stoppen. Dies kann eine beträchtliche Zeit in Anspruch nehmen. Es wird daher dringend empfohlen, den Task mindestens 1 Minute lang auszuführen.
  • Wenn ein Job mehr als 1 TB an Eingabe hat. Dann sollten Sie erwägen, die Blockgröße des Eingabedatensatzes auf 256 MB oder sogar 512 MB zu erhöhen. Die Anzahl der Aufgaben wird also kleiner. Sie können die Blockgröße mit dem Hadoop-Befehl distcp –Hdfs.block.size=$[256*1024*1024] /path/to/inputdata /path/to/inputdata-with-largeblocks ändern
  • Wie wir wissen, läuft jede Aufgabe mindestens 30-40 Sekunden. Sie sollten die Anzahl der Mapper-Tasks auf ein Vielfaches der Anzahl der Mapper-Slots im Cluster erhöhen.
  • Führen Sie nicht zu viele Reduzierungsaufgaben aus – für die meisten Jobs. Die Anzahl der Reduce-Aufgaben ist gleich oder etwas kleiner als die Anzahl der Reduce-Slots im Cluster.

4. Combiner zwischen Mapper und Reducer

Wenn der Algorithmus die Berechnung von Aggregaten jeglicher Art beinhaltet, sollten wir einen Combiner verwenden. Combiner führt eine gewisse Aggregation durch, bevor die Daten den Reducer erreichen.

Die Ausführung des Hadoop MapReduce-Frameworks wird intelligent kombiniert, um die auf die Festplatte zu schreibende Datenmenge zu reduzieren. Und diese Daten müssen zwischen den Berechnungsstufen Map und Reduce übertragen werden.

5. Verwendung des geeignetsten und kompaktesten beschreibbaren Typs für Daten

Big-Data-Benutzer verwenden unnötigerweise den beschreibbaren Texttyp, um von Hadoop Streaming zu Java MapReduce zu wechseln. Text kann bequem sein. Es ist ineffizient, numerische Daten in und aus UTF8-Strings zu konvertieren. Und kann tatsächlich einen erheblichen Teil der CPU-Zeit ausmachen.

6. Wiederverwendung von beschreibbaren Dateien

Viele MapReduce-Benutzer machen einen sehr häufigen Fehler, nämlich jedem Output eines Mappers/Reducers ein neues beschreibbares Objekt zuzuweisen. Nehmen wir zum Beispiel eine Word-Count-Mapper-Implementierung wie folgt an:

public void map(...) {
...
for (String word: words) {
output.collect(new Text(word), new IntWritable(1));
}

Diese Implementierung bewirkt die Zuordnung von Tausenden von kurzlebigen Objekten. Während der Java-Garbage-Collector eine vernünftige Arbeit leistet, um damit umzugehen, ist es effizienter zu schreiben:

class MyMapper ... {
Text wordText = new Text();
IntWritable one = new IntWritable(1);
public void map(...) {
... for (String word: words)
{
wordText.set(word);
output.collect(word, one); }
}
}

Schlussfolgerung

Daher gibt es verschiedene MapReduce-Auftragsoptimierungstechniken, die Ihnen bei der Optimierung von MapReduce-Aufträgen helfen. Wie die Verwendung von Combiner zwischen Mapper und Reducer, durch Verwendung der LZO-Komprimierung, richtige Abstimmung der Anzahl von MapReduce-Aufgaben, Wiederverwendung von beschreibbaren.

Wenn Sie eine andere Technik zur MapReduce-Auftragsoptimierung finden, teilen Sie uns dies im Kommentarbereich unten mit.